Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Введите последовательность символов, заканчивающуюся EOF

Введите координаты точки на плоскости

x= 3.5

y= 0.0

Значение Р=5.00

Продолжим? Да - введи 7: 7

Введите координаты точки на плоскости

x= -0.5

y= 0.2

Значение Р=0.90

Продолжим? Да - введи 7: 5

Конец работы

Задача С. Ввести последовательность литер, заканчивающуюся признаком конца файла (EOF). Подсчитать количество пробельных литер, количество букв 'А' (с учетом верхнего/нижнего регистров) и количество остальных символов.

Решение:

Приведем решение этой задачи в двух вариантах: с использованием условного оператора if и с использованием переключателя — оператора switch.

Вариант 1

 

#include<stdio.h>

#include<conio.h>

void main()

{

int ka=0,kpr=0,kost=0;

char c;

clrscr();

puts("Введите последовательность символов,"

" заканчивающуюся EOF");

while((c=getchar())!=EOF)

if(c=='a' || c=='A') ka++;

else if(c==' ' II c=='\t` || c=='\n') kpr++;

else kost++;

printf("\nБыло введено\nБукв А: %3d\n", ka);

printf("Пробельных литер: %3d\n0стальных: %3d",kpr,kost);

getch(); // удерживаем экран

}

Вариант 2

#include <stdio.h>

#include <conio.h>

void main()

{

int ka=0, kpr=0, kost=0;

char c;

clrscr();

puts("Введите последовательность символов,"

" заканчивающуюся EOF");

while((c=getchar())!=EOF)

switch(c)

{

case 'a': case 'A': ka++; break;

case ' ': case '\t': case '\n': kpr++; break;

default: kost++;

}

printf ("\nБыло введено: \nБукв A: %3d\n", ka);

printf ("Пробельных литер: %3d\nОстальных: %3d", kpr, kost);

getch(); // удерживаем экран

}

Для демонстрации работы программы необходимо ввести строку, заканчивающуюся признаком конца файла EOF. Этот признак введен специально для того, чтобы было удобно обозначать конец ввода данных.

EOF ‑ это целая константа, определенная в заголовочном файле <sfdio.h>; ее значение выбирается таким, чтобы оно отличалось от любого из возможных значений типа char (обычно EOF ‑ это -1). По этой причине переменная, хранящая очередной вводимый символ, в программе описана как int.

Как ввести признак EOF ‑ зависит от операционной системы. В UNIXe для этого нужно одновременно нажать ctrl+D; в MS DOS ‑ ctrl+Z.

Результаты работы программы будут выглядеть примерно так:

Введите последовательность символов, заканчивающуюся EOF

А роза упала на лапу Азора.^z <Enter>

Было введено:

Букв А: 8

Пробельных литер: 5

Остальных: 14

Задача D. Дано вещественное число b > 0. Последовательность чисел {аi}2i=0 образуется по правилу: а0=1; ai+1 = аi2 +1. Требуется найти и распечатать все числа аi < в.

Решение:

Рассмотрим два фрагмента программы решения этой задачи. Один из них записан с помощью оператора цикла while, а другой использует оператор for.

Фрагмент 1

…..

scanf ("%f", &Ь);

a=1; flag=1; k=0;

puts("Числа Ai<B:");

while(а<Ь)

{ flag=0; k++;

printf("%4d%c", a, (k%15)? ',': '\n');

a=a*a+1;

}

printf("\b \b");

if(flag=1)

puts("Таких чисел в последовательности нет");

…..

Фрагмент 2

…..

scanf("%f", &b);

puts("Числа Аi<В:");

for(a=1, flag=1, k=0; a<B; flag=0, k++, a=a*a+1)

printf("%4d%c", a, (k%15)? ',': '\n');

printf("\b ");

if(flag=1)

puts("Таких чисел в последовательности нет");

…..

Для того чтобы выводимые числа хорошо были рас­положены на экране, рассчитаем формат выдачи результатов. В строке 80 позиций. Если на печать положительного целого числа отвести 4 позиции, то в строке можно уместить 15 чисел, печатая их через запятую. После печати каждых 15 чисел будем переводить курсор на новую строку. Если последнее число было выведено где-то в середине строки, то, чтобы стереть запятую, стоящую после него, используем управляющий символ '\b', который возвращает курсор на одну позицию назад.

Задача Е. Даны вещественное число х и натуральное N. Вычислить

.

Решение:

Здесь приведены три фрагмента для вычисления указанной суммы.

Фрагмент 1

Данный фрагмент демонстрирует плохой (неэффективный) способ записи алгоритма, когда задача решается "в лоб":

…..

int n, i, k;

unsigned long fact;

float s, x;

printf("Введите количество слагаемых: ");

scanf("%d", &n);

printf("Введите вещественное число х: ");

scanf("%f", &x);

for(k=1, s=0; k<=n; k++)

{

for(i=1, fact=1; i<=2*k+1; i++) fact*=i;

s+=pow(-1.0, (float)k) * pow(x, (float)k)/fact;

}

…..

Недостаток этой программы состоит в том, что в ней не учитываются рекуррентные зависимости, которые можно использовать при вычислении факториала и степени. Кроме того, совсем не обязательно для вычисления ‑ (-1)k использовать функцию pow().

Программу можно существенно улучшить, если воспользоваться такими соотношениями:

\_________/

вычислено на

предыдущем шаге

С учетом этого запишем второй вариант программы.

Фрагмент 2

…..

int n, k, ed=1;

unsigned long fact=1, stepX=1;

float s, x;

printf("Введите количество слагаемых: ");

scanf ("%d", &n);

printf("Введите вещественное число х: ");

scanf("%f", &x);

for(k=1, s=0; k<=n; k++)

{

ed=-ed;

stepX*=x;

fact*=4*k*k+2*k;

s+=ed*stepX/fact;

}

…..

 

Необходимо по возможности избегать ненужных вызовов функций, так как это отнимает время счета и приводит к увеличению длины кода программы.

Недостатком обоих приведенных фрагментов является то, что в них степень и факториал числа считаются по отдельности. Как известно, функции факториала и степени растут достаточно быстро, поэтому уже при довольно небольших значениях N произойдет переполнение, и программа не будет работать. В данном случае лучше на очередном шаге цикла во время вычисления степени и факториала сразу делить их друг на друга, чтобы они взаимно “гасились”. С учетом этого запишем последний вариант программы.

Фрагмент 3

.....

int n, k, ed=1;

float slag=1, x, s=0;

printf("Введите количество слагаемых: ");

scanf("%d", &n);

printf("Введите вещественное число х: ");

scanf ("%f", &x);

for(k=1; k<=n; k++)

{

ed=-ed; slag*=x/(2*k* (2*k+1)); s+=ed*slag;

}

.....

 

Контрольные вопросы

1.

2.

3.

4.

 

 

Литература

 

1. Томшин

2. Подбельский

3. Подбельский

<== предыдущая лекция | следующая лекция ==>
ГЛАВА 18 ПРОЩАЙ, ТИБЕТ! | Задача В Распечатать те элементы массива S, индексы которых являются степенями двойки.


Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных