download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Една задачка на C++ да ми кажете къде бъркам в кода :)

< 1 2 3 4 5 6 7 8 9 >

Автор
Съобщение
anonymous
Съб, 12.12.09, 15:25
Задачката която сам си измислех е да се въведат даните на 20 ученика примерно казано , обаче искам да си го направя да има защита да връща обратно на оценката която е въведена грешно ама нещо не ми се получава .
Вижте кода :
#include <iostream.h>
void main ()
 
{
 
	double ocenki[30] , max_ocenka , sr_cenka;
 
	int i ;
 
//vyvejdane na ocenkite ot klaviaturata 
 
//ako go sloja tuka vryshta ot nachalo logichno koeto e 
ss: 
	
	for (i=0 ; i<30 ; i++ ) 
{
	cout<<"Ocenka nomer "<<i+1<<" e : ";
 
//- ako sloja "ss"	tuka preskacha ocenka koeto e pak logi4no
	cin>>ocenki[i];
 
// - tuka mi zaciklq ako go sloja i taka 
	 
	if (ocenki[i] >6 || ocenki[i]<2) 
	 {cout<<"BAD input"<<endl;
	 goto ss ;
	
	}
 
}}

Някой сеща ли се за начин как може да се направи тази защита .
Аз от скоро се уча да програмирам на C++ и не съм измислил още :) ще се радвам някой да покаже :)

phrozencrew
Съб, 12.12.09, 22:43
Мисля, че това ще ти свърши работа:
#include <iostream>
using namespace std;
 
int main(){
	float sr_ocenka;
	int i, conc, ocenki[5], ocenka, obshto, max_ocenka;
	max_ocenka = 0;
	obshto = 0;
 
	for (i=0 ; i<5 ; i++ ){
		conc = i+1;
		cout << "Ocenka nomer "<< conc <<" e : ";
		ss:
		cin >> ocenka;
		if ((ocenka>6) || (ocenka<2)){
		   cout << "Molia vyvejdaite adekvatni ocenki!"<<endl;
		   goto ss;
		}
		if (max_ocenka < ocenka) max_ocenka = ocenka;
		obshto += ocenka;
		ocenki[i] = ocenka;
	}
	sr_ocenka=obshto/5.0;
	cout << "Sredna ocenka : "<<sr_ocenka<<endl;
	cout << "Maximalna ocenka : "<<max_ocenka<<endl;
}

Все пак аз не бих ползвал оператора goto, защото крие много големи опасности. Но когато знаеш какво прави goto е много бърз начин за писане. Особено в случая.
Бих ти препоръчал да прочетеш как се използва цикъла wheel ... do (или do ... wheel) в комбинация с четене от клавиатурата. Така ще спестиш много време за писане на глупости. Ако не намериш нищо за комбинацията ще ти измисля някой кода, който да съкрати наполовина редовете на горната програма. Но по-добре да се справиш сам.

anonymous
Нед, 13.12.09, 23:42
Мерси много :) Свърши ми работа :)
kookki
Съб, 23.01.10, 21:30
Недялко, така става ли да се избегне goto? Или не ?
#include "stdafx.h"
#include <iostream.h>
 
 
int main(int argc, char* argv[])
{
	
	int i, o[5], min=7;
	for (i=0;i<5;i++)
	{
		int a=i+1;
		cout<<"Vavedete ocenca nomer "<<a<<'n';
		cin>>o[i];
		while ((o[i]<2)||(o[i]>6)){
				cout<<"Vavedete stoinost ot 2 do 6n";
				cout<<"Vavedete ocenca nomer "<<a<<'n';
				cin>>o[i];
		};
			if (min>o[i])min=o[i];
	};
	cout<<"Nai-niskata ocenka e :"<<min<<'n';
	return 0;
}

Нещо неще да изпише в поста наклонената черта пред 'n' -за новия ред , не че съм я пропусна

редактиран от kookki на 23.01.10 21:33
редактиран от kookki на 23.01.10 21:38
редактиран от kookki на 23.01.10 21:42
кака.лара
Съб, 23.01.10, 22:10

RE: Една задачка на C++ да ми кажете къде бъркам в кода :)

” Нещо неще да изпише в поста наклонената черта пред 'n' -за новия ред , не че съм я пропусна „
Ръгай още черти докато зацепи. Нещо помня, не знам точно от нашия форем ли беше ама в някакъв случай стана да се набодат 7 черти та да стане двойна.

Приличните хора му слагат по едно "using namespace std;" след инклъдинга в началото. Няма отношение към въпроса, ама не е лошо да се знае.

редактиран от кака.лара на 23.01.10 22:30
phrozencrew
Съб, 23.01.10, 22:21
kookki, ще ти обърна внимание на няколко неща. Вече не се изписват .h разширенията, stdafx е нестадартен вариант, а в случая няма нужда от него. Още повече, че не се разпознава от популярните компилатори, освен от някои M$ (май след версия 6 на VC/C++). За да ползваш << и >> добави клаузата using namespace std;, иначе пак кода е някакъв, писан само за един компилатор. Разбира се не знам с какво компилираш, но това, което ти казвам, помня, че беше стадарт от ANSI C/C++. От тоя ред няма нужда: cout<<"Vavedete ocenca nomer "<<a<<'n'; . Това трябва и може да се прави автоматично от програмата.
Новия ред "\n" важи само когато е поставен в двойни кавички. В случая грешката с липсващата ляво наклонена черта "\" не е твоя. Няколко пъти мрънках да я оправят при писане на сорс-код, но явно им се струва голямо страшилище тоя проблем (наистина си е страшничък) и предпочитат да залагат на сигурно. За това там където слагаш една черта "\" за да се разпознава слагай две "\\" - при промяна на мнението също се получава strip slashes, така, че пак оглеждай кода.
Аз бих написал тоя код с функция, вместо goto. Ако ми остане утре малко време ще цъкна някой мой вариант.
dreamskill
Съб, 23.01.10, 22:47
Нед, знам че въпроса е много личен, но ще те питам все пак. Абе пич, ти колко езика знаеш? Луд си в добрия смисъл.
anonymous
Нед, 24.01.10, 14:33

RE: Една задачка на C++ да ми кажете къде бъркам в кода :)

” Нед, знам че въпроса е много личен, но ще те питам все пак. Абе пич, ти колко езика знаеш? Луд си в добрия смисъл. „
Колкото и паяка
kookki
Нед, 24.01.10, 15:06
Фрозен , пиша с MS Visual C++ 6-та версия ,защото нея ползваме в университета и затова слагам това " .h " иначе дава грешка. А на тази версия '\n' работи и с единични кавички. Знам че е остаряла весията, но още не се чувствам уверен да премина нататък. Нека да се поизуча малко ,за сега още не знам коя библиотека какво поддъжа и от там ми куцат хедарите , но това ще го изчистя с времето предполагам.
phrozencrew
Нед, 24.01.10, 18:17
Предположих, че използваш M$ Visual. Тая среда, колкото ти дава, толкова и ти отнема. Аз лично не я харесвам, но пък това е най-популярната среда за писане на приложения за Win.
За дребните нужди, когато съм имал нужда от скорост, определено писането на C/C++ може доста да ускори готово приложение. Макар, че самото писане е много и е трудно да го сравниш с Perl/PHP да речем, където разглежданата задача става на 4-5 реда.
В момента имам инсталиран DEV-C++ 4.9.9.2, който ползва компилаторът gcc 3.4.2 за Win (mingw). Тези среди за разработка са Open Source и мултиплатформени. Което означава, че код компилиран под Windows ще може да се компилира и под Linux/Unix/Mac etc.
Ето един вариант и без goto, като използвам допълнителната функция за проверка на въведената стойност. Проверката се прави с малка рекурсия, ако стойността не отговаря.
#include <iostream>
using namespace std;
 
int main(){
	float sr_ocenka;
	int i, conc, ocenki[5], stoinost, ocenka, obshto, max_ocenka;
	int proverka(int, int);
	max_ocenka = 0;
	obshto = 0;
 
	for (i=0 ; i<5 ; i++ ){
		conc = i+1;
		cout << "Ocenka nomer "<< conc <<" e : ";
		cin >> stoinost;
		ocenka = proverka(stoinost, conc);
		if (max_ocenka < ocenka) max_ocenka = ocenka;
		obshto += ocenka;
		ocenki[i] = ocenka;
	}
	sr_ocenka=obshto/5.0;
	cout << "Sredna ocenka : "<<sr_ocenka<<"\n";
	cout << "Maximalna ocenka : "<<max_ocenka<<"\n";
}
 
int proverka(int x, int y){
		if ((x<2) or (x>6)){
			cout << "Molia vyvejdaite adekvatni ocenki! \n";
			cout << "Ocenka nomer "<< y <<" e : ";
			cin >> x;
			return proverka(x, y);
		}
		else {
			return x;
		}
}

По принцип кода за проверките обикновено е много повече от самото функционално програмиране. Е най-вече зависи и кой ще ползва програмата. В този случай могат да се добавят проверка, дали стойността е int или не. Ако този код се компилира и се стартира и при запитване за стойността се въведе char, тогава ще се получи бъг и програмата ще влезе в безкраен цикъл.
ПС: Едиз, когато схванеш логиката на един език за програмиране, започваш да разбираш лесно и другите езици. Аз съм лаик и любител и C++ не е език с който съм се занимавал. Но с няколко опита разбираш какво и как трябва да се получи.

< 1 2 3 4 5 6 7 8 9 >

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.