Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
leragrjanchenko
0 / 0 / 0
Регистрация: 21.02.2019
Сообщений: 2
1

Создайте структуру с именем student...

21.02.2019, 22:23. Просмотров 1010. Ответов 5

Создайте структуру с именем student, содержащую поля: фамилия и инициалы, номер группы, успеваемость (массив из пяти элементов). Создать массив из десяти элементов такого типа, упорядочить записи по возрастанию среднего балла.Добавить возможность вывода фамилий и номеров групп студентов, имеющих оценки, равные только 4 или 5.Помогите с программой

Написала структуру, а вот как дальше делать - не пойму

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h> 
struct student 
{ 
 char name[30]; 
 char group[7]; 
 int marks[5]; 
 }; 
 int main() 
{ 
 int i,j; 
struct student s[10]; 
for(i=0;i<10;i++) 
{ printf("Enter the name\n"); 
 scanf("%s",&s[i].name); 
 printf("Enter the group\n"); 
 scanf("%s",&s[i].group); 
 printf("Enter marks\n"); 
 for (j=0;j<5;j++) 
 scanf("%d;",&s[i].marks[j]); 
} 
 for(i=0;i<10;i++) 
 { 
 printf("Name:%s\n",s[i].name,s[i].group); 
 printf("Group:%s\n Marks:",s[i].group); 
 for(j=0;j<5;j++) 
 {printf("%d;",s[i].marks[j]); 
 
 } 
 
 
 
 
 
} 
return 0; 
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2019, 22:23
Ответы с готовыми решениями:

Описать структуру с именем STUDENT
Описать структуру с именем STUDENT, которая содержит следующие поля: • NAME - фамилия и...

Описать структуру с именем STUDENT
У меня такое задание, но не знаю как вывести чтобы студенты были отсортированы по возрастанию...

Описать структуру с именем STUDENT
Описать структуру с именем STUDENT, содержащую следующие поля: фамилия и инициалы, номер группы,...

Описать структуру с именем STUDENT
Описать структуру с именем STUDENT, содержащую следующие поля: • NAME — фамилия и инициалы; •...

Описать структуру с именем Student
--&gt; Вот как требуется сделать. #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; ...

5
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
22.02.2019, 02:03 2
Вопрос: зачем
Цитата Сообщение от leragrjanchenko Посмотреть сообщение
char group[7];
если нужен только
Цитата Сообщение от leragrjanchenko Посмотреть сообщение
номер группы
Любите сложности? Тогда Вам должно понравиться
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void flush_input(void) {
    char c;
 
    while ( scanf("%c", &c) == 1 && c != '\n' )
        ;
}
 
typedef char name_t[64];
#define get_name(n) ( scanf("%63[^\n]", (n)) == 1 )
 
double get_average(const int * array, const size_t size) {
    double sum = 0.0;
    size_t i;
 
    for ( i = 0; i < size; ++i )
        sum += array[i];
    
    return sum / size;
}
 
#define NUM_GRADES (5)
#define MIN_GOOD_GRADE (4)
#define MIN_GRADE (1)
#define MAX_GRADE (5)
#define NUM_STUDENTS (10)
 
typedef struct STUDENT {
    name_t name;
    int group;
    int grades[NUM_GRADES];
    double average;
} Student;
 
int student_input_data(Student * student) {
    int i, grade;
 
    printf("Name: ");
    if ( ! get_name(student->name) )
        return -1;
    printf("Group: ");
    if ( scanf("%d", &(student->group)) != 1 )
        return -1;
    printf("%d grades:\n", NUM_GRADES);
    for ( i = 0; i < NUM_GRADES; ++i ) {
        printf("  %d> ", i + 1);
        if ( scanf("%d", &grade) != 1 || grade < MIN_GRADE || grade > MAX_GRADE )
            return -1;
        student->grades[i] = grade;
    }
    flush_input();
 
    student->average = get_average(student->grades, NUM_GRADES);
 
    return 0;
}
 
int student_compare_by_average(Student * a, Student * b) {
    double diff = b->average - a->average;
 
    return ( diff < 0.0 ) ? -1 : ( diff > 0.0 ) ? 1 : strcmp(a->name, b->name);
}
 
typedef int (*cmp_func_t)(const void *, const void *);
 
int student_has_only_good_grades(Student * student) {
    size_t i;
 
    for ( i = 0; i < NUM_GRADES && student->grades[i] >= MIN_GOOD_GRADE; ++i )
        ;
    
    return i == NUM_GRADES;
}
 
int main(void) {
    Student students[NUM_STUDENTS];
    int i = 0;
 
    printf("Input data for %d students\n", NUM_STUDENTS);
    while ( i < NUM_STUDENTS ) {
        printf("Student #%d\n", i + 1);
        if ( student_input_data(students + i) ) {
            char answ;
 
            flush_input();
            printf("Something went wrong! Try another time?\n[y/n]> ");
            scanf("%c", &answ);
            if ( answ == 'y' || answ == 'Y' ) {
                flush_input();
                continue;
            }
            else 
                return 1;
        }
        ++i;
    }
 
    qsort(students, NUM_STUDENTS, sizeof(Student), (cmp_func_t)student_compare_by_average);
    printf("Only good students:\n");
    printf("%-30s | %5s | %s\n", "Name", "Group", "Average");
    printf("--------------------------------------------\n");
    for ( i = 0; i < NUM_STUDENTS; ++i )
        if ( student_has_only_good_grades(students + i) )
            printf("%-30s | %5d | %.3f\n", students[i].name, students[i].group, students[i].average);
    
    return 0;
}
1
leragrjanchenko
0 / 0 / 0
Регистрация: 21.02.2019
Сообщений: 2
23.02.2019, 22:50  [ТС] 3
Нечаянно ошиблась в условии, название группы с номером нужно, а не только номер
Спасибо
Ну, наверное месяц придётся с этой сложностью разбираться, как минимум 😂
0
stake-k26
662 / 458 / 350
Регистрация: 25.04.2016
Сообщений: 1,317
24.02.2019, 01:01 4
Лучший ответ Сообщение было отмечено leragrjanchenko как решение

Решение

leragrjanchenko, это не сложность, это просто у кое-кого приключился бзик и он решил повыпендриваться, а заодно попугать новичков хитросплетениями кода.

easybudda, нет бы время потратить на что-нибудь стоящее...

Добавлено через 3 минуты
кстати да.. get_average() зачем? Чем больше сумма, тем больше среднее.. а значит достаточно найти сумму.

Добавлено через 2 часа 0 минут
leragrjanchenko, для начала немного изменим код нашей программы, добавив в структуру поле sum, в котором будет храниться сумма баллов студентов. Это поле понадобится для того, чтобы отсортировать элементы массива по среднему значению баллов.

Очевидно, что чем больше сумма баллов студента, тем больше его средний балл, кроме того, это позволит избежать ошибок в сравнениях значений из-за неточности представления чисел с точкой.

Кроме того, как правильно заметил easybudda, не за чем хранить номер группы в массиве char, для этого достаточно обычного числа типа int.

У нас получается что-то вроде:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>
 
struct student
{
    char name[30];
    char group[7];
    int marks[5];
    int sum;
};
 
int main (void)
{
    int i, j, sum;
    struct student s[10];           // 10 студентов
 
    for(i=0; i<10; i++)             // записываем данные
    {
        printf("Enter the name\n");
        scanf("%s", s[i].name);
        printf("Enter the group\n");
        scanf("%s", s[i].group);
        printf("Enter marks\n");    // записываем оценки
        for (sum=j=0; j<5; j++)
        {
            scanf("%d;", &s[i].marks[j]);
            sum += s[i].marks[j];   // находим сумму баллов
        }
        s[i].sum = sum;             // запоминаем сумму
    }
 
    for(i=0; i<10; i++)             // выводим дынные на экран
    {
        printf("Name:%s\n", s[i].name);
        printf("Group:%s\nMarks:", s[i].group);
        for(j=0; j<5; j++)
            printf("%d;", s[i].marks[j]);
        printf("\n\n");
    }
 
    return 0;
}
Теперь сделаем себе жизнь немного удобнее. Для начала создадим файл, скажем students.txt, в котором будут храниться данные наших студентов в виде:

Имя
Группа
баллы

Зачем? Да просто чтобы не вводить эти данные с клавиатуры каждый раз при тестировании программы. Теперь, достаточно запустить нашу программу и передать ей файл в качестве параметра: program.exe < students.txt

и наша программа автоматически получит все нужные данные.

Таким образом у нас получается файл вида:

Popov
122
4 5 4 4 5
Ivanova
602
5 5 5 4 5
Frolov
123
3 4 3 4 4

и так далее.

Кроме того, вынесем уже написанные функции ввода и вывода данных на экран в отдельные функции, чтобы больше к ним не возвращаться и сосредоточиться только на написании необходимых алгоритмов:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<stdio.h>
#define SIZE 10
struct student
{
    char name[30];
    int group;
    int marks[5];
    int sum;
};
 
void input_student (struct student*);
void output_student (struct student*, int);
 
int main (void)
{
    int i;
    struct student s[SIZE];         // 10 студентов
 
    // 1. записываем данные в структуру
    for(i=0; i<SIZE; i++)
    {
        input_student(&s[i]);
    }   printf("\n");
 
    // 2. выводим данные структуры на экран
    output_student(s, SIZE);
 
    return 0;
}
// ------------------------------------------------------------
void input_student (struct student * a)
{
    int i, sum;
    printf("Enter the name: ");     // узнаем имя
    scanf("%s", a->name);
 
    printf("Enter the group: ");    // номер группы
    scanf("%d", &a->group);
 
    printf("Enter marks\n");        // записываем оценки
    for (sum=i=0; i<5; i++)
    {
        scanf("%d;", &a->marks[i]);
        sum += a->marks[i];         // находим сумму баллов
    }
    a->sum = sum;                   // запоминаем сумму баллов
}
// ------------------------------------------------------------
void output_student (struct student * a, int size)
{
    int i, k;
    for (i=0; i<size; i++)
    {
        printf("Name: %s\n", a[i].name);
        printf("Group: %d\nMarks:", a[i].group);
        for(k=0; k<5; k++)
            printf("%3d", a[i].marks[k]);
        printf("\n\n");
    }
}
И вот теперь подумаем над сортировкой. По сути у нас одномерный массив, и нам нужно отсортировать элементы этого массива по возрастанию. То, что у нас в массиве вместо элементов структуры данных, ничего не меняет, задача остается той же. Алгоритмов сортировки массива до фига и больше, мы можем воспользоваться сортировкой пузырьком, вставками, перестановками, быстрой, методом шелла, шейкерной, гномьей и еще множеством других, главное написать алгоритм сортировки массива по возрастанию.

easybudda для этого воспользовался готовой функцией быстрой сортировки qsort() из стандартной библиотеки си, но я остановил свой выбор на сортировке методом Шелла. Почему? Этот алгоритм легко гуглится и довольно легко реализуется в коде, кроме того, скорость его работы сопоставима, а в некоторых задачах может превышать скорость работы куда более сложного qsort(). Ну и в случае чего, я всегда могу сказать преподу, что у меня по чистой случайности под рукой завалялась книжка K&R, где этот алгоритм расписан и разобран буквально по косточкам, а я решил не изобретать велосипед, воспользовавшись старым добрым (и главное, совершенно законным по лицензии GPL) плагиатом.

Добавлено через 2 минуты
leragrjanchenko, продолжаем. и для этого пишем алгоритм сортировки:

C
1
2
3
4
5
6
// 3. упорядочим записи по возрастанию среднего балла
int k, gap, temp;
for (gap = SIZE/2; gap > 0; gap /= 2)
    for (i = gap; i < SIZE; i++)
        for (k = i-gap; k >= 0 && s[k] > s[k+gap]; k -= gap)
            swap(&s[k], &s[k+gap]);
а заодно пишем функцию swap() которая будет менять два элемента массива местами:
C
1
2
3
4
5
6
void swap (int * a, int * b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
Но этот алгоритм для сортировки обычного массива, а у нас все-таки массив, каждый элемент которого является структурой, и нам нужно не просто сравнить элементы массива, а обратиться к полю sum каждого элемента массива... ну что ж.. прямо так и пишем

for (k = i-gap; k >= 0 && s[k].sum > s[k+gap].sum; k -= gap)

т.е. мы не просто сравниваем элементы s[k] и s[k+gap], сравниваем суммы, записанные в структуре в этих элементах: s[k].sum и s[k+gap].sum.

Не так уж и сложно. Итого у нас получился алгоритм:
C
1
2
3
4
5
int k, gap, temp;
for (gap = SIZE/2; gap > 0; gap /= 2)
    for (i = gap; i < SIZE; i++)
        for (k = i-gap; k >= 0 && s[k].sum > s[k+gap].sum; k -= gap)
            swap(&s[k], &s[k+gap]);
Так-с, ну и остается лишь разобраться с функцией swap(), в оригинале мы передаем ей указатели на элементы int * а у нас должны быть указатели на структуру student, т.е. не int *, а struct student *.. и снова, прямо так и пишем:
C
1
2
3
4
5
6
void swap (struct student * a, struct student * b)
{
    struct student tmp = *a;
    *a = *b;
    *b = tmp;
}
И снова ничего сложного.

Теперь добавим в нашу программу вывод отсортированной структуры на экран и запустим для теста получившуюся программу:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<stdio.h>
#define SIZE 10
struct student
{
    char name[30];
    int group;
    int marks[5];
    int sum;
};
 
void input_student (struct student*);
void output_student (struct student*, int);
void swap (struct student*,struct student*);
 
int main (void)
{
    int i;
    struct student s[SIZE];         // 10 студентов
 
    // 1. записываем данные в структуру
    for(i=0; i<SIZE; i++)
    {
        input_student(&s[i]);
    }   printf("\n");
 
    // 2. выводим данные всей структуры на экран
    output_student(s, SIZE);
 
    // 3. упорядочим записи по возрастанию среднего балла
    printf("--- Sorting structure ---\n");
    int k, gap, temp;
    for (gap = SIZE/2; gap > 0; gap /= 2)
        for (i = gap; i < SIZE; i++)
            for (k = i-gap; k >= 0 && s[k].sum > s[k+gap].sum; k -= gap)
                swap(&s[k], &s[k+gap]);
 
    // 4. выводим данные отсортированной структуры на экран
    output_student(s, SIZE);
 
    return 0;
}
// ------------------------------------------------------------
void input_student (struct student * a)
{
    int i, sum;
    printf("Enter the name: ");     // узнаем имя
    scanf("%s", a->name);
 
    printf("Enter the group: ");    // номер группы
    scanf("%d", &a->group);
 
    printf("Enter marks\n");        // записываем оценки
    for (sum=i=0; i<5; i++)
    {
        scanf("%d;", &a->marks[i]);
        sum += a->marks[i];         // находим сумму баллов
    }
    a->sum = sum;                   // запоминаем сумму баллов
}
// ------------------------------------------------------------
void output_student (struct student * a, int size)
{
    int i, k;
    for (i=0; i<size; i++)
    {
        printf("Name: %s\n", a[i].name);
        printf("Group: %d\nMarks:", a[i].group);
        for(k=0; k<5; k++)
            printf("%3d", a[i].marks[k]);
        printf("\n\n");
    }
}
// ------------------------------------------------------------
void swap (struct student * a, struct student * b)
{
    struct student tmp = *a;
    *a = *b;
    *b = tmp;
}
Ну что ж, все работает.

Осталось лишь реализовать возможность вывода данных тех студентов, у которых в оценках есть только 4 и 5. Что для этого нужно?

Ну, во-первых пробежаться по всем студентам:
for(i=0; i<SIZE; i++)

далее заглянуть к каждому студенту в оценки:
for (j=0; j<5; j++)

и если хотя бы одна из оценок s[i].marks[j] меньше 4, т.е. 1, 2 или 3, то наш студент не подходит, и мы просто переходим к следующему студенту. Ну а если же все оценки нашего студента больше либо равны 4, то нужно вывести данные студента s[i] на экран. Только и всего.

Уверен, разобравшись в коде, сравнив его со своими наработками, вы легко с этим справитесь. Успехов.
2
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
24.02.2019, 01:07 5
Цитата Сообщение от stake-k26 Посмотреть сообщение
кстати да.. get_average() зачем?
По условию нужно
Цитата Сообщение от leragrjanchenko Посмотреть сообщение
упорядочить записи по возрастанию среднего балла
, а сумма элементов хоть в этом смысле и показатель, но средним баллом не является, что вполне могло бы стать причиной придирки со стороны преподавателя - компараторы для целых и вещественных чисел несколько отличаются.

Цитата Сообщение от leragrjanchenko Посмотреть сообщение
Ну, наверное месяц придётся с этой сложностью разбираться
Там, кстати, ничего сложного, если приглядеться к именам переменных и названиям функций, то в принципе и комментарии не нужны. Вполне себе самодокументированный код. И нет там никаких "хитросплетений", зря Вас пугают, не слушайте. Впрочем, если будут вопросы, спрашивайте, не стесняйтесь.

Там кстати косяк с сортировкой: надо по возрастанию среднего балла, а я по убыванию сделал, решив, что так нагляднее. Если сможете поправить самостоятельно - уже хорошо! Останется с группой разобраться и можно сдавать.

Не по теме:

Цитата Сообщение от stake-k26 Посмотреть сообщение
нет бы время потратить на что-нибудь стоящее...
Понадобится совет, на что мне тратить своё время, теперь знаю, к кому обратиться.

1
stake-k26
662 / 458 / 350
Регистрация: 25.04.2016
Сообщений: 1,317
24.02.2019, 01:16 6
Цитата Сообщение от easybudda Посмотреть сообщение
упорядочить записи по возрастанию среднего балла
в этом-то как раз и могут возникать ошибки, практика показывает, что лучше сортировать по целым значениям, а если уж нужно среднее, при фиксированном-то числе слагаемых.. то, как бы.. тут и думать не чего. берем и делим. тем более да, в условии сказано отсортировать, но там нигде не сказано, что среднее нужно найти или вывести на экран.

Цитата Сообщение от easybudda Посмотреть сообщение
Там, кстати, ничего сложного
Это на ваш и на мой взгляд там ничего сложного, а новичка кондратий хватит, пока он разберется откуда и куда какие уши растут.

Добавлено через 4 минуты
easybudda, времени на чтение и понимание вашего кода у меня ушло.. секунд наверное 10 от силы, а вот сесть, описать и по возможности все разжевать для человека, у которого само выражение "структура данных" вызывает духовный трепет, ушло без малого 2 часа. И это еще без объяснения откуда растут указатели и почему в одном месте стоят точки, а в другом стрелки..
1
24.02.2019, 01:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2019, 01:16

Описать структуру с именем STUDENT
Описать структуру с именем STUDENT, содержащую следующие поля: □фамилия и инициалы; □номер...

Описать структуру с именем STUDENT
имеется код рабочей программы из которого нужно сделать стеки очереди и двусвязные списки Вот код...

Описать структуру STUDENT
Описать структуру с именем student, содержащую следующие поля: — фамилия и инициалы — номер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru