Премини към съдържанието

Препоръчан отговор


Въвеждам клиент с номер.Когато някой клиент закупи нещо записва стойността на покупката в елемент на масив съответно № на клиента.В края на работния ден програмата трябва да изведе отчет съдържащ № на всеки потребител и сумата от направените на него покупки.Общата сума на всички продажби и средната им стойност.

 

Нещо съм го омотал доста и ми се получават някакви огромни нереални числа. Как да си добавя средната и общата стойност ?!

#include <iostream>using namespace std;int main(){int m[50], n, i;int den;int sum=0;start:;cout<<"Nomer na klient (0-50) :";cin>>n;cout<<"Pokupki na stoinost: ";cin>>i;m[n]=0;m[n]=m[n]+i;cout<<"Za priklu4vane na denq 0, za nov klient 1: ";cin>>den;		   switch (den)		   {					   case 1: goto start; break;					   case 0: {n=0;						    while(m[n]>0){									 cout<<m[n]<<endl;									 n=n+1;}} break;				    				   }           for(int i = 0; i < 50; i++)    {        cout << m[n] << " ";        sum += m[n];}           cout << "nSum: " << sum;   system("pause");return 0;      }

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравейте, Ще приложа допълненията си директно върху кода Ви. Надявам се това няма да бъде проблем за Вас:

#include <iostream>using namespace std;int main(){int m[50], n, i;int den;int sum=0;//Зануляваме масива !for (i  = 0; i < 50; i++) {     m[i] = 0;}start:;cout<<"Nomer na klient (0-50) :";cin>>n;cout<<"Pokupki na stoinost: ";cin>>i;m[n]=0;m[n]=m[n]+i;cout<<"Za priklu4vane na denq 0, za nov klient 1: ";cin>>den;           switch (den)           {                       case 1: goto start; break;                       case 0: {n=0;                            while(m[n]>0){                                     cout<<m[n]<<endl;                                     n=n+1;}} break;                                       }           for(int i = 0; i < 50; i++)    {        cout << m[i] << " "; // Тук трябва да е i, а не n        sum += m[i];} // Тук трябва да е i, а не n           cout << "nSum: " << sum;   system("pause");return 0;      }

и средната им стойност.

Това средна стойност на отделните покупки ли е или е средна стойност на сумата от стойността на покупките, групирани по хора.Т.е. ако имаме, че 1-вия клиент има 2 покупки за 2лв. и 4лв, и 4-тия клиент има покупки за 5лв, 6лв и 8 лв.:Първия вариант ще е (2 + 4 + 5 + 6 + 8) / 5  (сумата на всички покупки/броя на всички отделни покупки) = 5Втория вариант ще е 2 + 4 / 2 = 3 (ср. стойност на покупка за 1-вия клиент) , 5 + 6 + 8/ 3 = 6.3(3) (ср. стойност на покупка за 2-рия клиент)=> 3 + 6.3(3) / 2 (сумата от средните стойности на клиентите / броя клиенти) = 4.16(6) P.S. Във всички досега изчетени книги за програмиране на C/C++ и Java, goto оператора изрично препоръчват да не бъде използван в програмите, особено за такива, в които може много лесно да бъде избегнат. Програмата ще се компилира и ще си работи, но поддръжката и разширяването на логиката и ще е един малък кошмар за този, който трябва да го прави. Много често това не е автора на оригиналната версия и съответно човека се вижда в малко чудо. Лично досега goto не се е налагало да ползвам, независимо с каква логика съм си имал вземане-даване. Въпрос на избор е в случая ... Поздрави !

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Олеле! goto в C++ код! и то за да замести while?. Моля ти се... Раничко ми е за инфаркт още...разкарай goto-то - за директна двойка е тоя код. ползвай do-while цикълцикъла с който извеждаш клиентите е мноооооого грешен. Първо никъде не инициализираш на 0 целия масив. Ако въвежда 5 произволни номера на клиенти и приключа деня, може да печата разни чисълца до второ пришествие, разбирай докато в паметта срещне 0 или на операционната система и писне да четеш чужда памет и ти убие приложението. и обратно, ако въведа 10 произволни номера на клиенти и някоя невъведена стойност случайно е 0, няма да отпечата останалите. (това важи и за редакцията на soundtracker)Реши поредни ли ще са клиентите или не. Ако не - Инициализирай масива с 0. Направи while цикъла за печат да излиза при при 50, а печатай само полетата по-големи от 0.Така ще ти работи и сумата. Ако преброиш и ненулевите стойности и я разделиш на тях - ето ти и средното.А колко по-просто ще е ако са поредни клиентите...

