Упорядочить данные по номеру группы - 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;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы