Page 69 of 79

Posted: Wed Jun 01, 2011 8:56 am
by The Dragon
Ами не знам. Принципно археологическите артефакти принадлежат на държавата по закон. Та трябва направо да го занесеш в НИМ.

Тук наистина не е подходящо място защото е ексклузивно за софтуеър. По скоро отиди в games - там имаше тема за машините.

Posted: Wed Jun 01, 2011 9:18 am
by Moridin
хаха аз ще се опитам още по-стар да продам (доста по-стар). какви ли са ми шансовете :mrgreen:

Posted: Wed Jun 08, 2011 10:37 pm
by Amikae
Абе тука има ли някой, който пише на C++, да знам дали мога да питам нещо тъпо от време на време? :lol:

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

Posted: Wed Jun 08, 2011 10:52 pm
by The Dragon
stackoverflow

Posted: Wed Jun 08, 2011 10:53 pm
by Roamer
Ми то по принцип тази тема беше създадена именно за задаване на програмистки въпроси едно време :) И, да, има известно количество хора, които сме чували за C++ - питай смело.

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

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

Добавено: Я, не съм бил единственият тук, който да е чувал за Stack Overflow ;)

Posted: Wed Jun 08, 2011 11:13 pm
by Amikae
Ок, не ми се подигравайте много!!! :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. Аз не получавам толкова.

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

Posted: Thu Jun 09, 2011 12:18 am
by Amikae
Така, ако се брои от 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?

Posted: Thu Jun 09, 2011 10:06 am
by thunder
индексите са от 0 до 9, но това все още са 10 елемента :)

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

Posted: Thu Jun 09, 2011 2:37 pm
by Amikae
Ясно това, аз просто се опитвам да го извъртя, така че да разбера сметките по-надолу. Защото half_size = mid, следователно half_mid = 2.5, следователно lower_quartile = 2.5, а upper_quartile = 7.5. А програмата смята съответно 3 и 8.

Posted: Thu Jun 09, 2011 2:39 pm
by The Dragon
сигурен ли си че работиш с float/double ?

Posted: Thu Jun 09, 2011 2:45 pm
by Amikae
Ами въвеждаме цели числа, но вектора е с double.

Code: Select all

vector<double> values;
int x; 

Posted: Thu Jun 09, 2011 5:28 pm
by Ambartanen

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 и се закръгля.

Posted: Thu Jun 09, 2011 5:42 pm
by Amikae
Сега вече разбирам. Благодаря! :)

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

Posted: Thu Jun 09, 2011 5:54 pm
by Ambartanen
Да, пет е, моя грешка.