Консультация № 180342
17.10.2010, 04:49
0.00 руб.
0 1 1
День добрый, уважаемые эксперты, нуждаюсь в помощи со следующей программой:
Компилятор Code blocks идеально, Borland в крайнем случае,
Итак, на ввод идут фамилии, не меньше 4, пол, местожительство и 4 оценки. Первый вывод должен быть в виде таблицы с введенными данными.
Далее должен быть вывод студенток, проживающих в СПб. И 3 вывод-сортировка 2 вывода по возрастанию среднего балла.



Приложение:
И несколько примеров:

Идеальное оформление и работоспособность.
Скрытый текст
#include <stdio.h>
#include <string.h>
#define n 5
typedef struct
{
int year;
int month;
int day;
} Born;

typedef struct student
{
char FIO[20];
char Gender[2];
Born b;
int Balls[4];
} Student;

int i,j,p, k[n];

void Print_Group(Student MyMas[], int quant);
void Izm_Group(Student MyMas[], Student MyMas1[], int quant);
void Sort_Group(Student MyMas[], int quant);
int main()
{


Student GROUP[n], GROUP1[n];


for ( i = 0; i<n; i++)
{
printf("FIO: ");scanf("%s", GROUP[i].FIO);

printf("Gender(m/f): "); scanf("%s", GROUP[i].Gender);

printf("Year month day: "); scanf("%d %d %d", &GROUP[i].b.year, &GROUP[i].b.month, &GROUP[i].b.day);

printf("Balls[4]: ");
for (j=0;j<4;j++)
scanf("%d", &GROUP[i].Balls[j]);

}
printf("Vvedennii massiv[%i]\n",n);
Print_Group(GROUP, n);
printf("\n");
Izm_Group(GROUP,GROUP1,n);
printf("Massiv, otobrannii po usloviu[%i]\n",p);
Print_Group(GROUP1,p);
printf("\n");
Sort_Group(GROUP1,p);
printf("Otsortirovannii massiv[%i]\n",p);

Print_Group(GROUP1,p);


return 0;
}


void Print_Group(Student MyMas[], int quant)
{ int i,j;
for( i=0; i<quant; i++)
{
printf("%s ", MyMas[i].FIO);
printf(" %s\n", MyMas[i].Gender);
printf(" %d %d %d\n", MyMas[i].b.year, MyMas[i].b.month, MyMas[i].b.day);
for(j=0; j<4; j++)
{printf("%d ", MyMas[i].Balls[j]);}
printf("\n");
}
}


void Izm_Group(Student MyMas[], Student MyMas1[], int quant)
{
for(i=0;i<n;i++)
for(j=0;j<4;j++)
if(MyMas[i].Balls[j]==3)
k[i]=k[i]+1;
for(i=0,p=0;i<n;i++)
if((strcmp(MyMas[i].Gender,"m")==0)&&(k[i]!=0))
{
MyMas1[p]=MyMas[i];
p++;
}
}



void Sort_Group(Student MyMas[],int quant)
{
int i,j;
Student buf;
for(i=1; i<quant;i++)
for(j=quant-1; j>=i;j--)
if(MyMas[j-1].b.day>MyMas[j].b.day)
{
buf=MyMas[j];
MyMas[j]=MyMas[j-1];
MyMas[j-1]=buf;
}
for(i=1; i<quant;i++)
for(j=quant-1; j>=i;j--)
if(MyMas[j-1].b.month>MyMas[j].b.month)
{
buf=MyMas[j];
MyMas[j]=MyMas[j-1];
MyMas[j-1]=buf;
}
for(i=1; i<quant;i++)
for(j=quant-1; j>=i;j--)
if(MyMas[j-1].b.year>MyMas[j].b.year)
{
buf=MyMas[j];
MyMas[j]=MyMas[j-1];
MyMas[j-1]=buf;
}
}


Плохое оформление, но похожее задание и тоже работоспособно.
Скрытый текст

#include<stdio.h>
#include<string.h>
#define maxstud 6
#define maxball 5
typedef struct { char name [20]; int ball [maxball]; float sb;} STUD;

void viv(STUD table[],int ns, int nb);
void sort(STUD table[],int ns);
void vvod(STUD table[], int ns,int nb);
int regroup(STUD table1[], STUD table2[],int ns);

int main()
{ STUD table1[maxstud], table2[maxstud];
int k, nb, ns;
printf ("Vvedite chislo studentov(ne bolshe %i):",maxstud);
scanf ("%i", &ns);
printf ("Vvedite chislo ocenok(ne bolshe %i): ",maxball);
scanf ("%i", &nb);
vvod(table1,ns,nb);
viv(table1,ns,nb);
k=regroup(table1,table2,ns);
viv(table2,k,nb);
sort(table2,k);
viv(table2,k,nb);
return 0;
}

