Консультация № 176764
18.02.2010, 14:09
43.34 руб.
0 2 1
Требуется написать программу на языке Си (стандарт ANSI, среда разработки — по усмотрению) Код программы прошу снабдить подробными комментариями. По возможности прошу приложить исполняемый файл.
Задание:
Описать структуру с именем STUDENT, содержащую следующие поля:
• фамилия и инициалы;
• номер группы;
• успеваемость (массив из пяти элементов).
Написать программу, выполняющую следующие действия:
• ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по алфавиту;
• вывод на дисплей фамилий и номеров групп для всех студентов, имеющих
хотя бы одну оценку 2;
• если таких студентов нет, вывести соответствующее сообщение

Обсуждение

давно
Старший Модератор
31795
6196
19.02.2010, 20:16
общий
Botsman:
Код:
#include <STDIO.h>
#define MaxName 20
#define MaxNumber 10
#define MaxGrade 5
#define MaxGroup 10
#define CheckGrade 2
struct student
{
char Name[MaxName];//имя студента
char Number[MaxNumber];//номер группы
int Grade[MaxGrade];//оценки студента
};

int main(void)
{
struct student Group[MaxGroup];//массив из 10-ти студентов
struct student Change;//переменная для сортировки
int a,b,c;//индксы
//
for(a=0;a<MaxGroup;a++)
{
//вводим имя
printf("\nStudent %d \nName:",a+1);
scanf("%s",Group[a].Name);
//вводим группу
printf("Group:");
scanf("%s",Group[a].Number);
//вводим оценки
for(b=0;b<MaxGrade;b++)
{
printf("Grade[%2d]:",b+1);
scanf("%d",&Group[a].Grade[ b ]);
}
}
//начинаем сортировку
a=0;
while(a<(MaxGroup-1))
{
b=0;
while(b<MaxName)
if(Group[a].Name[ b ]>Group[a+1].Name[ b ])//больше обмениваем
{
Change=Group[a];
Group[a]=Group[a+1];
Group[a+1]=Change;
b=MaxName;
a=0;
}else
{
if(Group[a].Name[ b ]==Group[a+1].Name[ b ])//равны идем по имени дальше
{
b++;
}
else
{
a++;//иначе переходим к следующему
b=MaxName;
}
}
}
//выводим отсортированный список
printf("\nList One");
for(a=0;a<MaxGroup;a++)
printf("\nStudent: %s group: %s",Group[a].Name,Group[a].Number);
//поиск двоечников
c=0;
printf("\n\nList Two");
for(a=0;a<MaxGroup;a++)
{
//
b=MaxGrade;
while(b>0)
if(Group[a].Grade[--b]==CheckGrade)
{
//контролируемая оценка совпала выводим фамилию и номер группы
printf("\nStudent: %s group: %s",Group[a].Name,Group[a].Number);
c++;
b=0;
}
}
if(c==0)printf("\nNot Found");//нет двоечников
scanf("%s");//так защита от ДОСа в ХР
return 0;
}

Честно говоря в стандартах не разбираюсь.
Компилировал Borland C++ 3.1
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
22.02.2010, 20:37
общий
это ответ
Здравствуйте, Botsman.

Смотрите приложение(кодировка ср1251).
По ссылке Вы найдете исполняемый файл и исходный код(ср886)q176764.zip (10.1 кб)
В программе для ввода строк, я использовал в учебных целях scanf("%s"), но правильнее было бы использовать gets( ), т.к. вотличии от первой функции последняя вводит строку с пробелами, т.е. можно вводить фамилии с инициалами.
Программа компилировалась средой Borland C++ 3.1.
Удачи!


Приложение:
#include <STDIO.h>
#define MaxName 20
#define MaxNumber 10
#define MaxGrade 5
#define MaxGroup 10
#define CheckGrade 2
struct student
{
char Name[MaxName];//имя студента
char Number[MaxNumber];//номер группы
int Grade[MaxGrade];//оценки студента
};

int main(void)
{
struct student Group[MaxGroup];//массив из 10-ти студентов
struct student Change;//переменная для сортировки
int a,b,c;//индксы
//
for(a=0;a<MaxGroup;a++)
{
//вводим имя
printf("\nStudent %d \nName:",a+1);
scanf("%s",Group[a].Name);
//вводим группу
printf("Group:");
scanf("%s",Group[a].Number);
//вводим оценки
for(b=0;b<MaxGrade;b++)
{
printf("Grade[%2d]:",b+1);
scanf("%d",&Group[a].Grade[ b ]);
}
}
//начинаем сортировку
a=0;
while(a<(MaxGroup-1))
{
b=0;
while(b<MaxName)
if(Group[a].Name[ b ]>Group[a+1].Name[ b ])//больше обмениваем
{
Change=Group[a];
Group[a]=Group[a+1];
Group[a+1]=Change;
b=MaxName;
a=0;
}else
{
if(Group[a].Name[ b ]==Group[a+1].Name[ b ])//равны идем по имени дальше
{
b++;
}
else
{
a++;//иначе переходим к следующему
b=MaxName;
}
}
}
//выводим отсортированный список
printf("\nList One");
for(a=0;a<MaxGroup;a++)
printf("\nStudent: %s group: %s",Group[a].Name,Group[a].Number);
//поиск двоечников
c=0;
printf("\n\nList Two");
for(a=0;a<MaxGroup;a++)
{
//
b=MaxGrade;
while(b>0)
if(Group[a].Grade[--b]==CheckGrade)
{
//контролируемая оценка совпала выводим фамилию и номер группы
printf("\nStudent: %s group: %s",Group[a].Name,Group[a].Number);
c++;
b=0;
}
}
if(c==0)printf("\nNot Found");//нет двоечников
scanf("%s");//так защита от ДОСа в ХР
return 0;
}
5
Спасибо!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа