← Все темы  ·  ⬇ Материалы

📁 Программа «файл + функция» — 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)

5. 📚 Все файловые задачи по годам

Один каркас — разная логика функции. Раскрывай решение после попытки (код проверен компилятором).

2020 в.1 — футбол (FV = число побед)

Файл fe.in: 1-я строка N K; далее N строк по K результатов (3=победа, 1=ничья, 0=проигрыш). Вывести индекс команды-лидера + сколько команд без побед. Пример → 3 2.

► решение
int a[15][15]; int N,K;
int FV(int i){ int w=0; for(int j=1;j<=K;j++) if(a[i][j]==3) w++; return w; }
int main(){
    ifstream f("fe.in"); ofstream g("fe.out");
    f>>N>>K;
    for(int i=1;i<=N;i++) for(int j=1;j<=K;j++) f>>a[i][j];
    int best=1,wmax=-1,zero=0;
    for(int i=1;i<=N;i++){ int w=FV(i); if(w>wmax){wmax=w;best=i;} if(w==0)zero++; }
    g<<best<<' '<<zero;
    f.close(); g.close(); return 0;
}
✓ Проверено: 3 2

2024 в.2 — CIF (число цифр)

Файл num.in: n строк по 3 числа. Сосчитать строки, где ровно по одному 1-, 2- и 3-значному числу. Пример → 2.

► решение
int CIF(int x){ x=abs(x); if(x<10)return 1; if(x<100)return 2; return 3; }
int main(){
    ifstream f("num.in"); ofstream g("num.out");
    int n; f>>n; int cnt=0;
    for(int i=0;i<n;i++){ int a,b,c; f>>a>>b>>c;
        int s=CIF(a)+CIF(b)+CIF(c), p=CIF(a)*CIF(b)*CIF(c);
        if(s==6 && p==6) cnt++;   // набор длин = {1,2,3}
    }
    g<<cnt; return 0;
}
✓ Проверено: 2

2022 — баллы учеников (DE = сумма баллов)

Файл: 1-я строка n; далее n строк по 3 балла (математика, физика, информатика). Вывести индекс ученика с наибольшей суммой.

► решение
int a[105][4]; int n;
int DE(int i){ int s=0; for(int j=1;j<=3;j++) s+=a[i][j]; return s; }
int main(){
    ifstream f("in.in"); ofstream g("out.out");   // имена файлов — из условия
    f>>n;
    for(int i=1;i<=n;i++) for(int j=1;j<=3;j++) f>>a[i][j];
    int best=1,smax=-1;
    for(int i=1;i<=n;i++){ int s=DE(i); if(s>smax){smax=s;best=i;} }
    g<<best; return 0;
}

2020 в.2 — солнечные дни по декадам

Функция = количество солнечных дней в декаде (10 дней); найти декаду с максимумом. Та же схема: читаем данные → функция по индексу декады → ищем максимум → пишем 2 строки.

► ключевая логика
int solar(int d){ // сумма солнечных дней декады d
    int s=0; for (дни декады d) if (день солнечный) s++; return s;
}
// в main: для каждой декады вызвать solar, найти max, записать результат
💡 Чтобы запустить в CLion, файл *.in положи в папку cmake-build-debug (оттуда запускается программа). Пример уже лежит в programs/.