← Ко всем темам

📁 Программа «файл + функция» — 16 баллов!

Самое весомое задание экзамена и при этом самое предсказуемое: каждый год один и тот же каркас, меняется только логика функции.

1. Что всегда требуют

Прочитать данные из файла *.in → обработать именованной функцией → записать ответ в *.out.
Барем (16 б.) начисляется по пунктам — поэтому пиши даже частично:
объявления типов/переменныхзаголовок функциитело функцииreturn
открытие файловчтение nциклчтение данных
вызов функцииветвление (синтаксис+булево+присвоение)запись (числа + пробелы + новая строка)

2. Каркас по слоям (заучить!)

Слой 1. Подключения и точка входа.
Слой 2. Глобальные данные (массив + n) — глобальные, чтобы функция их видела.
Слой 3. Функция под задачу (имя из условия).
Слой 4. Открыть файлы, прочитать n и данные.
Слой 5. Цикл обработки: вызвать функцию, записать/сравнить.
// Слой 1
#include <fstream>
using namespace std;

// Слой 2 — глобальные данные
int a[105];
int n;

// Слой 3 — функция (имя по условию)
int F(int i){
    int r = 0;
    // ... логика по индексу i ...
    return r;
}

int main(){
    ifstream f("in.in");     // Слой 4
    ofstream g("out.out");
    f >> n;
    for(int i=1;i<=n;i++) f >> a[i];
    for(int i=1;i<=n;i++){   // Слой 5
        int s = F(i);
        g << s << ' ';
    }
    f.close(); g.close();
    return 0;
}

3. Полный разбор: задача 2025 (книги)

Условие: файл carte.in: 1-я строка — n школ; далее n строк по 3 числа. Вывести в carte.out: 1-я строка — суммы книг по школам; 2-я — индекс школы-лидера. Функция fc(i) = сумма книг школы i.
Вход: 4 / 10 4 12 / 15 7 18 / 12 5 12 / 4 8 2226 40 29 34 / 2
#include <fstream>
using namespace std;
int a[16][4];
int n;
int fc(int i){              // сумма 3 чисел школы i
    int sum = 0;
    for(int j=1;j<=3;j++) sum += a[i][j];
    return sum;
}
int main(){
    ifstream f("carte.in");
    ofstream g("carte.out");
    f >> n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=3;j++) f >> a[i][j];
    int smax=-1, imax=1;
    for(int i=1;i<=n;i++){
        int s = fc(i);
        g << s;
        if(i<n) g << ' ';        // пробел между числами
        if(s>smax){ smax=s; imax=i; } // поиск лидера
    }
    g << endl << imax;            // 2-я строка
    f.close(); g.close();
    return 0;
}
✓ Проверено: выдаёт 26 40 29 34 / 2

4. ✍️ Задача для тренировки: 2024 (квалификаторы)

Условие: файл nota.in: n учеников, их оценки. Функция NI(x): вернуть −1 если оценка ≤5; 0 если 6–8; 1 если 9–10. Вывести в nota.out сколько учеников каждого квалификатора.
Вход: 10 / 6 10 5 8 9 7 4 6 9 82 5 3

Попробуй написать сам по каркасу, потом сверься:

► показать решение
#include <fstream>
using namespace std;
int ocenka[105];
int n;
int NI(int x){
    if(x<=5) return -1;
    if(x<=8) return 0;
    return 1;
}
int main(){
    ifstream f("nota.in");
    ofstream g("nota.out");
    f >> n;
    for(int i=1;i<=n;i++) f >> ocenka[i];
    int c1=0, c0=0, c2=0;
    for(int i=1;i<=n;i++){
        int k = NI(ocenka[i]);
        if(k==-1) c1++;
        else if(k==0) c0++;
        else c2++;
    }
    g << c1 << ' ' << c0 << ' ' << c2;
    return 0;
}
✓ Проверено: 2 5 3 (квалификаторы: 0,1,−1,0,1,0,−1,0,1,0 → два −1, пять 0, три +1)
💡 Чтобы запустить в CLion, файл *.in положи в папку cmake-build-debug (оттуда запускается программа). Пример уже лежит в programs/.