Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

     

d_georgieva

структури в с++

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


Имам следната задача: Да се въведат данните за студентите от една група:име номер и успех. Да се изведе броят на тези от тях които имат слаби оценки / под 3/. Ето и решението.

 # include <iostream.h>

struct student

{int number;

 char name[30];

 double mark;};

 int main ()

 {student a[60];

 int n;

 cout<<"n=";

 cin>>n;

 for (int i=0;i<=n-1;i++)

 {	cout<<"Name=";

 cin.getline (a[i].name,30);

 cout<<"Number=";

 cin>>a[i].number;

 cout<<"Mark=";

 cin>>a[i].mark;

}		  

 int br=0;

 for (int i=0;i<=n-1;i++)

 {if (a[i].mark<3.0) br++;

  cout<<"\n br="<<br<<endl;

  system ("pause");

 return 0; }

Проблема е че когато почна да въвеждам имената на студентите нещо не се получава. Ако някой има представа защо дава тази грешка при самото въвеждане /тествайте и вижте за какво става въпрос/ ще съм му много благодарна.

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


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

Здравей!

Първо по същество, после коментари.

Проблемът в последователното четене със cin >> n; и след това cin.getline (a.name,30); се състои в принципната работа на cin >> и cin.getline. Cin >> чете от stdin (конзолния буфер), докато не срещне нов ред (Enter), по този начин, когато когато те попита за

n=
и въведеш
15(Enter)
в буфера остава символа за нов ред ('\n'). Всъщност остава всичко въведено след числото. getline() също чете, докато не срещне нов ред, но този символ ('\n') вече е в буфера, така че getline() го прочита и изпълнението на програмата продължава, без да се случи нищо. И тук почват да се ползват "шмекерии", като
cin.ignore();
или
while (cin.get() != '\n');
По този начин cin.getline() ще прочете това, което искаш. Сега, ако позволиш коментари: 1) Подреждай си кода. Не знам дали насила се занимаваш с програмиране, но това е нещо, което всеки, който пипа код, трябва да умее да прави. Става въпрос за подравняване, интервали, имена на променливите, да ползваш само '\n' или само endl. Прегледай в Уикипедиа 2) Прави проверка на input и на параметри към функции. Какво става при твоята програма, ако въведем n = 61 например? Нали масивът ти се състои само от 60 структури? Или ако въобще не въведем число? Винаги, ама винаги проверявай входа от потребителя. Ако знаеш какво са функциите - проверявай и параметрите им. 3) Може би към Coding-style-а се отнася - не пести сили да пишеш коментари, хубави имена на променливи, добри съобщения към потребителя. 4) Инициализирай промелнивите. Това ще рече, след като декларираш примерно n, да му зададеш стойност. Например
int n = 0;
И последно, за което няма твърдо мнение - дали трябва да се декларират променливите в началото на функцията, или и по средата. В чистото C е стандарт, но C++ позволява for (int i...) или пък на средата на нищото int br = 0; Говори с преподавателя си кога/къде би ти препоръчал той да си декларираш променливите. А ето я и самата задача, след толкова много бръщолевене (дано не е на вятъра):
#include <iostream.h>

/* on Dev-C++ replace with 

#include <iostream>

using namespace std;

*/


struct student

{

	int number;

	char name[30];

	double mark;

};


int main ()

{

	student arrStudents[60]; /* Array of structures "student" */

	int numberOfStudents = 0; 

	while ( 1 > numberOfStudents || numberOfStudents > 60)

	{	 /* sanity check */

		  cout << "Number of students (1 - 60) = ";

		  cin >> numberOfStudents;

	}

	/* Fill the array of structures */

	for (int i = 0; i < numberOfStudents; i++)

	{	

		 cout << "Name = ";

		 /* In order to remove the '\n' from the last input, we use */

		 while (cin.get() != '\n');

		 /* or 

		 cin.ignore(); 

		 */

		 cin.getline (arrStudents[i].name,30);


		 cout << "Number = ";

		 cin >> arrStudents[i].number;


		 do 

		 {   /* Sanity check */

			 cout << "Mark (2.00 - 6.00) = ";

			 cin >> arrStudents[i].mark;

		 }

		 while (2 > arrStudents[i].mark || arrStudents[i].mark > 6);

	}		  

	int failed = 0; /* number of failed students */

	for (int i = 0; i < numberOfStudents; i++)

	{

		if (arrStudents[i].mark < 3.0) 

		{

		   failed++;

		}

	}

	cout << endl << "Failed students: " << failed << endl;

	system ("PAUSE");

	return 0; 

}