Редактирано от flare (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Мисля, че е вторият вариант.

Здравейте, Ще приложа допълненията си директно върху кода Ви. Надявам се това няма да бъде проблем за Вас:

#include <iostream>using namespace std;int main(){int m[50], n, i;int den;int sum=0;//Зануляваме масива !for (i  = 0; i < 50; i++) {     m[i] = 0;}start:;cout<<"Nomer na klient (0-50) :";cin>>n;cout<<"Pokupki na stoinost: ";cin>>i;m[n]=0;m[n]=m[n]+i;cout<<"Za priklu4vane na denq 0, za nov klient 1: ";cin>>den;           switch (den)           {                       case 1: goto start; break;                       case 0: {n=0;                            while(m[n]>0){                                     cout<<m[n]<<endl;                                     n=n+1;}} break;                                       }           for(int i = 0; i < 50; i++)    {        cout << m[i] << " "; // Тук трябва да е i, а не n        sum += m[i];} // Тук трябва да е i, а не n           cout << "nSum: " << sum;   system("pause");return 0;      }

Това средна стойност на отделните покупки ли е или е средна стойност на сумата от стойността на покупките, групирани по хора.Т.е. ако имаме, че 1-вия клиент има 2 покупки за 2лв. и 4лв, и 4-тия клиент има покупки за 5лв, 6лв и 8 лв.:Първия вариант ще е (2 + 4 + 5 + 6 + 8) / 5  (сумата на всички покупки/броя на всички отделни покупки) = 5Втория вариант ще е 2 + 4 / 2 = 3 (ср. стойност на покупка за 1-вия клиент) , 5 + 6 + 8/ 3 = 6.3(3) (ср. стойност на покупка за 2-рия клиент)=> 3 + 6.3(3) / 2 (сумата от средните стойности на клиентите / броя клиенти) = 4.16(6) P.S. Във всички досега изчетени книги за програмиране на C/C++ и Java, goto оператора изрично препоръчват да не бъде използван в програмите, особено за такива, в които може много лесно да бъде избегнат. Програмата ще се компилира и ще си работи, но поддръжката и разширяването на логиката и ще е един малък кошмар за този, който трябва да го прави. Много често това не е автора на оригиналната версия и съответно човека се вижда в малко чудо. Лично досега goto не се е налагало да ползвам, независимо с каква логика съм си имал вземане-даване. Въпрос на избор е в случая ... Поздрави !

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Олеле! goto в C++ код! и то за да замести while?. Моля ти се... Раничко ми е за инфаркт още...

Особено в късните часове на работния ден  :D .

m[n]=0;

Тука вече аз съм за бой ! Това го бях махнал при мен и явно докато съм редактирал цитата съм го пропуснал ... 

 

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

 

Ще приложа и пример за средната стойност, която колегата уточни в последния си пост. Кода ще приложа като edit към този коментар, да не раздувам темата и без това ...

 

Поздрави и умната @flare - не позволявай на goto да взема нова жертва ;)


  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

...

Офтопик. :) Само уточнявам - поста ми - като изключим изречението в скобите, което добавих по-късно, не се отнася за теб. Аз го пишех докато и ти - и си ме изпреварил без да видя :) А иначе, т'ва че не си махнал goto-то голяма работа - ама си писал, че не е хубаво да се ползва, нали?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ще съм доста благодарен :)

Особено в късните часове на работния ден  :D .

Тука вече аз съм за бой ! Това го бях махнал при мен и явно докато съм редактирал цитата съм го пропуснал ... 

 

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

 

Ще приложа и пример за средната стойност, която колегата уточни в последния си пост. Кода ще приложа като edit към този коментар, да не раздувам темата и без това ...

 

Поздрави и умната @flare - не позволявай на goto да взема нова жертва ;)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Прилагам примерна реализация на това нещо - без goto !

 

Съвета ми, както и всеки път досега е това да се ползва просто като образец и Вие да си напишете Ваш вариант.

 

Не давам гаранция, че всичко е bulletproof, но поне има някаква валидация на входа. Можете допълнително да си поиграете с <iomanip> библиотеката и да форматирате report-а доста по-красиво и спретнато :)

#include <iostream>#define MAX 50using namespace std;int main(){	float m[MAX], purchase;	int n, den, total_purchases = 0, purchases_count[MAX];	float sum=0, mean_value_purchase = 0;	int nonzero_clients = 0;	for (int i = 0; i < MAX; i++) {		 m[i] = 0;		 purchases_count[i] = 0;	}	do {		cout<<"Enter 0 for End Of Day Report and 1 for new purchase: ";		cin>>den;		if (den == 1) {			do {				cout<<"Client Number:  (0-" << MAX-1 << ") :";				cin>>n;				if (n < 0 || n >= 50) {					cout << "Please, enter valid user from 0 to " << MAX - 1 << " !n";				}			} while (n < 0 || n >= 50);			do {				cout<<"Purchase value: ";				cin>>purchase;				if (purchase < 0) {					cout << "Please, enter valid price for purchase!n";				}			} while (purchase < 0);			m[n] += purchase;			purchases_count[n]++;		} else if (!den) {			break;		}	} while (den != 1 || den != 0);	cout << "nnBEGIN 'END OF DAY REPORT' n";	for (int i = 0; i < MAX; i++) {		if (m[i]) {			cout << "Client No: " << i << " : " << m[i] << endl;			sum += m[i];			nonzero_clients++;			mean_value_purchase += m[i] / purchases_count[i];			total_purchases += purchases_count[i];		}	}	if (sum) {		cout << "TOTAL: " << sum << endl;	}	if (mean_value_purchase) {		cout << "Mean value of purchase (grouped by clients): " << (float)(mean_value_purchase/nonzero_clients) << endl;	}	if (sum) {		cout << "Mean value of purchase (no client grouping): " << (float)(sum/total_purchases) << endl;	}	if (sum) {		cout << "Mean value of spent money on purchases for client : " << (float)(sum/nonzero_clients) << endl;	}		cout << "END OF 'END OF DAY REPORT': nn";	system("pause");	return 0;    }

Поздрави !

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
		} else if (!den) {			break;		}	} while (den != 1 || den != 0);

a) защо прекъсваш с if и brake, като по-подходящо условие в while, ще свърши работа?

б) Като става въпрос за while, с условието (den != 1 || den != 0) изби рибата, честно :D.

Извод: не пишете код по тъмно!

	    }	} while (den != 1);
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

a) защо прекъсваш с if и brake, като по-подходящо условие в while, ще свърши работа?

б) Като става въпрос за while, с условието (den != 1 || den != 0) изби рибата, честно :D.

Извод: не пишете код по тъмно!

	    }	} while (den != 1);

Това го писах с оглед да дефинирам в началото терминиращите състояния на do/while цикъла. След това градих и if/else-if конструкцията. Сега, мога да поспоря, че кода практически си върви - разбира се, приемам и забележката, че съм проспал тая дебилност, която откри :D - наистина логиката за 0-лата е практически терминиращо състояние, но с оглед на това, че външния ми цикъл работи като дефиниционно множество от позволените команди, можем да го преглътнем (надявам се де :) ). 

 

Мерси за забележката - нека автора, по свое усмотрение, да коригира кода си с по-оптимизирания вариант ;)

 

P.S. Всъщност, колега - мисля, че тук малко сме се подвели и двамата. Чисто логически, проверката за den != 1 само, означава, че цикъла ще се изпълни и при въвеждане на 0-ла. Това означава, че реално объркваме командите с които да въвеждаме нова покупка и дали да извеждаме отчета. Т.е. терминиращото състояние трябва да е :

} while (!den);

Това обаче само по себе си води до случая, че при въвеждане на den != 0, (1, 2, -90, 501, 42), метода ще се държи по същия начин, все едно въвеждаме 1. И понеже имаме две валидни състояния (0 или 1), проверката в while-а я бях оставил по този начин :).

Принципно, това има начин да се избегне, ако ползваме while, вместо do/while, но тогава пък се пораждаха проблеми със дублирания на запитвания извън и в while цикъла (шантава работа ...).

 

Надявам се, че "сутринта е по-мъдра от вечерта", но е възможно отново да "проспивам нещо" :).

 

Поздрави !

Редактирано от soundtracker (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

P.S. Всъщност, колега - мисля, че тук малко сме се подвели и двамата.

Сетих се малко по-късно, какви съм ги написал и аз и ама вече бях полузаспал :)Както казах, този раздел трябва да се заключва автоматично след 22:00. Че не е истина какви неща правим :) Редактирано от flare (преглед на промените)
  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.