Кът на програмиста...

За коментари и излияния от всякакъв род, число, спрежение и залог

Moderator: Moridin

User avatar
The Dragon
Elder God
Posts: 9062
Joined: Wed Jan 14, 2004 9:03 pm

Post by The Dragon » Wed Jun 01, 2011 8:56 am

Ами не знам. Принципно археологическите артефакти принадлежат на държавата по закон. Та трябва направо да го занесеш в НИМ.

Тук наистина не е подходящо място защото е ексклузивно за софтуеър. По скоро отиди в games - там имаше тема за машините.
The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.

User avatar
Moridin
Global Moderator
Posts: 19290
Joined: Fri Dec 19, 2003 10:21 pm
Location: On the other side
Contact:

Post by Moridin » Wed Jun 01, 2011 9:18 am

хаха аз ще се опитам още по-стар да продам (доста по-стар). какви ли са ми шансовете :mrgreen:
This is it. Ground zero.

Amikae
Ascendent
Posts: 4199
Joined: Thu Aug 07, 2008 12:07 pm

Post by Amikae » Wed Jun 08, 2011 10:37 pm

Абе тука има ли някой, който пише на C++, да знам дали мога да питам нещо тъпо от време на време? :lol:

Ако не, линк към някакъв форум за програмисти също ще ми е от голяма полза. Не търся да ми се решават задачи, просто понякога забивам на някакъв фрагмент от код, който ми отнема колосално много време да разбера сам, а всъщност е нещо просто, което може да се обясни с няколко думи.

User avatar
The Dragon
Elder God
Posts: 9062
Joined: Wed Jan 14, 2004 9:03 pm

Post by The Dragon » Wed Jun 08, 2011 10:52 pm

stackoverflow
The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.

User avatar
Roamer
Ascendent
Posts: 4895
Joined: Wed Jan 03, 2007 5:25 pm
Location: Hier ist hier und jetzt ist jetzt doch jetzt ist jetzt schon nicht mehr da...
Contact:

Post by Roamer » Wed Jun 08, 2011 10:53 pm

Ми то по принцип тази тема беше създадена именно за задаване на програмистки въпроси едно време :) И, да, има известно количество хора, които сме чували за C++ - питай смело.

А иначе... за уж прости неща не знам, но напоследък едно от най-добрите места за задаване на програмистки въпроси от почти всякакъв калибър е http://stackoverflow.com/ - задаваш въпрос, няколко души ти отговарят, ти решаваш кой ти е отговорил добре, по-добре, най-добре и така.

Но и тук питай смело :)

Добавено: Я, не съм бил единственият тук, който да е чувал за Stack Overflow ;)
Eric: I use my sword to detect good on it.
Ed: It's not good, Eric. It's a gazebo.

Amikae
Ascendent
Posts: 4199
Joined: Thu Aug 07, 2008 12:07 pm

Post by Amikae » Wed Jun 08, 2011 11:13 pm

Ок, не ми се подигравайте много!!! :lol:

Ето това е условието на задачата:
Spoiler: show
Write a program to compute and print the quartiles (that is, the quarter of the numbers with the largest values, the next highest quarter, and so on) of a set of integers.
Естествено решението го вземам на готово, защото сам не успях да го напиша:
Spoiler: show
#include "stdafx.h"
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
// ask for and read the integer
cout << "Please enter the integers that are to be"
"arranged into quartiles, followed by end-of-file: ";

vector<double> values;
int x;
// invariant: values contains all of the integers read so far
while(cin >> x)
values.push_back(x);

typedef vector<double>::size_type vec_sz;
vec_sz size = values.size();

// check that the user entered more than one value, since a
// single value would cause an error
if(size < 2)
{
cout << endl << "You must enter at least two values. "
"Please try again." << endl;
return 1;
}
// sort the values
sort(values.begin(), values.end());

// find the median of the entire set of values
vec_sz mid = size/2;
double median;
median = size % 2 == 0 ? (values[mid] + values[mid - 1]) / 2
: values[mid];

// find the size of the lower and upper sets
vec_sz half_size = size % 2 == 0 ? mid : (mid % 2 == 0 ? mid - 1 : mid);

// find the midpoint of the lower and upper sets
vec_sz half_mid = half_size / 2;

// find the median of the lower set, which is the lower quartile
double lower_quartile;
lower_quartile = half_size % 2 == 0 ? (values[half_mid] + values[half_mid - 1]) / 2
: values[half_mid];

// find the median of the upper set, which is the upper quartile
vec_sz upper_mid = size % 2 == 0 ? half_size + half_mid : half_size + half_mid + 1;
double upper_quartile;
upper_quartile = half_size % 2 == 0 ? (values[upper_mid] + values[upper_mid - 1]) / 2
: values[upper_mid];

cout << "The quartiles are " << lower_quartile << ", "
<< median << ", and " << upper_quartile << endl;

return 0;
}
Примерно ето това ме обърква:
Spoiler: show
// find the median of the entire set of values
vec_sz mid = size/2;
double median;
median = size % 2 == 0 ? (values[mid] + values[mid - 1]) / 2
: values[mid];
Да речем, че съм въвел числата 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Щом size се дели на 2 без остатък, значи median взема стойността получена между ? и :, в случая с въведените числа аз получавам 4.5, програмата получава 5.5. От тук стигам до извода, че или values.begin/end добавят по някакъв празен символ в началото и в края на вектора и така общо символите са 12, или нещо аз не мога да разбера. Но никъде не пише, че .begin/end прави такова нещо, пише само, че обозначава началото и края на вектора.

