Консультация № 180539
01.11.2010, 17:22
0.00 руб.
0 4 0
День добрый, уважаемые эксперты, нуждаюсь в помощи со следующей программой:
Компилятор Code blocks идеально, Borland в крайнем случае,
Итак, на ввод идут фамилии, не меньше 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;
}

}
}

Обсуждение

Неизвестный
01.11.2010, 18:07
общий
Не знаю, как обновить приложение, отпишусь хоть сюда.
Upd первоначальной программы.
#include <stdio.h>
#include<string.h>
#define SIZE 4
#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("\nNAME: ");
scanf("%s", GROUP[i].FIO);

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

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

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

}

printf("______________________\n");
printf("\nVvednniy spisok[%i]\n",SIZE);
printf("______________________\n");
Print_Group(GROUP, SIZE);
printf("\n");

Izm_Group(GROUP,GROUP1,SIZE, &n1);
printf("______________________\n");
printf("Sokrazhennyi spisok[%i]\n",n1);
printf("______________________\n");
Print_Group(GROUP1,n1);
printf("\n");

Sort_Group(GROUP1,n1);
printf("______________________\n");
printf("Otsortirovannyi spisok[%i]\n",n1);
printf("______________________\n");
Print_Group(GROUP1,n1);

return 0;
}

void Print_Group(Student MyMas[], int quant)
{ int i,j;
double sum;
printf("\Name\tGender\tCity\tMarks\tSredniy ball\n");
for( i=0, sum=0.0; i<quant; i++)

{
printf("%s\t%s\t%s\t", MyMas[i].FIO, MyMas[i].Gender, MyMas[i].City);
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;

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;
}

}
}
давно
Профессор
230118
3054
01.11.2010, 23:30
общий
Aptemis:
А пользоваться qsort запрещено?
Неизвестный
02.11.2010, 09:48
общий
Не помню, входит ли в стандартные библиотеки code blocks, если входит, то все можно.
Неизвестный
06.11.2010, 13:07
общий
Ауауау
Форма ответа