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
				хаха аз ще се опитам още по-стар да продам (доста по-стар). какви ли са ми шансовете  

 
			
					
				
				Posted: Wed Jun 08, 2011 10:37 pm
				by Amikae
				Абе тука има ли някой, който пише на C++, да знам дали мога да питам нещо тъпо от време на време?  
 
Ако не, линк към някакъв форум за програмисти също ще ми е от голяма полза. Не търся да ми се решават задачи, просто понякога забивам на някакъв фрагмент от код, който ми отнема колосално много време да разбера сам, а всъщност е нещо просто, което може да се обясни с няколко думи.
 
			
					
				
				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
				Ок, не ми се подигравайте много!!!  
 
 
Ето това е условието на задачата:
- 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.
 
			
					
				
				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
				Да, пет е, моя грешка.