Също не разбирам как програмата получава цели числа за долната и горната част на вектора. При въвеждане на посочените числа получения отговор е 3, 5.5, 8. Аз не получавам толкова.

bsb
Paragon
Posts: 640
Joined: Sun Dec 06, 2009 7:33 pm

Post by bsb » Wed Jun 08, 2011 11:30 pm

Стандартното гребло в C. Елементите в масив започват да се броят от 0. Явно същото важи и за вектори. Все пак векторът е едномерен масив :)
Намери кои са елементи с индекси 5 (mid) и 4 (mid-1) във въведените от теб числа и ще видиш, че програмата не бърка с изчисляването на медианата.

Amikae
Ascendent
Posts: 4199
Joined: Thu Aug 07, 2008 12:07 pm

Post by Amikae » Thu Jun 09, 2011 12:18 am

Така, ако се брои от 0, то наистина се получава 5.5 . Е не съм учил още за масиви, а може би трябва. Уча от една книга Accelerated C++ за сега и май прекалено бързо преминава през материала. Ще трябва да комбинирам с още нещо.

Но да се върна към задачата.

Следва

Code: Select all

// find the size of the lower and upper sets
vec_sz half_size = size % 2 == 0 ? mid : (mid % 2 == 0 ? mid - 1 : mid);

// find the midpoint of the lower and upper sets
vec_sz half_mid = half_size / 2;

// find the median of the lower set, which is the lower quartile
double lower_quartile;
lower_quartile = half_size % 2 == 0 ? (values[half_mid] + values[half_mid - 1]) / 2
: values[half_mid];

// find the median of the upper set, which is the upper quartile
vec_sz upper_mid = size % 2 == 0 ? half_size + half_mid : half_size + half_mid + 1;
double upper_quartile;
upper_quartile = half_size % 2 == 0 ? (values[upper_mid] + values[upper_mid - 1]) / 2
: values[upper_mid]; 
Как става ясно кога се пресмятат броя на елементите и кога индексите? Защото, ако броенето започва от 0 и индекс 5 е индекс на елемент 6, то защо още в началото при намирането на mid делим 10/2, а не 11/2?

User avatar
thunder
Forsaken
Posts: 3376
Joined: Wed Jan 21, 2004 2:18 pm
Location: София

Post by thunder » Thu Jun 09, 2011 10:06 am

индексите са от 0 до 9, но това все още са 10 елемента :)

делиш size на вектора на 2, 1 2 3 4 5 6 7 8 9 10 са 10 символа, така че 10/2, а не 11/2
Scalpel. Sponge. Magic Wand!

Amikae
Ascendent
Posts: 4199
Joined: Thu Aug 07, 2008 12:07 pm

Post by Amikae » Thu Jun 09, 2011 2:37 pm

Ясно това, аз просто се опитвам да го извъртя, така че да разбера сметките по-надолу. Защото half_size = mid, следователно half_mid = 2.5, следователно lower_quartile = 2.5, а upper_quartile = 7.5. А програмата смята съответно 3 и 8.

User avatar
The Dragon
Elder God
Posts: 9062
Joined: Wed Jan 14, 2004 9:03 pm

Post by The Dragon » Thu Jun 09, 2011 2:39 pm

сигурен ли си че работиш с float/double ?
The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.

Amikae
Ascendent
Posts: 4199
Joined: Thu Aug 07, 2008 12:07 pm

Post by Amikae » Thu Jun 09, 2011 2:45 pm

Ами въвеждаме цели числа, но вектора е с double.

Code: Select all

vector<double> values;
int x; 

User avatar
Ambartanen
Arcanist
Posts: 992
Joined: Mon Mar 15, 2004 6:45 pm

Post by Ambartanen » Thu Jun 09, 2011 5:28 pm

Code: Select all

typedef vector<double>::size_type vec_sz; 
vector<T>::size_type e unsigned int, съответно всичко се закръгля към най-близкия int.

Code: Select all

double lower_quartile; 
lower_quartile = half_size % 2 == 0 ? (values[half_mid] + values[half_mid - 1]) / 2 : values[half_mid]; 
half_size e 3 -> lower_quartile = values[half_mid] = values[3/2] = values[2] = 3

П.П. 3/2 = 2, понеже half_mid също е unsigned int и се закръгля.

Amikae
Ascendent
Posts: 4199
Joined: Thu Aug 07, 2008 12:07 pm

Post by Amikae » Thu Jun 09, 2011 5:42 pm

Сега вече разбирам. Благодаря! :)

Обаче half_size няма как да е 3, защо 3? half_size = mid = 5.

User avatar
Ambartanen
Arcanist
Posts: 992
Joined: Mon Mar 15, 2004 6:45 pm

Post by Ambartanen » Thu Jun 09, 2011 5:54 pm

Да, пет е, моя грешка.

Who is online

Users browsing this forum: No registered users and 2 guests