ТОР 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. Подбельский
Не нашли, что искали? Воспользуйтесь поиском:
|