| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Структуры |
| Автор: nastya25 24.4.2015, 12:34 |
| Здравствуйте. Помогите понять, в чем ошибка. Программа не выводит нормально средний бал каждого студента по трем предметам и общий средний бал группы. #include <stdlib.h> #include <iostream.h> /*STRUCTURE*/ struct Shop { char Name[30]; int Number; int exam[5]; char Work[5]; char Study[3]; double Sr_ball; float Sr; }; void ShowData(Shop *M,int N) { system("CLS"); double h; double *avg=new double[N]; cout<<"Name | Number| exam | Work | Study| Sr_ball"<<"\n"; for (int i=0;i<N;i++) { cout<<M[i].Name; cout<<" |"; cout<<M[i].Number; cout<<" |"; cout<<M[i].exam[0]<<" "<<M[i].exam[1]<<" "<<M[i].exam[2]<<" "<<M[i].exam[3]<<" "<<M[i].exam[4]; cout<<" |"; cout<<M[i].Work; cout<<" | "; cout<<M[i].Study<<" | "; for (int i=0; i<5; i++) { h=0.; avg[i]=0; for (int t=0; t<5; t++) { h+=M[i].exam[t]; avg[i]=h/5; } cout<<avg[i]; } cout<<"\n"; } for (int l=0; l<N; l++) { if ((avg[l]>=2) && (avg[l]>=2) && (avg[l]<3)) cout<<"Imeut 2 po examenam: "<<M[i].Name<<" "; if ((avg[l]>=3) && (avg[l]<4)) cout<<"\n Imeut 3 po examenam: "<<M[i].Name<<" "; // else cout<<"-"; if ((avg[l]>=4) && (avg[l]<5)) cout<<"\n Imeut 4 po examenam: "<<M[i].Name<<" "; if (avg[l]>=5) cout<<"\nImeut 5 po examenam: "<<M[i].Name<<" "; } cout<<"\n"; double SR=0; int k=0; for(int j=0;j<N;j++) { k+=avg[j]; SR= avg[j]/N; } cout<<"Srednii ball gruppi: "<<SR<<"\n"; } /*Zanisit dannie v structure*/ void GetData(Shop *M,int N) { cin.ignore(); for (int i=0;i<N;i++) { cout<<"n"; cout<<"Name: ";cin.getline(M[i].Name,30); cout<<"Number: "; cin>>M[i].Number; cin.ignore(); cout<<"exam: "; cin>>M[i].exam[0];cin.ignore(); cin>>M[i].exam[1];cin.ignore(); cin>>M[i].exam[2];cin.ignore(); cin>>M[i].exam[3];cin.ignore(); cin>>M[i].exam[4];cin.ignore(); cout<<"Work: ";cin.getline(M[i].Work,5); cout<<"Study: ";cin.getline(M[i].Study,5); } } void main() { system("CLS"); int N; cout<<"Enter N: ";cin>>N; Shop *M=new Shop[N]; //Динамическое выделение памяти под N структур GetData(M,N); //Занесение данных в структуры ShowData(M,N); delete []M; //Освобождение памяти system("PAUSE"); } |
| Автор: rudolfninja 24.4.2015, 12:55 |
| Здравствуйте. Что-то очень странное у вас тут просиходит. Я бы посоветовал вам средний бал студнета считать в методе void GetData(Shop *M,int N) после того, как вы установили все оценки. Тогда в методе ShowData вам надо будет всего лишь вывести на экран значение Sr_ball для каждого элемента входного массива. Для вывода среднего балла группы просуммируйте средние балы каждого студента и разделите на количество студентов в группе. Еще пару замечаний по коду: переименуйте структуру, а то она называется Shop, а хранит данные про студента. В методе void ShowData(Shop *M,int N) вы выделяете память под avg, но не освобождаете ее и получается утечка. |
| Автор: nastya25 24.4.2015, 22:05 |
| Да, прошу прощения. Предметов 5, а не 3. Я исправила и делаю вывод студентов, которые учатся только на "отлично", на "хорошо" и "отлично", у которых есть одна тройка и студентов с двойками, но результат не совсем верен...( #include <stdlib.h> #include <iostream.h> /*STRUCTURE*/ struct Student { char Name[30]; int Number; int exam[5]; char Work[5]; char Study[3]; //double Sr_ball; // float Sr; }; void ShowData(Student *M,int N) { system("CLS"); cout<<"Name | Number| exam | Work | Study"<<"\n"; cout<<"__________________________________________________________\n"; for (int i=0;i<N;i++) { cout<<M[i].Name; cout<<" |"; cout<<M[i].Number; cout<<" |"; cout<<M[i].exam[0]<<" "<<M[i].exam[1]<<" "<<M[i].exam[2]<<" "<<M[i].exam[3]<<" "<<M[i].exam[4]; cout<<" |"; cout<<M[i].Work; cout<<" | "; cout<<M[i].Study<<" | "; cout<<"\n"; } } void Sr_ball(Student *M,int N ) { double h=0; double *avg=new double[N]; for (int i=0; i<N; i++) { h=0; for (int t=0; t<5; t++) { h+=M[i].exam[t]; // avg[i]=h/5; } avg[i]=h/5; cout<<"\n Sred: "<<avg[i]; } } void Sh(Student *M,int N) { int k=0; int t=0; int d=0; for (int i=0; i<N; i++) { for (int j=0; j<5; j++) { if (M[i].exam[j]==5) { k=k+1; if (k==5) cout<<"\nOtlichniki: "<<M[k].Name; break; } if (M[i].exam[j]==3) { t=t+1; if (t==1) cout<<"\nStudent s troikami: "<<M[t].Name; break; } if (M[i].exam[j]==2) { d=d+1; if (d>=1) cout<<"\nStudent s dvoikami: "<<M[d].Name; break; } if (M[i].exam[j]==4 || M[i].exam[j]==5 || M[i].exam[j]!=2 || M[i].exam[j]!=3) { cout<<"\nXoroshisti: "<<M[i].Name; } break;} //else cout<<" "; } } void SRR(Student *M,int N) { double *avg=new double[N]; double SR=0; for(int j=0;j<N;j++) { int k=0; k+=avg[j]; } SR= avg[j]/N; cout<<"\nSrednii ball gruppi: "<<SR<<"\n"; } /*Zanisit dannie v structure*/ void GetData(Student *M,int N) { cin.ignore(); for (int i=0;i<N;i++) { cout<<"n"; cout<<"Name: ";cin.getline(M[i].Name,30); cout<<"Number: "; cin>>M[i].Number; cin.ignore(); cout<<"exam: "; cin>>M[i].exam[0];cin.ignore(); cin>>M[i].exam[1];cin.ignore(); cin>>M[i].exam[2];cin.ignore(); cin>>M[i].exam[3];cin.ignore(); cin>>M[i].exam[4];cin.ignore(); cout<<"Work: ";cin.getline(M[i].Work,5); cout<<"Study: ";cin.getline(M[i].Study,5); } } void main() { system("CLS"); int N; cout<<"Enter N: ";cin>>N; Student *M=new Student[N]; //Динамическое выделение памяти под N структур GetData(M,N); //Занесение данных в структуры ShowData(M,N); Sr_ball(M,N); SRR(M,N); Sh(M,N); delete []M; //Освобождение памяти system("PAUSE"); } |
| Автор: rudolfninja 24.4.2015, 22:22 |
| Настя, ваш код очень трудно читать. Пожалуйста, отформатируйте его и используйте тег для подсветки кода. Расскажите, вообще, как звучит полное задание? Давайте попробуем вместе написать его заново? |
| Автор: nastya25 24.4.2015, 23:25 | ||
Извиняюсь. Нужно обработать результаты сессии. в переменной exam хранятся оценки за сессию каждого студента. В процедуре Sh выводятся фамилии студентов, которые сдали сессию на "отлично", на "хорошо" и "отлично", имеют одну тройку и имеют двойки. Я это пытаюсь сделать..но результаты немного неоднозначны..
|
| Автор: rudolfninja 25.4.2015, 00:22 | ||
| Вы как-то странно считаете средний балл. Почему бы не считать средний балл в функции, где вы вводите данные?
После этого у вас будет храниться средний балл в объекте вашей структуры. Отличники - те, у кого средний бал равен 5. Отличники и хорошисты - больше 4, но меньше 5. Ну тройки и двойки тоже просто найти. |
| Автор: nastya25 25.4.2015, 00:29 |
| Если у человека по 4-м предметам стоит оценка "5", а по одному -"3", то средний балл за 5 экзаменов - 4.6 , но не хорошист.. Поэтому я решила считать , исходя из оценок. |
| Автор: rudolfninja 25.4.2015, 01:44 | ||
| Да, все верно. Тогда, примерно так будет:
Вот. Я не уверен, но должно сработать. Код не проверял, писал сразу тут, но логика правильная должна быть. Поскольку на часах без пятнадцати два ночи, то могут присутствовать некоторые ошибки. Если таковые есть - приношу извинения. |
| Автор: feodorv 25.4.2015, 06:52 | ||||||||||||||
Просто надо все правильно сделать. У Вс есть цикл по студентам, в него вложен цикл по оценкам:
Здесь мы видим неуместную инициализацию переменных. Они должны быть инициализированы (нулями) перед циклом по оценкам, а не внутри него. Идея с подсчетом оценок мне нравиться, только реализована она неверно:
Как видите, принятие решения о статусе студента происходит по окончании цикла по ошибкам, а не внутри него!!!
Эти условия безумны:
Эти условия выполняются при любом значении M[i].exam[j], смысла в этом мало. Это проигнорировано всеми:
Именно поэтому в таких выражениях лучше использовать оператор sizeof:
Меньше головной боли, однозначно. |