1

Тема: Пропозиції і скарги)

Доброго дня всім!
Виконав завдання яке дали в коледжі (На С). Викладачі подивилися і сказали "Добре добре, молодець"
А я хочу просто дізнатись чи можна було зробити краще і компактніше, одним словом крити, щоб люди які мають певний досвід, вказали на мої помилки.

Ось завдання:
Написати програму аналізу середньої успішності чотирьох студентів по чотирьох предметах за сесію на основі структурного типу даних. Виконаєте усереднювання оцінок для кожного студента.
1.    Передбачите введення назв предметів (математичний аналіз, алгебра і т.(д.) і визначите їх у вигляді ініціалізаторів структури.
2.    Застосуєте оператора typedef для визначення структурного типу даних.
3.    Розташуєте прізвища (з іменами) студентів в порядку зростання їх середнього балу за сесію.

І моє вирішення:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#define N 40
typedef struct
{
    char student_name[N];
    char student_surname[N];
    char student_group[N];
    char predmet[N];
    float score1;
    float score2;
    float score3;
    float score4;
    float SR;
} book;

int main()
{
    char name[] = {"Name"};
    char surname[] = {"Surname"};
    char group[] = {"Group"};
    char score[] = {"Score"};
    printf("Enter the number of students: ");
    unsigned int n;
    scanf("%i", &n);
    if (n < 4)
    {
        printf("Minimum number of students is 4!");
        return 1;
    }
    book students[n], t;
    printf("Enter Subjects:\n");
    for (int i = 0; i < 4; i++)
    {
        printf("Subject #%i: ", i + 1);
        scanf("%s", &students[i].predmet);
    }
    printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s \n", name, surname, group, students[0].predmet, students[1].predmet, students[2].predmet, students[3].predmet);
    for (int i = 0; i < n; i++)
    {
        scanf("%s %s %s %f %f %f %f", &students[i].student_name, &students[i].student_surname, &students[i].student_group, &students[i].score1, &students[i].score2, &students[i].score3, &students[i].score4);
        if (students[i].score1 > 12 || students[i].score1 < 1 || students[i].score2 > 12 || students[i].score2 < 1 || students[i].score3 > 12 || students[i].score3 < 1 || students[i].score4 > 12 || students[i].score4 < 1)
        {
            printf("You enter wrong score!");
            return 1;
        }
    }
    printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s \n", name, surname, group, students[0].predmet, students[1].predmet, students[2].predmet, students[3].predmet);
    for (int i = 0; i < n; i++)
        printf("%-12s %-12s %-12s %-12.0f %-12.0f %-12.0f %-12.0f \n", students[i].student_name, students[i].student_surname, students[i].student_group, students[i].score1, students[i].score2, students[i].score3, students[i].score4);
    for (int i = 0; i < n; i++)
    {
        students[i].SR = (students[i].score1 + students[i].score2 + students[i].score3 + students[i].score4) / 4;
    }
    printf("\nAverage grade of students (column Score)\n");
    printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s %-12s \n", name, surname, group, students[0].predmet, students[1].predmet, students[2].predmet, students[3].predmet, score);
    for (int i = 0; i < n; i++)
        printf("%-12s %-12s %-12s %-12.0f %-12.0f %-12.0f %-12.0f %-12.1f \n", students[i].student_name, students[i].student_surname, students[i].student_group, students[i].score1, students[i].score2, students[i].score3, students[i].score4, students[i].SR);
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (students[j + 1].SR > students[j].SR)
            {
                t = students[j];
                students[j] = students[j + 1];
                students[j + 1] = t;
            }
    printf("\nStudents are ranked in order of increasing the grade point average per session\n");
    printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s %-12s \n", name, surname, group, students[0].predmet, students[1].predmet, students[2].predmet, students[3].predmet, score);
    for (int i = 0; i < n; i++)
        printf("%-12s %-12s %-12s %-12.0f %-12.0f %-12.0f %-12.0f %-12.1f \n", students[i].student_name, students[i].student_surname, students[i].student_group, students[i].score1, students[i].score2, students[i].score3, students[i].score4, students[i].SR);
    printf("\n\n Press any key: ");
    _getch();
    return 0;
}

І результат:

Прихований текст

https://replace.org.ua/uploads/images/9149/bdb57a73943ae5be0a44134ca209534a.jpg

P.S Так, я користувався Google Translate :3

Подякували: fed_lviv1

2 Востаннє редагувалося koala (15.12.2019 08:29:06)

Re: Пропозиції і скарги)

1. Структура зветься "book", а дані в ній стосуються студента (і половина так і зветься - student_щось_там).

students[i].student_name,

замість

students[i].name,

