Задачник и решебник (1087980), страница 16
Текст из файла (страница 16)
д.e l s e s t [ i ~ ] = г + 55; / / (int)'А'==65, (int)'В»==б6/ / и т. д.} while ( п > 0) ;Часть II. Решения// удалим начальные пробелыi++;int j = 0;while( st[i] )st[j++] = st[i++];st[j] = 4 0 ' ;printf("%s\n", St);printf("\пДля завершения нажмите <Enter>");getch();}Задача 181// Вычисление значения арифметического выраженияiinclude <stdio.h>#include <conio.h>#include "stdlib.h"void main (){char St[40]; // строкаchar buf[10]; // изображение очередного числаchar op;// операторint rez;// значение выраженияint n;// очередное числоint i,j;printf("ХпВведите арифметическое выражение,\n");printf("например, 45+5-3-125+2 и нажмите <Enter>");printf("(пробелы и другие знаки недопустимы)\п");printf("->");scanf("%s", &st);rez == 0; // значение выраженияop = ' »;i = j = 0;while( st[i] ){// выделить число153154С/С+-^- в задачах и примерахj = 0;while (st[i] >= 'О' && st[i] <= '9Мbuf[j++] = st[i++];buf[j] = 40\n = atoi(buf); // преобразовать строку в целое// выполнить действиеswitch ( op ){case ' + ': rez += n; breadt;case '-': rez ~= n; breakscase ' ': rez = n; break; // первое число примера}// выделить знак операцииор = St [i++];}printf("Значение введенного выражения: %d", rez);printf("\пДля завершения нажмите <Enter>");getch();}Задача 182// Итоги летней Олимпиады 2000 года#include "stdio.h"#include "conio.h"#include "string.h"#define NC 10//количество стран-участницvoid main(){char *strana[] = {"Австрия\0","ГерманияХО","КанадаХО", "Китай\0", "Кс3рея\0","НорвегияХО","РоссияХО","СШАХО","ФранцияХО","ЯпонияХО"};// таблица результатовint result[NC+1][5];// NC+1-ая строка используется как буфер// при сортировке таблицыЧасть IL Решений155int i,j;int max;// номер строки таблицы, в которой// количество очков максимальноchar buf[9]; // используется при сортировкеprintf("\п*** Сидней 2000 ***\п");printf("Введите в одной строке количество золотых,\п");printf("серебряных и бронзовых медалейХп");// ввод исходных данныхfor (i = 0; i < NC; i4-+){printf("%s ->", strana[i]);scanf("%i%i%i", ^result[i][0],Sresult [i] [1],&result[i][2]);}// золотых// серебряь1ых// бронзовых// вычислим общее количество медалей и очковfor (i = 0; i < NC; i++){result[i] [3] =result[i][0]+result[i][l]+result[i][2];result[i] [4] =result[i][0]*7+result[i][1]*6+result[i][2]*5;}// сортировка массива в соответствии с количеством очков// методом простого выбораfor (i = 0; i < NC-1; i++){/ / в части таблицы, начиная со строки i,// найти j-ую строку, в которой элемент// result [j] [5] максимальныйmax = i; // пусть это строка с номером ifor (j = i+1; j < NC; j+-b)if (result[j][4] > result[max][4]) max = j;// обменяем 1~ую строку со строкой с номером max/ / в качестве буфера используем последнюю// строку таблицы.156С/С+-^ в задачах и примерахstrcpy(buf,strana[i]);strcpy(strana[i],strana[max]);strcpy(strana[max],buf);for (j = 0; j < 5; j++)result[NC][j] = r e s u l t [ i ] [ j ] ;f o r (j = 0; j < 5; j++)r e s u l t [ i ] [ j ] = result[max][j];f o r (j = 0; j < 5; j4-+)result[max][j] = result[NC][j];}// здесь таблица упорядоченаprintf("Итоги летней Олимпиады в Сиднее, 2000 г.\п");printf("%12s%8s%8s%8s%8s%8s","Страна","Золото","Серебро","Бронза","Всего","Очков");for (i = 0; i < NC; i++){printf("\n%12s", strana[i]);for (j = 0; j < 5; j+4-)printf("%8i", result[i][j]);}printf("\пДля завершения нажмите <Enter>");getcli () ;}Задача 183// Игра "Угадай число"#include "stdio.h"#include "conio.li"#include "stdlib.li"#include "time.li"#define N 3#define DEBUG// уровень сложности - количество цифр в числе// режим отладкамvoid main(){char igro]c[N];char comp[N];// комбинация игрока// комбинация компьютераЧасть II.
Решенияint a[N];157// a[i] == 1, если i-ая цифра// компьютера совпала с одной из цифр игрокаint ugad;int mesto;// угадано чисел//из них на своих местахint i,j;time__t t;// индексыprintf ("\пКомпьютер задумал трехзначное числоЛп");printf("Bbi должны его отгадать.\п");printf("После ввода очередного числа вам будет " ) ;printf("сообщено, сколько цифр угадано, и сколько");printf ("из них находится на своих местахЛп");printf("После ввода числа нажимайте <Enter>\n");srand((unsigned)time(&t) );for (i = 0; i < N; i++) // компьютер "задумывает" числоcomp[i] = rand О % 10 + 48; // 48 - код символа 'О*#ifdef DEBUGprintf("Компьютер задумал: " ) ;for (i == 0; i < N; i++)printf("%c", comp[i]);printf("\n");#endifdo {printf("\nBam вариант-> " ) ;scanf("%s", &igrok);// массив вводим как строкуfor (i = 0; i < N; i++) a[i] = 0;// проверим, сколько цифр угаданоugad = 0;for (i = 0 ; i < N; i++)// каждую цифру игрокаfor (j = 0; j < N; j++) // сравним с цифрами// компьютера{if ((igrok[i] == comp[j]) && !a[j]){ugad++;158C/C++ в задачах и примерахa[j] = 1; // запретим сравнивать// эту цифру компьютера с оставшимися,// еще не проверенными, цифрами игрокаbreak;}}// проверим, сколько на своих местахmesto = 0;for (i = 0; i < N; i++)if (igrok[i] == comp[i]) inesto++;printf("Угадано: %i.
Ha своих местах: %i", \ugad, mesto);} while ((ugad < N) || (mesto < N));printf("\n*** ВЫ УГАДАЛИ ЧИСЛО! ***\n");printf("\пДля завершения нажмите <Enter>");getch();}Задача 184// Телеграф - передача сообщений при помощи азбуки Морзе#include "stdio.h"#include "conio.h"#include "string.h" // strlen#include "dos.h"// delay// параметры передачи#define TONE 100 // частота сигнала (гц)#defineLI50 // длительность (мс) "точки"#defineL2 100 // длительность (мс) "тире"#defineL350 // пауза (мс) между точками и тире одной// буквы#defineL4 100 // пауза (мс) между буквами#defineL5 150 // пауза (мс) между словамиvoid main О{// кодировка букв русского алфавитаchar *morse[] = {I»__I»if_IIIIIIIIII/ /7\•nnT159Часть II. РешенияfltlипII_«„^11»_"'_ — "IIIIII_•// Д,Е,Ж,3// И,Й,К,Л•II /// м,н,о,пII// Р,С,Т,УIIиП_„II1IIIIIIIIII•_"IIIIIIII|__IIIIIIIIII_|||_М _IIIIII_____f_II1^11IIII__ 1 |//Ф,Х,Ц,Ч/ // ш,щ,ъ,ы// ь,э,ю,я};lansigned char mes[80]; // сообщениеchar sim[4];// символ в кодировке Морзе // последовательность точек и тиреchar znak;// "передаваемый" знак - тире или точкаint i,j;// номер символа и знакаputs("\n*** Телеграф * * * " ) ;puts("Введите сообщение, которое надо передать");puts("(используйте только заглавные русские буквы)");printf("->");gets(mes);f o r ( i = 0; i < s t r l e n ( m e s ) ; i++){if(mes[i] >= 'A* &&mes[i] <='ЯМ{/ / опр>еделим код очередной буквы (ф-я Ord) сообщения/ / и получим из таблицы кодировки соответствующий/ / элемент массива - последовательность точек и тиреstrcpy(Sim, morse[mes[i]-128]);j = 0;doi f ( s i m [ j ] == ' - ' 11 s i m [ j ] == ' .
' ){putch(sim[j++]);sound(1000);if (sim[j] == '.Mdelay(LI);else delay(L2);nosound;delay(L3);}160C/C++ в задачах и примерахwhile ( sim[j] ! = » ' & & j <4 ) ;delay(L4); // пауза между буквами}elseif (mes[i] == ' ») // пробел между словами{printf(" " ) ; // пробел между словами сообщенияdelay(L5);}}puts("ХпСообщение передано!");puts("Для завершения работы нажмите <Enter>");getch();}Задача 185#include <stdio.h>#include <conio.h>#include <math.h> // для доступа к M_PI// объем цилиндраfloat veil(float h, float r){return(M_PI*r*r*h);}void mainO{float r,h; // высота и радиус основания цилиндраfloat v;// объем цилиндраputs("Вычисление объема цилиндра");printf("Введите высоту и радиус основания ->");scanf("%f%f", &h, &r)/V = veil (h, r) ;printf("Объем цилиндра %3.2f\n", v ) ;printf("Для завершения нажмите <Enter>");getch();}Часть II.
Решения161Задача 186// Функция max возвращает максимальное из двух чиселint max(int а, int b){if (a > b)return(a);elsereturn (b) ;}Задача 187// Функция compare возвращает результат сравнения/ / в виде символа отношенияtinclude "stdio.h"#include "conio.h"чиселchar compare(int a, int b){char res;if (a > b) res = '>';else if (a < b) res = *<';else res = *=';return(res);}void mainO{int xl,x2;cheu: res;// сравниваемые числа// результат сравненияputs("Введите два целых числа и нажмите <Enter>");printf("->");scanf("%i%i", &xl, &x2);res = compare(xl,x2); // вызов функции программистаprintf("%i %c %i\n", xl, res, x2);puts("\nДля завершения работы программы \нажмите <Enter>");getch();162С/С-^+ в задачах и примерахЗадача 188// Вычисляет сопротивление электрической цепиfloat sopr( float rl, float г2, int t)(// rl,r2 - величины сопротивлений// t - тип соединения://1 - последовательное;//2 - параллельное.// если тип соединения указан неверно,//то функция возвращает -1f l o a t г;i f ( t==l) г = rl + г2;e l s e i f (t== 2) г = г1*г2/(г1+г2);else г = -1;return(г);}Задача 191// Функция "факториал"#include "stdio.h"#include "conio.h"unsigned int factor(int x){unsigned int f = 1;for (int i = 2; i <= x; i++)f *= i;return(f);}void main(){unsigned int f;puts("ХпТаблица факториалов");for (int n = 1; n <= 8; n++){f = factor(n);printf("%2i %u\n", n, f);}Часть 11.