void viv(STUD table[],int ns, int nb)
{ int i,j;
printf ("N. FIO Balls Sredniy ball\n");
for (i=0; i<ns; i++)
{ printf ("%i. %-20s", i+1,table[i].name);
for (j=0; j<nb; j++)
printf (" %i", table[i].ball[j]);
printf(" %5.2f\n",table[i].sb);
}
printf("\n");

}

void sort(STUD table[],int ns)
{ int i,j;
STUD st;
for (i=0; i<ns; i++)
for (j=i;j<ns; j++)
if (table[i].sb<table[j].sb)
{ st=table[i];
table[i]=table[j];
table[j]=st;
}
}

void vvod(STUD table[], int ns,int nb)
{ int i,j,sum;
printf ("Vvedite dannie o %i studentah:\n", ns );
for (i=0; i< ns; i++)
{ printf ("%i.FIO.: ", i+1);
scanf ("%s", table[i].name);
printf ("vvedite %i ocenok: ", nb);
sum=0;
for (j=0; j<nb; j++)
{ scanf ("%i", &table[i].ball[j]);
sum+=table[i].ball[j];
}
table[i].sb=(float)sum/nb;
}
printf("\n");
}

int regroup(STUD table1[], STUD table2[],int ns)
{ int i,k;
float sum, sbgr;
sum=0;
for (i=0;i< ns; i++)
sum+= table1[i].sb;
sbgr=(float)sum/ns;
printf("Srednii ball gruppi: %5.2f\n\n",sbgr);
k=0;
for (i=0;i<ns;i++)
{ if (table1[i].sb<sbgr)
{ table2[k]=table1[i];
k++;
}
}
return(k);
}

Обсуждение

давно
Академик
320937
2216
18.10.2010, 13:47
общий
это ответ
Здравствуйте, Aptemis! Мой вариант, проверен в Code::Blocks/GCC.
Код:
/* Бесплатная консультация онлайн № 180342 */
/*
Итак, на ввод идут фамилии, не меньше 4, пол, местожительство и 4 оценки.
Первый вывод должен быть в виде таблицы с введенными данными.
Далее должен быть вывод студенток, проживающих в СПб.
И 3 вывод-сортировка 2 вывода по возрастанию среднего балла.
*/

#include <stdio.h>
#define SIZE 10

/********************/
#define MAX_BALLS 4
/********************/

typedef struct
{
int year;
int month;
int day;
} Born;

typedef struct student
{
char FIO[20];
char Gender[2];
Born b;
char City[30];
int Balls[MAX_BALLS];
} Student;

void Print_Group(Student MyMas[], int quant);
void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1);
void Sort_Group(Student MyMas[], int quant);
int main()
{
int i;
int j;
int n1; /* количество студенток из СПб */

Student GROUP[SIZE], GROUP1[SIZE];

/* Ввод данных */
for ( i = 0; i<SIZE; i++)
{
printf("\nФИО : ");
scanf("%s", GROUP[i].FIO);

printf("ПОЛ(m/f) : ");
scanf("%s", GROUP[i].Gender);

printf("Год месяц день: ");
scanf("%d %d %d", &GROUP[i].b.year, &GROUP[i].b.month,&GROUP[i].b.day);

printf("Город : ");
scanf("%s", GROUP[i].City);

printf("Оценки[%d] : ", MAX_BALLS);
for (j=0;j<MAX_BALLS;j++)
scanf("%d", &GROUP[i].Balls[j]);

}

/* Печать */
printf("\nВведенный массив[%i]\n",SIZE);
Print_Group(GROUP, SIZE);
printf("\n");

Izm_Group(GROUP,GROUP1,SIZE, &n1);
printf("Массив, отобранный по условию[%i]\n",n1);
Print_Group(GROUP1,n1);
printf("\n");

Sort_Group(GROUP1,n1);
printf("Отсортированный массив[%i]\n",n1);
Print_Group(GROUP1,n1);

return 0;
}

void Print_Group(Student MyMas[], int quant)
{ int i,j;
double sum;
for( i=0, sum=0.0; i<quant; i++)
{
printf("\nФИО :%s\n", MyMas[i].FIO);
printf("Пол :%s\n", MyMas[i].Gender);
printf("Дата рождения:%d-%d-%d\n", MyMas[i].b.year, MyMas[i].b.month, MyMas[i].b.day);
printf("Проживает :%s\n", MyMas[i].City);
printf("Оценки :");
for(j=0, sum=0.0; j<MAX_BALLS; j++)
{ sum+=MyMas[i].Balls[j];
printf("%d,", MyMas[i].Balls[j]);
}
printf("средний балл :%4.2f\n", sum/MAX_BALLS);
}
}