зазвичай означає, що ви щось не так назвали. Краще назвіть її Student, а елементи - просто name, surname, subject (а не predmet). Ну і мабуть average чи хоча б avg, а не SR.
2. Якщо у вас є кілька змінних з назвами щось1, щось2 і т.д., які використовуються однотипно, то є сенс об'єднати їх у масив: float score[4]. До речі, там є сенс робити float? бали ж ніби мають бути цілі, це лише середнє може бути дробним.
3. Структура, вочевидь, має містити пов'язані дані. Назви предметів не мають стосунку до студентів і мають бути в окремому масиві.
4. Стрічки краще вводити через fgets (чи варіанти), бо scanf("%s") вводить до пробілу. Якщо когось зватимуть "Анна Марія" чи предмет зватиметься "Теорія ймовірностей", вони не введуться.
5. Вводити різнорідні дані краще в окремих рядках - "ой, третє поле було номер заліковки, а я оцінку з математики ввів".
6. Забагато "магічних чисел", а те, що винесене в константу, має незрозумілу назву.

#define STR_LEN 40
char surname[STR_LEN]; //зрозуміліше

З іншого боку, якщо завтра скажуть переробити на 5 предметів, то програма навіть не криво виведе, а взагалі завалиться - а зміна очевидна.
7. Узагалі всі операції зі структурою бажано обгортати у функції, але то вже таке. Для такої задачі не обов'язково.

Подякували: XperiaNov, leofun012

3 Востаннє редагувалося ur_naz (14.12.2019 14:20:03)

Re: Пропозиції і скарги)

Все погано у тебе.
Чому ти назвав студента книгою? Ти шо наркоман?
Тобто кожен раз треба вводити усі дані? Чи ти садист?
Що таке структурне програмування знаєш? Чи ти мазохіст? Чи садомазо?
А де в тебе сортировка? Чи ти аферист?

Де в твоєму коді бодай один коментар?

4

Re: Пропозиції і скарги)

Пане ur_nazе, ви дуже близько підійшли до порушення п.2.4 Правил. Будь ласка, намагайтеся обговорювати код, а не персоналії.

Подякували: fed_lviv, P.Y.2

5

Re: Пропозиції і скарги)

ur_naz написав:

Все погано у тебе.
Чому ти назвав студента книгою? Ти шо наркоман?
Тобто кожен раз треба вводити усі дані? Чи ти садист?
Що таке структурне програмування знаєш? Чи ти мазохіст? Чи садомазо?
А де в тебе сортировка? Чи ти аферист?

Де в твоєму коді бодай один коментар?

Навіщо стільки агресії? Людина виконала завдання і все одно хоче почути поради. Для цього описала завдання та надала свій варіант, тобто прагне розвиватися в даному напрямку. І це є +++. Який сенс у Вашому повідомленні?

6

Re: Пропозиції і скарги)

ur_naz

Чому ти назвав студента книгою? Ти шо наркоман?

Ну як ти напевне зрозумів, я проходжу тему структури, і ця структура залишилась від попереднього завдання, я не звернув уваги на ім'я структури  і замінив у ній змінні.

Тобто кожен раз треба вводити усі дані? Чи ти садист?

Прочитай будь-ласка уважно завдання

1.    Передбачите введення назв предметів (математичний аналіз, алгебра і т.(д.)

Що таке структурне програмування знаєш?

Так, знаю

А де в тебе сортировка? Чи ти аферист?

Уважніше чийтай будь-ласка

for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (students[j + 1].SR > students[j].SR)
            {
                t = students[j];
                students[j] = students[j + 1];
                students[j + 1] = t;
            }

Де в твоєму коді бодай один коментар?

Ну я пишу без коментарів, ну думаю ти правий, викладаючи на форму, потрібно було написати коментарів, щоб інші розуміли.

7

Re: Пропозиції і скарги)

Нмд, коментарі потрібні:
- для документування;
- коли ви робите щось неочікуване, наприклад, використовуєте неочевидний алгоритм.
В інших випадках достатньо просто хороших ідентифікаторів.

Подякували: XperiaNov, leofun01, ostap34PHP3

8

Re: Пропозиції і скарги)

Дякую, візьму до уваги

9

Re: Пропозиції і скарги)

Навіщо стільки агресії?

Якої агресії? Я живу за 8 км від фронту. Не кажіть мені про агресію.
То був тест. Якщо людина бажає розвиваться, вона питає, якщо ні - виправдовується, а якщо виявляє зворотну агресію, то деградує. Я отримав усі відповіді на свої питання і нажаль не побачив того, чого чекав. Тому витрачати свій час на це не вважаю за потрібне, бо знаю чим усе закінчиться. Може я помиляюсь, але наразі я цього не відчуваю.
Взагалі навчання без насилля неможливо... Але ця метода запатентована, тому  *PARDON*

10 Востаннє редагувалося fed_lviv (14.12.2019 20:57:56)

Re: Пропозиції і скарги)

ur_naz написав:

Якої агресії? Я живу за 8 км від фронту. Не кажіть мені про агресію.

Хм, "за 8 км від фронту" vs "запитання на форумі програмування" ніяк невторопаю зв'язок. Чи це виправдовує неввічливість і бажання когось образити...

ur_naz написав:

То був тест

:)

ur_naz написав:

Тому витрачати свій час на це не вважаю за потрібне

Ваше право :)   

ur_naz написав:

Взагалі навчання без насилля неможливо...

:)

11

Re: Пропозиції і скарги)

Чи це виправдовує неввічливість і бажання когось образити...

Неввічливість це пропагувати кацапську на українськім форумі...
і де ви побачили образу?

12

Re: Пропозиції і скарги)

за 8 км від фронту

то, певно, причина такої поведінки, якщо ви розумієте, про що я

13

Re: Пропозиції і скарги)

FakiNyan написав:

за 8 км від фронту

то, певно, причина такої поведінки, якщо ви розумієте, про що я

а ти тут звідки?

14

Re: Пропозиції і скарги)

ur_naz написав:
FakiNyan написав:

за 8 км від фронту

то, певно, причина такої поведінки, якщо ви розумієте, про що я

а ти тут звідки?

я з України

15

Re: Пропозиції і скарги)

поясніть "про що я"

16

Re: Пропозиції і скарги)

ur_naz написав:

поясніть "про що я"

це тільки для тих, хто сам здатен зрозуміти, вибачайте

17

Re: Пропозиції і скарги)

ur_naz, нерозумію про що ви

Якщо людина бажає розвиваться, вона питає, якщо ні - виправдовується, а якщо виявляє зворотну агресію, то деградує. Я отримав усі відповіді на свої питання і нажаль не побачив того, чого чекав.

Я написав з метою розвитку і відповів на ваші запитання, чи ви чекали відповідь на запитання такі як:

Ти шо наркоман? Чи ти садист? Чи ти мазохіст?  Чи садомазо? Чи ти аферист?

18

Re: Пропозиції і скарги)

FakiNyan написав:
ur_naz написав:

поясніть "про що я"

це тільки для тих, хто сам здатен зрозуміти, вибачайте

Прихований текст

https://imgur.com/0RaOuF5.png

Поки робив, взнав, же

– Пејнт не маје обводки дльа тексту.
– ҐІМП не маје Украјинськојі.

Подякували: FakiNyan, leofun012

19

Re: Пропозиції і скарги)

По-перше, що тобі не зрозуміло?
По-друге, не треба видирати з тексту фрази, бо відірвані від контексту вони можуть мати інший зміст.
В тебе навчальна програма, яка не має жодного відношення до реального життя. та й нічого тебе не навчила.
Ок. Спробуй зробити реальну програму. Скільки книг в твоєї групі? 30? Спробуй завести їх до своєї програми, тільки без помилок, бо будеш потім заводити знову. А потім тобі запропонують зробити рейтинг по математиці, а потім по фізиці і по інших предметах. А потім вам в групу додадуть пару особливих студентів, які навчаються за індивідуальною програмою. І що ти будеш робити? Код повинен бути Scalable. А в тебе що?
Оце що?

for (int i = 0; i < 4; i++)
    {
        printf("Subject #%i: ", i + 1);
        scanf("%s", &students[i].predmet);
    }
    printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s \n", name, surname, group, students[0].predmet, students[1].predmet, students[2].predmet, students[3].predmet);

це не наркоманія?
і на останок. Є такий синдром школяра і синдром викладача. Перший полягає у тому, що школяр вірить що, чим більше, тим  краще. А другий полягає у тому, що якщо викладач не бачить того, чого хоче побачити, то для нього все є невірне. А в тебе таке місиво, що нічого не розібрати. тому для будь якого викладача ти є аферист. Ніхто не буде вдивлятися в твої каракулі. Це зрозуміло?
Ба більше, ніхто у реальному житті не буде возити тебе обличчям по поробленому. Тебе просто ще на співбесіді відсіють, бо таке мистецтво нікому не потрібне.

Подякували: leofun011

20

Re: Пропозиції і скарги)

ur_naz написав:

Код повинен бути Scalable.

Я вже просто в очікуванні, хочу на це подивитися.
Можете продемострувати, як треба писати?
https://media.giphy.com/media/12aW6JtfvUdcdO/giphy.gif

Подякували: koala, leofun012