Поздравляем!
Поздравляем, ваша программа работает, и вы дошли до конца курса C! Она выводит таблицу с баллами, средним баллом и оценкой каждого ученика, находит лучшего ученика, добавляет бонус за помощь на олимпиаде и исправляет баллы по имени. И всё это вы написали сами.
Последнее улучшение. Учитель хочет знать, как справился весь класс: нужен средний балл по классу. Это снова шаблон суммы: переменная, которая начинается с 0, и цикл, который прибавляет к ней average() каждого ученика. Затем сумму делят на count. После этого вы увидите, что программа работает для любого класса: приходит новая ученица, и всё, что нужно, — добавить её в массив.
Чему вы научились. Посмотрите, какое место в вашей программе нашла каждая часть курса:
printfи его форматы выводят таблицу:%sдля имён,%4dдля баллов,%6.1fдля средних баллов и%cдля оценок. Ширины выравнивают столбцы.- Переменные и типы хранят суммы и средние баллы. Средние баллы получаются дробными, потому что вы складывали в переменную типа
double. - Условия определяют оценку (
else ifв правильном порядке), не дают баллам за тест превысить 50 и проверяют, найден ли ученик. - Циклы проходят по ученикам и их баллам (цикл в цикле), складывают, находят лучшего ученика и ищут ученика по имени.
- Массивы хранят учеников и баллы каждого из них.
sizeofвычисляет, сколько всего учеников. - Строки — это имена учеников: массивы
char, которые заканчиваются символом'\0'; их выводят через%sи сравнивают черезstrcmp. - Функции делят программу на части с понятными задачами:
average(),grade()иbest_student()считают и возвращают результат,add_bonus()иfix_points()меняют данные,find_student()ищет, аprint_report()выводит. - Указатели позволяют
add_bonus()менять ученика прямо в массиве (&students[2]), аfind_student()возвращает адрес найденного ученика илиNULL. Массивы передаются в функции как адрес первого элемента, без копирования, аconstговорит, что функция их только читает. - Структуры хранят вместе то, что относится друг к другу: имя и баллы за три теста. К полям обращаются через точку, а через указатель — через стрелку
->. Параметр-структура — это копия, а функция может и вернуть структуру. - А когда что-то не получалось, сообщения компилятора об ошибках подсказывали, что не так и в какой строке. Всегда стоит сначала исправлять самую первую ошибку.
C на вашем компьютере. Здесь программы компилировал и запускал ваш браузер. На своём компьютере у вас есть несколько вариантов:
- Онлайн-компилятор не нужно устанавливать. Например, на onlinegdb.com выберите язык C, вставьте программу и запустите её кнопкой Run. Ввод с клавиатуры там тоже работает.
- Windows: установите бесплатную программу Code::Blocks. Скачайте установщик со словом
mingwв названии: в нём есть и компилятор GCC. Затем создайте новый проект (File → New → Project → Console application), выберите язык C, замените пример кода своей программой и запустите её клавишейF9(Build and run). - macOS: в Терминале установите инструменты командой
xcode-select --install. Сохраните программу какmain.c, перейдите в её папку в Терминале командойcdи скомпилируйте её:clang -Wall main.c -o main. Получится программаmain, которую запускают командой./main. - Linux: установите компилятор GCC, например в Ubuntu командой
sudo apt install gcc. Затем скомпилируйте программу командойgcc -Wall main.c -o mainи запустите её командой./main.
Часть -o main задаёт имя готовой программы, а -Wall включает предупреждения. Читайте их! Здесь сайт считал самые опасные из них ошибками, но на вашем компьютере многие из них — всего лишь предупреждения, и программа всё равно создаётся. Программа с такой ошибкой может потом выводить ерунду или падать, например с сообщением Segmentation fault. После каждого изменения кода компилируйте его заново, иначе запустите старую версию. Здесь, на сайте, это делала за вас кнопка «Запустить».
Что дальше. Теперь вы знаете основы, из которых состоит любая программа на C. Вот несколько идей, что изучать дальше:
- Ввод от пользователя. На вашем компьютере работает
scanf:scanf("%d", &points);ждёт, пока пользователь введёт число и нажмёт Enter, и сохраняет его в переменную. Обратите внимание на&:scanfполучает адрес переменной, чтобы изменить её, точно какadd_bonus(). (Здесь, в браузере, вводить некому, поэтому программы брали данные из переменных.) Тогда учитель мог бы сам вводить баллы. - Файлы. С помощью
fopen,fprintfиfcloseизstdio.hпрограмма может сохранить результаты в файл и прочитать их в следующий раз, чтобы они не пропадали, когда программа завершается. - Память. Размер массива
studentsопределяется, когда вы пишете программу. С помощьюmallocиfreeизstdlib.hпрограмма запрашивает память во время работы, например под столько учеников, сколько записано в файле. Именно здесь указатели нужны больше всего. - C++. C++ построен на основе C: почти всё, что вы знаете, работает и там, а ещё в нём есть строки, которые растут сами (
std::string), векторы, классы и многое другое. На сайте есть и курс C++. - Свои проекты и соревнования. Игра «Угадай число», викторина, крестики-нолики в двумерном массиве. Больше всего учишься, когда решаешь собственные задачи. На C и C++ ещё программируют небольшие устройства, например платы Arduino, и они очень популярны на соревнованиях по программированию, например на олимпиадах по информатике, которые во многих странах проводят для школьников.
А если захотите попробовать другой язык, вас ждут курсы C++, Python и JavaScript.
Задание
- 1
В конце
print_report(), под строкой с лучшим учеником, выведите средний балл по классу: сложите в цикле средние баллы всех учеников и разделите сумму наcount. В нашем классе получится:Среднее по классу: 37.3 - 2
В класс пришла новая ученица, Mia. Добавьте её в конец массива
students:{"Mia", {40, 44, 47}},. Больше ничего менять не нужно:countвычисляется черезsizeof, а функции работают для любого числа учеников. Результаты закончатся так:Lucy 35 40 41 38.7 B Mia 40 44 47 43.7 B Лучший: Finn (среднее 50.0) Среднее по классу: 38.4Если средний балл по классу получился
46.1, вы делите на 5, записанное прямо в коде, а не наcount. И добавляйте Mia в конец: в начале она сдвинула бы индексы остальных учеников, и бонус достался бы Emma и Finn вместо Finn и Jack.