void Izm_Group(Student MyMas[], Student MyMas1[], int quant, int *quant1)
{
/* Формирование массива студенток, проживающих в СПб. */
int i;
int j;
for(i=0, *quant1=0; i<quant; i++)
if((strcmp(MyMas[i].Gender,"f")==0)&&(strcmp(MyMas[i].City,"SPb")==0))
{
MyMas1[(*quant1)++]=MyMas[i];
}
}

void Sort_Group(Student MyMas[],int quant)
{
// Вместо того, чтобы сравнивать средний балл при одинаковом числе оценок,
// достаточно сравнить сумму баллов
int i, j, k, k1;
int sum, sum1;
Student buf;
for(i=1; i<quant;i++)
for(j=quant-1; j>=i;j--)
// Эту часть можно улучшить, так как
// каждая сумма внутри этого цикла, кроме "крайних"
// считается дважды
{
for (k=0, sum=0; k<MAX_BALLS; k++)
sum+=MyMas[j].Balls[k];

for (k1=0, sum1=0; k1<MAX_BALLS; k1++)
sum1+=MyMas[j-1].Balls[k1];

if(sum1>sum)
{
buf=MyMas[j];
MyMas[j]=MyMas[j-1];
MyMas[j-1]=buf;
}

}
}


Пример ввода
Код:
Иванов m 1990 11 12 SPb 1 2 3 4
Петров m 1991 10 25 NY 4 3 2 1
Сидоров m 1989 9 22 Ковров 2 3 4 5
Антонова f 1990 8 13 Москва 2 3 4 5
Николаенко f 1990 7 14 SPb 3 3 4 5
Джабраилова f 1990 11 3 SPb 5 5 4 5
Набиуллина f 1990 10 21 Париж 2 2 3 5
Алимов m 1990 5 11 SPb 3 5 4 5
Черненко f 1990 3 2 SPb 3 3 3 3
Федоров m 1990 2 2 SPb 2 2 4 5


Вывод
Код:
Введенный массив[10]

ФИО :Иванов
Пол :m
Дата рождения:1990-11-12
Проживает :SPb
Оценки :1,2,3,4,средний балл :2.50

ФИО :Петров
Пол :m
Дата рождения:1991-10-25
Проживает :NY
Оценки :4,3,2,1,средний балл :2.50

ФИО :Сидоров
Пол :m
Дата рождения:1989-9-22
Проживает :Ковров
Оценки :2,3,4,5,средний балл :3.50

ФИО :Антонова
Пол :f
Дата рождения:1990-8-13
Проживает :Москва
Оценки :2,3,4,5,средний балл :3.50

ФИО :Николаенко
Пол :f
Дата рождения:1990-7-14
Проживает :SPb
Оценки :3,3,4,5,средний балл :3.75

ФИО :Джабраилова
Пол :f
Дата рождения:1990-11-3
Проживает :SPb
Оценки :5,5,4,5,средний балл :4.75

ФИО :Набиуллина
Пол :f
Дата рождения:1990-10-21
Проживает :Париж
Оценки :2,2,3,5,средний балл :3.00

ФИО :Алимов
Пол :m
Дата рождения:1990-5-11
Проживает :SPb
Оценки :3,5,4,5,средний балл :4.25

ФИО :Черненко
Пол :f
Дата рождения:1990-3-2
Проживает :SPb
Оценки :3,3,3,3,средний балл :3.00

ФИО :Федоров
Пол :m
Дата рождения:1990-2-2
Проживает :SPb
Оценки :2,2,4,5,средний балл :3.25

Массив, отобранный по условию[3]

ФИО :Николаенко
Пол :f
Дата рождения:1990-7-14
Проживает :SPb
Оценки :3,3,4,5,средний балл :3.75

ФИО :Джабраилова
Пол :f
Дата рождения:1990-11-3
Проживает :SPb
Оценки :5,5,4,5,средний балл :4.75

ФИО :Черненко
Пол :f
Дата рождения:1990-3-2
Проживает :SPb
Оценки :3,3,3,3,средний балл :3.00

Отсортированный массив[3]

ФИО :Черненко
Пол :f
Дата рождения:1990-3-2
Проживает :SPb
Оценки :3,3,3,3,средний балл :3.00

ФИО :Николаенко
Пол :f
Дата рождения:1990-7-14
Проживает :SPb
Оценки :3,3,4,5,средний балл :3.75

ФИО :Джабраилова
Пол :f
Дата рождения:1990-11-3
Проживает :SPb
Оценки :5,5,4,5,средний балл :4.75

Если требуются комментарии - задавайте вопросы в мини-форуме. Удачи!

Форма ответа