Една задачка на C++ да ми кажете къде бъркам в кода :)
Автор |
|
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;" след инклъдинга в началото. Няма отношение към въпроса, ама не е лошо да се знае. | | 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++ не е език с който съм се занимавал. Но с няколко опита разбираш какво и как трябва да се получи. | | Коментар |