Самое весомое задание экзамена и при этом самое предсказуемое: каждый год один и тот же каркас, меняется только логика функции.
*.in → обработать именованной функцией → записать ответ в *.out.
| объявления типов/переменных | заголовок функции | тело функции | return |
| открытие файлов | чтение n | цикл | чтение данных |
| вызов функции | ветвление (синтаксис+булево+присвоение) | запись (числа + пробелы + новая строка) | |
// Слой 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; }
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 22 → 26 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
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 8 → 2 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)
Один каркас — разная логика функции. Раскрывай решение после попытки (код проверен компилятором).
Файл 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
Файл 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
Файл: 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; }
Функция = количество солнечных дней в декаде (10 дней); найти декаду с максимумом. Та же схема: читаем данные → функция по индексу декады → ищем максимум → пишем 2 строки.
► ключевая логикаint solar(int d){ // сумма солнечных дней декады d int s=0; for (дни декады d) if (день солнечный) s++; return s; } // в main: для каждой декады вызвать solar, найти max, записать результат
*.in положи в папку cmake-build-debug (оттуда запускается программа). Пример уже лежит в programs/.