- •Базовые типы данных
- •Пример простой программы на языке с
- •Ветвления
- •Последовательная обработка
- •Сумма числовой последовательности
- •Максимум числовой последовательности
- •Последовательная обработка символов
- •Подсчет строк, слов и символов
- •Массивы
- •Статические и динамические массивы
- •Двумерные массивы
- •Структурное программирование сверху вниз
- •Алгоритм сортировки методом обмена (методом пузырька)
- •Подпрограммы
- •Примеры зачетных задач
- •Рекурсия
Подсчет строк, слов и символов
Задача 5.2. Составить программу подсчета во входном тексте количества строк, слов и символов.
Словом считается любая последовательность символов, не содержащая пробелов, символов табуляции и новой строки. Строка заканчивается символом новой строки.
Тест. Вход:
Если друг оказался вдруг
И не друг, и не враг, а так.
Выход: Строк: 2, слов: 12, символов: 53.
Количество символов считаем сразу после ввода, количество строк – по количеству символов ‘\n’, а количество слов – при вводе символа не разделителя, перед которым был разделитель. Для этого используем флаг разделителя.
Для организации многовариантного ветвления удобен оператор switch (переключить) - оператор переключатель.
Оператор switch имеет вид:
switch (выражение)
{ [ case цел-конст-выраж: [оператор...]]...
[ default: оператор...]
[ case цел-конст-выраж: [оператор...]]...
}
Вычисляется значение выражения. Переключатель осуществляет переход к одному из вариантов case, константное выражение которого совпадает с вычисленным значением, или к метке default (умолчание), если не совпадает ни с одной из констант вариантов ветвления.
Ключевое слово case (случай) - вариант ветвления, можно пометить целой или символьной константой (или константным выражением). Каждый вариант обычно заканчивается оператором break.
/* Программа 5.2. Подсчет строк, слов и символов */
/* символ ::= разделитель | символ-слова */
/* разделитель ::= пробел | новая-строка | табуляция */
/* | конец-файла */
/* символ-слова - любой символ, кроме разделителей */
#include <stdio.h>
#define DA 1
#define NET 0
void main ()
{ int sim; /* Текущий символ (int для EOF) */
int kstr, ksl, ksim; /* Кол-во строк, слов и символов */
int razdel; /* Символ - разделитель */
razdel = DA; /* 1-й символ текста - начальный */
kstr = ksl = ksim = 0;
while ((sim = getchar()) != EOF)
{
ksim++; /* подсчет символов */
switch (sim)
{
case '\n':
kstr++; /* подсчет строк */
razdel = DA; break; /* Эту строчку можно убрать! */
case ' ':
case '\t':
razdel = DA; break;
default: /* Символ слова не разделитель */
if (razdel) /* Предыдущий символ - разделитель */
{ razdel = NET; ksl++; } /* подсчет слов */
}
}
printf ("Строк: %d, слов: %d, символов %d. \n", kstr, ksl, ksim);
}
Массивы
Рассмотрим задачи и решим, в каких задачах необходимы массивы для хранения данных:
6.1. Дано целое n>0 и последовательность вещественных чисел x1, x2,…, xn. Написать программу
а) для определения суммы и количества положительных элементов последовательности;
б) для определения количества элементов последовательности больших первого элемента x1;
в) для определения количества элементов последовательности больших последнего элемента xn.
6.2. Дано целое n>0 и последовательность вещественных чисел x1, x2,…, xn. Написать программу
а) для выдачи на экран только положительных чисел последовательности.
б) для выдачи на экран сначала всех отрицательных, а затем всех положительных чисел последовательности.
6.3. Даны значения температур каждого из n дней месяца ( n ≤ 31).
Написать программу
а) определения среднемесячной температуры;
б) определения количества дней, когда температура была выше среднемесячной.
6.4. Дан текст, продолжающийся до конца файла.
Написать программы для решения следующих задач.
а) Переставить символы текста в обратном порядке.
б) Подсчитать количество слов, содержащих букву ‘a’.
в) Вывести слова, содержащие букву ‘a’.
Для задач 6.1в, 6.2б, 6.3б, 6.4а, 6.4в необходимо использование массивов, в остальных задачах не требуются массивы.
Задача 6.1. Дано целое n>0 и вещественные x1, x2, ..., xn . Составить программу подсчета количества чисел больших первого числа - 6.1б (больших последнего числа – 6.1в).
Тест 6.1б. Вход: 4 3 12 7 5 Тест 6.1в. Вход: 4 3 12 7 5
Выход: k = 3 Выход: k = 2
/* Программа 6.1б. */ /* Программа 6.1в. */
#include <stdio.h> #include <stdio.h>
#define N 20
void main () void main ()
{ int n, i, k=0; { int n, i, k=0;
float m1, m; float m[N];
scanf (“%d”, &n); scanf (“%d”, &n);
scanf (“%f”, &m1);
for (i = 1; i < n; i++) for (i = 0; i < n; i++)
{ scanf (“%f”, &m); scanf (“%f”, &m[i]);
if (m > m1) k++; for (i=0; i < n-1; i++)
} if (m[i] > m[n-1]) k++;
printf (“k=%d\n”, k); printf (“k=%d\n”, k);
} }
Пояснения к программе.
1. Для решения задачи 6.1б достаточно хранить первое число в переменной m1, а остальные числа поочередно вводить в переменную m и сравнивать с величиной m1.
2. Для решения задачи 6.1в требуется хранить все числа в виде массива. Сначала данные в цикле вводятся в массив m, затем в следующем цикле каждый элемент массива сравнивается с последним элементом.
Задача 6.3. Даны значения температур каждого из n дней месяца (n ≤ 31). Написать программу для решения следующей задачи. Определить среднюю температуру за месяц. Вывести дни, когда температура была выше средней, и количество таких дней.
/* Программа 6.3 Средняя температура */
#include <stdio.h>
#define N 31
main ()
{ int n,
i,
k=0;
float t[N],
s=0;
scanf (“%d”, &n);
for (i = 0; i < n; i++) // цикл ввода значений температур
{ scanf (“%f”, &t[i]);
s = s + t[i]; // с вычислением суммарного значения
}
s = s/n; // вычисление среднего значения температур
printf (“Средняя температура =%.1f\n”, s);
printf (“\n Дни с температурой выше средней:\n”);
for (i = 0; i < n; i++)
if (t[i] > s)
{ printf (“%d ”, i+1); k++; }
printf (“\n Количество дней = %d”, k);
return 0;
}
Пояснения к программе.
1. Определяется массив t размером до 31 элемента (по количеству дней в самом длинном месяце). Количество используемых элементов массива задается вводом значения величины n.
2. В первом цикле вводятся элементы массива t – значения температур каждого дня месяца и вычисляется суммарная температура за месяц.
3. После ввода температур и вычисления суммарной температуры, определяется средняя температура за месяц.
4. Во втором цикле температура каждого из дней месяца проверяется на отклонение от средней температуры.
Задача 6.4а. Переставить символы текста в обратном порядке.
Тест. Вход: ПИРАМИДА Выход: АДИМАРИП
0 1 2 3 4 5 6 7 - индексы символов в массиве
/* перестановка символов текста в обратном порядке */
/* фрагмент программы */
char s, t[100];
int i, j, n;
gets (t); /* ввод строки */
n= strlen(t); /*определение длины строки */
for (i=0, j=n-1; i<j; i++, j--)
{ s=t[i]; t[i]=t[j]; t[j]=s; } /* Обмен t[i] <--> t[j] */
Пояснения к программе.
1. Строка просматривается с двух концов: от начала до середины строки с увеличением индекса символа i, от конца до середины строки с уменьшением индекса j, и выполняется обмен символа t[i] с символом t[j] через дополнительную переменную s.
Для приведенного теста цикл повторяется 4 раза до середины строки, с изменением i от 0 до 3, а j - от 7 до 4.