Упорядочить данные по номеру группы - C (СИ)
Формулировка задачи:
Очень туг в этом деле, но надо сдавать( не ругайтесь сильно)
1.Написать программу по обработке массива структур, содержащего следующую информацию о студентах:
– фамилия и инициалы;
– год рождения;
– номер группы;
– оценки за семестр: физика, математика, информатика, химия;
– средний балл.
Организовать ввод исходных данных, средний балл рассчитать по введенным оценкам.
Упорядочить данные по номеру группы – по возрастанию
2.Создать текстовый файл и напечатать в нем не мнее пяти строк (можно на английском), включающих буквы, цифры и т.д.
Пронумеровать в Блокноте (или Notepad++) строки и программно удалить строку с заданным номером.
Решение задачи: «Упорядочить данные по номеру группы»
textual
Листинг программы
/*
============================================================================
Name : c_struct_student_grade.c
Author : UranFlex
Version : 0.1 alpha Windows GNU GCC ( MinGW )
Copyright : GNU GPL
Description : Написать программу по обработке массива структур, содержащего следующую информацию о студентах:
* – фамилия и инициалы;
* – год рождения;
* – номер группы;
* – оценки за семестр: физика, математика, информатика, химия;
* – средний балл.
* Организовать ввод исходных данных, средний балл рассчитать по введенным оценкам.
* Упорядочить данные по номеру группы – по возрастанию.
* C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define ITEM_NAME 50
#define NAME_LEN 50
#define GROUP_LEN 10
#define GRADE_COUNT 4
// тип данных, описывающий оценку студента ball за семестр по определенному предмету item
struct Grade {
char item[ ITEM_NAME ]; // название предмета
unsigned short ball; // оценка за семестр по предмету
};
typedef struct Grade Grade;
// тип данных,описывающий данные студента
struct Student {
char name[ NAME_LEN ]; // Фамилия и инициалы
unsigned short year; // год рождения
char group[ GROUP_LEN ]; // номер группы - сделано строкой, так как предполагаю, что номер группы может быть, к примеру, СПС-02
Grade grades[ GRADE_COUNT ]; // физика - 0, математика - 1, информатика - 2, химия - 3 };
float avgGrade; // средний балл студента за семестр
};
typedef struct Student Student;
// функция ввода данных студентов
void FillEement( Student* s );
// функция вывода на экран данных всех студентов
void PrintElement( Student* s );
// функция сортировки выбором массива структур по полю group
void Sort( Student* s, size_t size );
int main( void ) {
setlocale( LC_ALL,"Russian" ); // для отображения кириллицы
// создаем динамический массив, содержащий набор данных студентов
// и выделяем память под данные одного студента
Student* students = ( Student* ) calloc( 1, sizeof(Student) );
// обрабатываем ошибку создания динамического массива
if ( students == NULL ) {
perror( "Не удалось создать динамический массив!" );
return EXIT_FAILURE;
}
size_t counter = 1; // индекс элемента массива структур, элементом являются данные очередного студента.
// в цикле вводим данные на студентов
while ( 1 ) {
// запрашиваем у пользователя данные очередного студента
printf( "%s %u\n", "Введите данные студента номер", counter );
// заполняем данные студента
FillEement( &students[ counter - 1 ] );
// спрашиваем пользователя - продолжать ли ввод данных для следующего студента
char ch;
do {
puts( "Если желаете ввести данные еще одного студента - введите c" );
puts( "Чтобы закончить ввод введите q " );
ch = getchar(); // читаем введенный символ
fflush( stdin ) // очищаем stdin от лишних символов
;
} while ( ch != 'c' && ch != 'q' ); // если символ не c и не q, то просим заново ввести c или q
if ( ch == 'q' ) // если символ q
break; // то обрываем цикл ввода данных
// а если символ был c, то
// пробуем выделить память для данных еще одного студента
students = realloc( students, ( ++counter ) * sizeof(Student) );
if ( students == NULL ) { // обрабатываем ошибку выделения памяти
puts( "Ошибка при выделении памяти для данных еще одного студента" );
puts( "Данные предыдущих студентов сохранены" );
break;
}
}
// сортируем массив по полю group
Sort( students, counter );
// выводим на экран данные всех студентов, отсортированные по полю group
size_t i;
for ( i = 0; i < counter; ++i ) {
printf( "%s %u\n", "Данные студента номер", i + 1 );
PrintElement( &students[ i ] );
}
// очищаем память от динамического массива данных студентов
free( students );
students = NULL;
return EXIT_SUCCESS;
}
void FillEement( Student* s ) {
// заполняем данные студента
strcpy( s->grades[ 0 ].item, "физика" );
strcpy( s->grades[ 1 ].item, "математика" );
strcpy( s->grades[ 2 ].item, "информатика" );
strcpy( s->grades[ 3 ].item, "химия" );
printf( "Введите фамилию и инициалы " );
fgets( s->name, NAME_LEN, stdin );
s->name[ strlen( s->name ) - 1 ] = '\0';
fflush( stdin );
printf( "Введите год рождения " );
scanf( "%hu", &s->year );
fflush( stdin );
printf( "Введите номер группы " );
fgets( s->group, GROUP_LEN, stdin );
s->group[ strlen( s->group ) - 1 ] = '\0';
fflush( stdin );
puts( "Введите оценки за семестр по следующим предметам:" );
int i;
s->avgGrade = 0;
for ( i = 0; i < GRADE_COUNT; ++i ) {
printf( "%s ", s->grades[ i ].item );fflush( stdin );
scanf( "%hu", &s->grades[ i ].ball );
fflush( stdin );
s->avgGrade += s->grades[ i ].ball;
}
s->avgGrade /= GRADE_COUNT; // считаем средний бал за семестр
}
void PrintElement( Student* s ) {
printf( "%s %s\n", "Фамилия и инициалы", s->name );
printf( "%s %hu\n", "Год рождения", s->year );
printf( "%s %s\n", "Номер группы", s->group );
puts( "Оценки за семестр по следующим предметам:" );
int i;
for ( i = 0; i < GRADE_COUNT; ++i ) {
printf( "%s", s->grades[ i ].item );
printf( " %hu\n", s->grades[ i ].ball );
}
printf( "%s %.2f\n\n", "средний бал за семестр", s->avgGrade );
}
void Sort( Student* s, size_t size ){
if ( size < 1 )
return;
size_t i, j;
Student temp;
for ( i = 0; i < size - 1; ++i )
for ( j = i + 1; j < size; ++j ){
if ( strcasecmp(s[ i ].group, s[ j ].group) > 0 ){
temp = s[ i ];
s[ i ] = s[ j ];
s[ j ] = temp;
}
}
}