Успех!

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


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

Първо по същество, после коментари.

Проблемът в последователното четене със cin >> n; и след това cin.getline (a.name,30); се състои в принципната работа на cin >> и cin.getline. Cin >> чете от stdin (конзолния буфер), докато не срещне нов ред (Enter), по този начин, когато когато те попита за

n=
и въведеш
15(Enter)
в буфера остава символа за нов ред ('\n'). Всъщност остава всичко въведено след числото. getline() също чете, докато не срещне нов ред, но този символ ('\n') вече е в буфера, така че getline() го прочита и изпълнението на програмата продължава, без да се случи нищо. И тук почват да се ползват "шмекерии", като
cin.ignore();
или
while (cin.get() != '\n');
По този начин cin.getline() ще прочете това, което искаш. Сега, ако позволиш коментари: 1) Подреждай си кода. Не знам дали насила се занимаваш с програмиране, но това е нещо, което всеки, който пипа код, трябва да умее да прави. Става въпрос за подравняване, интервали, имена на променливите, да ползваш само '\n' или само endl. Прегледай в Уикипедиа 2) Прави проверка на input и на параметри към функции. Какво става при твоята програма, ако въведем n = 61 например? Нали масивът ти се състои само от 60 структури? Или ако въобще не въведем число? Винаги, ама винаги проверявай входа от потребителя. Ако знаеш какво са функциите - проверявай и параметрите им. 3) Може би към Coding-style-а се отнася - не пести сили да пишеш коментари, хубави имена на променливи, добри съобщения към потребителя. 4) Инициализирай промелнивите. Това ще рече, след като декларираш примерно n, да му зададеш стойност. Например
int n = 0;
И последно, за което няма твърдо мнение - дали трябва да се декларират променливите в началото на функцията, или и по средата. В чистото C е стандарт, но C++ позволява for (int i...) или пък на средата на нищото int br = 0; Говори с преподавателя си кога/къде би ти препоръчал той да си декларираш променливите. А ето я и самата задача, след толкова много бръщолевене (дано не е на вятъра):
#include <iostream.h>

/* on Dev-C++ replace with 

#include <iostream>

using namespace std;

*/


struct student

{

	int number;

	char name[30];

	double mark;

};


int main ()

{

	student arrStudents[60]; /* Array of structures "student" */

	int numberOfStudents = 0; 

	while ( 1 > numberOfStudents || numberOfStudents > 60)

	{	 /* sanity check */

		  cout << "Number of students (1 - 60) = ";

		  cin >> numberOfStudents;

	}

	/* Fill the array of structures */

	for (int i = 0; i < numberOfStudents; i++)

	{	

		 cout << "Name = ";

		 /* In order to remove the '\n' from the last input, we use */

		 while (cin.get() != '\n');

		 /* or 

		 cin.ignore(); 

		 */

		 cin.getline (arrStudents[i].name,30);


		 cout << "Number = ";

		 cin >> arrStudents[i].number;


		 do 

		 {   /* Sanity check */

			 cout << "Mark (2.00 - 6.00) = ";

			 cin >> arrStudents[i].mark;

		 }

		 while (2 > arrStudents[i].mark || arrStudents[i].mark > 6);

	}		  

	int failed = 0; /* number of failed students */

	for (int i = 0; i < numberOfStudents; i++)

	{

		if (arrStudents[i].mark < 3.0) 

		{

		   failed++;

		}

	}

	cout << endl << "Failed students: " << failed << endl;

	system ("PAUSE");

	return 0; 

}

Успех!

10x за забележките но програмата няма да я представям никъде, така че коментарите и проверките в случая са ми напълно излишни. А иначе благодаря за ignore това всъщност ми разреши напълно проблема.

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


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

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Добави ново...