Упорядочить данные по номеру группы - 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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д