Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПСД программы (полн).doc
Скачиваний:
1
Добавлен:
17.04.2019
Размер:
289.79 Кб
Скачать

Подсчет строк, слов и символов

Задача 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.