Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие2013_09_28.doc
Скачиваний:
24
Добавлен:
20.05.2015
Размер:
2.72 Mб
Скачать

Другие средства ввода-вывода символов и строк

В языке С++ имеется огромное количество средств ввода-вывода символов и строк. Многие из них представляют собой так называемые методы (функции-члены) некоторого класса (всё это — термины объектно - ориентированного программирования).

Так, для ввода строки имеются полноценные методы getline и get класса istream, объектом которого является cin. Синтаксис вызова метода: после имени объекта ставится точка, а вслед за ней пишется имя метода.

Пример.

#include <string.h>

#include <string>

#include <conio.h>

using namespace std;

int main()

{ const int n = 80;

char S1[n]; puts("введи строку");

cin.getline(S1, n);

cout << S1 << endl;

puts("введи строку");

cin.get(S1,n);

cout << S1 << endl;

_getch(); return 0;

}

Оба метода имеют два параметра: имя строки (S1) и предельное количество считываемых символов (n). Метод getline() считывает из входного потока (n–1) символов или меньше (если символ перевода строки встретится раньше) и записывает их в строковую переменную S1. Символ перевода строки ‘\n’ также извлекается из входного потока, но не записывается в строковую переменную; вместо него туда помещается нуль‑символ (‘\0’). Если же во входном потоке более (n–1) символов, очередной вызов метода getline() будет осуществлять ввод, начиная с первого ранее не считанного символа.

Метод get() работает аналогично, но оставляет во входном потоке символ ‘\n’, а в строковую переменную добавляется нуль‑символ. Пользоваться этим методом надо осторожно, учитывая, что он никак не может преодолеть во входном потоке символ ‘\n’. Так что ввести с его помощью несколько строк подряд не удастся. Выход из положения – удалить из потока символ ‘\n’, вызвав метод get() без параметров, например, так: cin.get();

Задача 111.Программа запрашивает имя пользователя и его любимый напиток, а после ответа приветствует его по имени. Используются методы getline() и get(). Программа работает корректно.

// Программа отлажена вVisual Studio 2008

#include <iostream>

#include <string.h>

using namespace std;

int main()

{ char name[25],drink[25];

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском !

wcout<<L"Как Вас зовут? ";

// cin.getline(name,25);

cin.get(name,25);

cin.get(); // преодолеть \n

wcout <<L"Ваш любимый напиток? ";

cin.getline(drink,25);

wcout<<L"Привет, "<<name<<'\n';

wcout<<L"Да, "<<drink<<L" - замечательный напиток "<<endl;

return 0;

}

Вот результаты работы этой программы:

Как Вас зовут? Бонапарт Наполеон

Ваш любимый напиток? Пиво Черномор

Привет, Бонапарт Наполеон

Да, Пиво Черномор - замечательный напиток

Ввод строк можно в принципе выполнить и посимвольно, используя одну из многочисленных функций ввода символов (getchar(), getch(), getche() или методов типа ch=cin.get() и cin.get(ch). Следует иметь в виду, что при использовании объекта cin и операции извлечения символов из потока >> нельзя осуществить полноценный ввод, т.к. пробел таким способом ввести нельзя.

Для вывода символов используются аналогичные функции и методы (putchar(), putch(), cout.put() и др.).

Функции scanf() и printf() со спецификацией формата “%c” тоже вполне пригодны соответственно для ввода и вывода символов.

Ниже приведены примеры использования удобных и надежных средств для посимвольного ввода и вывода текста.

Следует различать функции и методы буферизованного (getchar(), cin.get(), cin.get(ch) и не буферизованного ввода (getch(), getche()). В первом случае вводимые символы попадают сперва в буфер ввода‑вывода и только после нажатия клавиши «Enter» становятся доступными программе; во втором же случае после нажатия любой клавиши соответствующий символ сразу попадает в программу и доступен для обработки.

Прежде, чем перейти к рассмотрению очередного примера, обсудим, как программа должна определять конец входного потока символов, вводимых с клавиатуры. Можно, конечно, выбрать некоторый символ как признак конца потока (файла), но при этом должна быть полная уверенность, что этот символ-признак не появится среди обрабатываемых символов. Выберем сначала в качестве такового, например, символ ‘#’ или ‘\n’ (в последнем случае можно ввести не более одной строки).

Задача 112. Буферизованный ввод-вывод. Программа вводит поток символов, которые сперва попадают в буфер, а затем выводятся на экран. Вывод завершается, если в буфере обнаруживается символ ‘#’.

#include <stdio.h>

#include <conio.h>

int main()

{

char ch; clrscr();

ch=getchar();

while(ch != '#')

{

putchar(ch);

ch=getchar();

}

getch(); return 0;

}

Но обычно функции ввода символов (и getchar() в том числе) распознают некоторый неграфический символ как конец входного потока (файла). Изящным решением указанной проблемы служит введение специального признака, называемого “End of File” (конец файла), или EOF. Обычно его определение содержится в файле stdio.h и имеет вид:

#define EOF (–1)

Это даёт возможность переписать предыдущую программу как показано ниже.

Задача 113.Буферизованный ввод-вывод. Программа вводит поток символов, которые сперва попадают в буфер, а затем выводятся на экран. Вывод завершется, если в буфере обнаруживается символ EOF.

#include <stdio.h>

#include <conio.h>

main()

{

char ch; // int ch;

clrscr();

ch=getchar();

while(ch != EOF)

{

putchar(ch);

ch=getchar();

}

getch();

}

Чтобы ввести признак EOF, следует после завершения ввода символов входного потока нажать одновременно управляющую клавишу CTRL и клавишу Z (или Ctrl + D в OC Linux). Если признак EOF не срабатывает, измените тип переменной ch с char на int, чтобы иметь возможность распознать признак EOF (обратите внимание на то, как определена константа EOF); к счастью, функция getchar() возвращает значение типа int.

Программу копирования символов можно написать и более компактно. В языке Си любое присваивание, например, c = getchar(), можно использовать в выражении как операнд. Учтите, что скобки вокруг присваивания внутри условия необходимы: приоритет операции != выше приоритета операции присваивания.

Объединение в одном выражении операций присваивания и сравнения — одно из мощных средств языка, способствующее созданию ясных и компактных программ.

Задача 114.Это компактная запись предыдущей программы, которая принимает символ с клавиатуры, присваивает его переменной сh, а затем сравнивает его с признаком конца файла EOF. Пока этот признак не обнаружен, выполняется тело цикла while и символ выдается на экран. В противном случае цикл, а вместе с ним и вся программа, завершаются.

#include <stdio.h>

#include <conio.h>

void main()

{

char ch; //int ch;

clrscr();

while((ch=getchar())!=EOF)

putchar(ch);

getch();

}

Задача 115.Программа подсчитывает количество строк, слов и символов во введенном с клавиатуры тексте. Ввод завершается нажатием комбинации клавишCTRLиZ. Слово — это любая последовательность символов, не содержащая знаков табуляции '\t', пробелов и символов '\n'. Будем предполагать также, что любая строка, в том числе и последняя, завершается символом перехода на новую строку '\n'.

Напомним, что выражения, связанные логическими операциями &&(И) и || (ИЛИ), вычисляются слева направо, то есть как только истинность или ложность высказывания станет очевидной, дальнейшие вычисления прекращаются. Таким образом, если в выражении

if (s == ' ' || s == '\n' || s == '\t')

cимвол s содержит пробел, то остальные две провеки уже не делаются. Отсюда следует практически важный вывод: первыми надо проверять наиболее вероятные события.

// Программа отлажена вVisual Studio 2008

#include <iostream>

#include <string.h>

#include <stdio.h>

#include <conio.h>

using namespace std;

// Стихи Некрапушкина

int main()

{

int ch,line,word,kc,inword=0;

line=word=kc=0;

while ((ch=getchar()) != EOF)

{

kc++;

if (ch == '\n')

line++;

if (ch == ' '||ch == '\n'||ch == '\t')

inword=0;

else

if(!inword)

{ inword=1;word++;}

}

printf("\n");

printf("строк-%d\n",line);

printf("слов-%d\n",word);

printf("символов-%d\n",kc);

getch(); return 0;

}

Протокол работы программы:

Однажды, в студеную зимнюю пору,

Сижу за решеткой в темнице сырой.

Гляжу - поднимается медленно вгору

Вскормленный в неволе орел молодой.

(автор неизвестен)

^Z

строк-5

слов-23

символов-163

Задача 116.Не буферизованный ввод-вывод. Программа реализует т. н. эхопечать, используя функции getche() и putch(). Пока не обнаружен конец входного потока (не нажата клавиша Enter), программа получает с клавиатуры очередной символ (это делает функция getche()) и сразу же, минуя буфер ввода-вывода, отправляет его на экран дисплея с помощью функции putch(). Кроме того, каждый введенный символ пересылается в строкуS.

// Программа отлажена вVisual Studio 2008

#include <iostream>

#include <string.h>

#include <conio.h>

using namespace std;

int main()

{

char s[20]; int k=0;

char ch; // возможно, ch должна быть int, а не char!

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском !

wcout<<L"\nВведи строку, потом Enter ";

while(( ch = getche())!=13) //пока не нажата ENTER

{

putch(ch);

s[k++]=ch;

}

s[k]='\0';

wcout<<L"\nВ строке "<<'\"'<<s<<'\"'<< endl;

wcout<<k<<L" символов "<<endl;

getch(); return 0;

}

Задача 117. Программа наполняет строку символов S[ ], применяя метод cin.get(ch). Метод cin.eof() распознает признак конца файла EOF, который поступает во входной поток после завершения ввода символов нажатием комбинации клавиш Ctrl + Z ( или Ctrl + D в OC Linux). Результаты работы программы убеждают,что cin.get(ch) и cin.eof() — весьма удобные и надежные средства.

#include<conio.h>

#include <iostream.h>

void main()

{

char s[20],ch; int k=0;

cin.get(ch);

while(cin.eof()==0)

{

cout<<ch; s[k]=ch;

k++;

cin.get(ch);

}

s[k]='\0';

cout<<"\nВ строке "<<'\"'<<s<<'\"'<< endl;

cout<<k<<" символов "<<endl;

getch();

}

Задача 118. Программа наполняет строку символов S[], применяя метод cin.get(ch). Метод cin.eof() не применяется, признак конца файла распознает сама функция cin.get(ch). Посимвольный вывод осуществляется методом cout.put(ch).

#include<conio.h>

#include <iostream.h>

void main()

{

char s[20],ch; int k=0;

while(cin.get(ch)) //пока не нажаты Ctrl+Z

{

cout.put(ch);

s[k++]=ch;

}

s[k]='\0';

cout<<"\nВ строке "<<'\"'<<s<<'\"'<< endl;

cout<<k<<" символов "<<endl;

getch();

}

Задача 119. Программа наполняет строку символов S[], применяя еще один метод — cin.get() без аргументов (Вызов: ch= cin.get()). Функция аналогична getchar(). Посимвольный вывод осуществляется методом cout.put(ch).

// Программа отлажена вVisual Studio 2005

#include <iostream>

#include <string.h>

#include <stdio.h>

#include <conio.h>

using namespace std;

int main()

{

char s[20]; int k=0;

char ch; // возможно, ch должна быть int, а не char!

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском !

wcout<<L"\nВведи строку, потом Enter, CTRL и Z ";

while((ch=cin.get()) != EOF) //пока не нажаты Ctrl+Z

{

cout.put(ch);

s[k++]=ch;

}

s[k]='\0';

wcout<<L"\nВ строке "<<'\"'<<s<<'\"'<< endl;

wcout<<k<<L" символов "<<endl;

getch(); return 0;

}

Задача 120. Ввести строку текста (до 40 символов). Переслать ее символы в другую строку, изменив порядок их следования на обратный и вывести перевернутую строку на экран.

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

void main()

{

char s1[40], s2[40];

int i, k;

cout<<"Введи строку текста: ";

gets(s1);

i=0;

while(s1[i]!='\0')

i++;

i--; // сойти с нуль-символа

k=0;

while(i>=0)

{

s2[k]=s1[i];

k++; i--;

}

s2[k]=0; //вставить нуль-символ

puts(s2);

getch();

}

Задача 121.Ввести строку текста (до 80 символов). Переслать ее символы в другую строку, изменив порядок их следования на обратный и вывести перевернутую строку на экран. Второй вариант.

#include<stdio.h>

#include<conio.h>

void main()

{ int i=0,k=0;

char s1[80],s2[80];

puts("введи строку");

gets(s1);

while(s1[i])

i++;

while(i>0)

s2[k++]=s1[--i];

s2[k]='\0'; //вставить нуль-символ

puts(s2);

getch();

}

Задача 122.Ввести строку текста (до 80 символов). Изменить порядок следования символов строки на обратный и вывести перевернутую строку на экран. Вспомогательную строку не использовать.

// Программа отлажена вVisual Studio 2008

//перевернуть строку

#include<stdio.h>

#include<conio.h>

void main()

{ int i=0, k=0; char rab;

char s1[80];

puts("введи строку");

gets(s1);

while(s1[i])

i++; // поиск конца строки

for (k=0; k < i; k++ )

{ rab = s1[--i]; // сойти с нуля

s1[i] = s1[k];

s1[k] = rab;

}

// нуль-символ остается на месте !

puts(s1); getch();

}

Задача 123.Пользователь вводит строку текста (до 100 символов). Программа запрашивает пользователя, какой символ нужно удалить и удаляет из строки все такие символы. Используется функция delchar().

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

void delchar(char s[], char c)

{

int i=0, k=0;

while(s[i]!=0)

{

if(s[i]!=c)

s[k++]=s[i];

i++;

}

s[k]=0;

}

// Главная

void main()

{

const char m=100;

char s1[m]; char r;

cout<<"Введи строку: ";

gets(s1);

cout<<"Введи удаляемый символ: ";

cin>>r;

delchar(s1, r);

cout<<"\n"<<s1;

getch();

}

Задача 124.Удалить из введённой строки символов все цифры.

// Программа отлажена в Visual Studio 2008

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include<iostream>

using namespace std;

void delcifr(char s[])

{

int i=0, k=0;

while(s[i]!=0)

{

if(s[i]<'0' || s[i]>'9')

{

s[k]=s[i];

k++;

}

i++;

}

s[k]=0;

}

// Главная

void main()

{

const char m=100; char s1[m];

setlocale (NULL, ".1251");

cout<<"Введи строку: ";

gets(s1);

delcifr(s1);

cout<<"\n"<<s1;

getch();

}

Задача 125.Программа является вспомогательной и позволяет распознать код любой нажатой клавиши; в частности, программа распознает клавиши управления курсором (Home, End, PgUp, клавиши‑стрелки и др.). Их особенность в том, что они имеют расширенный код (так называемый скэн‑код), состоящий из двух байтов и первый из них — нулевой (или 0x0E).

// Программа отлажена вVisual Studio 2008

//Chr_Cod4 Распознаватель обычных и управляющих клавиш

#include "stdafx.h"

#include<conio.h>

#include <iostream>

using namespace std;

int main()

{

unsigned short int ch;

//Устанавливаем локализацию для выходного потока

wcout.imbue(locale("rus_rus.866"));

do

{

wcout<<L"\nВведи символ ";

if((ch=_getch())==0xE0 ||ch==0) // если первый байт=0 или 0xE0

{

ch=_getch(); // то читаем второй байт

wcout<<L"Спецклавиша её скэн-код - "<<ch<<'\n';

switch(ch)

{

case 72: wcout<<L"Стрелка вверх"; break;

case 75: wcout<<L"Стрелка влево"; break;

case 77: wcout<<L"Стрелка вправо"; break;

case 80: wcout<<L"Стрелка вниз"; break;

case 71: wcout<<L"Стрелка Home"; break;

case 73: wcout<<L"Стрелка PageUp"; break;

case 79: wcout<<L"Стрелка End"; break;

case 81: wcout<<L"Стрелка PageDown";break;

default: wcout<<L"He знаю...";

}

wcout<<"\n";

}

else

wcout<<L"Обычная клавиша "<<(char)ch<<L" Её код "<<ch<<endl;

wcout<<L"Продолжать(y/n)?";

ch=_getch();

}

while ( ch=='y'||ch=='Y' ||ch==173 || ch==141);

//'н' //'Н'

// Русский текст набран в коде ANSI (среда Windows),

// а выполняется программа в консоли, где используется

// кодировка ASCII, и кириллица кодируется не так, как в ANSI

return 0;

}

Задача 126.Программа, используя клавиши управления курсором (см. предыдущую задачу), задает направление перемещения по экрану символас кодом 006. В заданном направлении символ перемещается самостоятельно. Esc — конец.

//Программа отлажена в Borland C++ Builder 6 17.03.2008

#pragma hdrstop

#pragma argsused

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

#include <dos.h>

int main()

{

int x,y;

int i,j,maxx=79,maxy=24;

unsigned char c='\006', ch;

i=maxx/2;j=maxy/2; x=0;y=0;

clrscr();gotoxy(i,j);

while(1)

{

if(kbhit()) // нажата ли клавиша?

{

ch=getch(); if(ch==27) break;

if(ch==0) ch=getch(); // читать 2-й байт

switch(ch)

{

case 72: x=0; y=-1; break; // стрелка вверх

case 75: x=-1; y=0; break; // стрелка влево

case 77: x=1; y=0; break; // стрелка вправо

case 80: x=0; y=1; break; // стрелка вниз

case 71: x=-1; y=-1; break; // Home

case 73: x=1; y=-1; break; // Page Up

case 79: x=-1; y=1; break; // End

case 81: x=1; y=1; break; // Page Down

}

}

i+=x; j+=y;

if(i<1) {i=1;j++;}

if(i>maxx-1) {i=maxx-1;j++;}

if(j<1) {j=1;i++;}

if(j>maxy-1) { j=maxy-1; i++;}

gotoxy(i,j); putch(c);

Sleep(100); // Задержка выполнения программы

clrscr();

}

return 0;

}

Задача 127.Программа позволяет перемещать по экрану символс кодом 006, используя клавиши управления курсором.Esc — конец.

//Программа отлажена в Borland C++ Builder 6 17.03.2008

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <dos.h>

int main()

{

int x,y,k;

int i,j,si,sj,maxx=79,maxy=24;

unsigned char c='\006', ch;

textbackground(7);

i=maxx/2;j=maxy/2;

x=0;y=0; clrscr();

textcolor(5); gotoxy(2,24); cprintf("ESC to Exit");

gotoxy(i,j); putch(c);

si=i; sj=j; //старые координаты

while((ch=getch()) !=27)

{

if(ch==0) //&& kbhit())

ch=getch();

switch(ch)

{

case 72: x=0;y=-1; break;

case 75: x=-1; y=0; break;

case 77: x=1; y=0; break;

case 80: x=0; y=1; break;

case 71: x=-1; y=-1; break;

case 73: x=1; y=-1; break;

case 79: x=-1; y=1; break;

case 81: x=1; y=1; break;

}

i+=x; j+=y;

if(i<1) {i=1; j++;}

if(i>maxx-1) {i=maxx-1;j++;}

if(j<1) {j=1;i++;}

if(j>maxy-1) {j=maxy-1;i++;}

gotoxy(si,sj); putch(' ');

gotoxy(i,j); putch(c);

si=i; sj=j; //старые координаты

}

getch(); return 0;

}

Ниже решается та же проблема, что что и в предыдущей задаче , но реализация осуществлена в Visual Studio 2008

// управление курсором

// Программа отлажена в Visual Studio 2008 16.03.2010г

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include <windows.h> // обязательно!

#include<iostream>

using namespace std;

// функция устанавливает цвет текста и подложки в консоли (локальное)

void SetColor(int text, int background)

{

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));

}

// функция позиционирует курсрор в точку (х, у)

void goto_xy (int x, int y)

{

COORD cd;// координаты курсора

HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);

cd.X=x;

cd.Y=y;

SetConsoleCursorPosition(hd,cd);

}

int main()

{

int x,y,k;

int i,j,si,sj,maxx=79,maxy=24;

unsigned char c='\006', ch;

// Управление цветом - глобальное и локальное

//const int NotUsed = system( "color 20" );

// 2 - значение цвета фона, 0 - значение цвета текста

system( "color 17" );// 1-синий фон, 7-серые буквы глобально

i=maxx/2;j=maxy/2;

x=0;y=0; system("cls"); // очистка экрана

SetColor(14,1); // (локальное текст и фон)

goto_xy(2,24); cprintf("ESC to Exit");

goto_xy(i,j); putch(c);

si=i; sj=j; //старые координаты

while((ch=getch()) !=27)

{

if(ch==0) //&& kbhit())

ch=getch();

switch(ch)

{

case 72: x=0;y=-1; break;

case 75: x=-1; y=0; break;

case 77: x=1; y=0; break;

case 80: x=0; y=1; break;

case 71: x=-1; y=-1; break;

case 73: x=1; y=-1; break;

case 79: x=-1; y=1; break;

case 81: x=1; y=1; break;

}

i+=x; j+=y;

if(i<1) {i=1; j++;}

if(i>maxx-1) {i=maxx-1;j++;}

if(j<1) {j=1;i++;}

if(j>maxy-1) {j=maxy-1;i++;}

goto_xy(si,sj); putch(' ');

goto_xy(i,j); putch(c);

si=i; sj=j; //старые координаты

}

//getch();

return 0;

}

Задача 128. Программа позволяет рисовать на экране разные фигуры, перемещая по экрану символс кодом 006 (см. предыдущую задачу).Esc — конец.

//Программа отлажена в Borland C++ Builder 6 5.04.2008

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <iostream.h>

intx, y, i, j, maxx=79, maxy=24;

unsigned char c='\002';

// функция рисования фигур,

// используя клавиши управления

put_mord(char ch)

{

switch(ch)

{

case 72: x=0; y=-1; break; // стрелка вверх

case 75: x=-1; y=0; break; // стрелка влево

case77:x=1;y=0;break; // стрелка вправо

case 80: x=0; y=1; break; // стрелка вниз

case 71: x=-1; y=-1; break; // Home

case 73: x=1; y=-1; break; // Page Up

case 79: x=-1; y=1; break; // End

case 81: x=1; y=1; break; // Page Down

}

i+=x; j+=y;

if(i<1) {i=1; j++;}

if(i>maxx-1) {i=maxx-1;j++;}

if(j<1) {j=1;i++;}

if(j>maxy-1) {j=maxy-1;i++;}

gotoxy(i,j); putch(c);

Sleep(400);

}

voidmain()

{

unsigned char ch;

i=maxx/2;j=maxy/2;

x=0;y=0; textbackground(6);

textcolor(5); clrscr();

gotoxy(i,j); putch(c);

while((ch=getch()) != 27)

{

if(ch==0)

ch=getch();

put_mord(ch);

}

getch();

}

Задача 129. Программа расставляет в случайно выбранных точках экрана ”фишки” — разноцветные символы с кодом 03. Далее программа дает возможность перемещать клавишами “стрелка влево ” и “стрелка вправо” вдоль нижней строки экрана “пушку” — символ с кодом 02 и сбивать фишки нажатием клавиши “стрелка вверх”. По завершении игры (нажать Esc) выдается сообщение о затраченном времени. Для генерации случайных чисел в средеBorlandC++Builderиспользована пара функцийrandomize() иrandom().

// Программа отлажена в Borland C++ Builder 6

// «стрелялка» на время!!!

// сбивать фишки, используя клавиши управления

// стрельба — по стрелке вверх

#include<stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <dos.h>

intmain()

{

intx,y,k;

inti,j,si,sj, maxx=79, maxy=24;

unsigned char c='\002', ch, c1='\03';

structtime t;

ints1, m1, h1,s2, m2, h2;

randomize(); textbackground(6);

i=maxx/2;j=maxy-1;

x=0; y=0;

clrscr();

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

{

textcolor(random(15));

gotoxy(random(79)+1,random(24)+1);

putch(c1);

}

textcolor(1);

gotoxy(i,j);

putch(c);

si=i; sj=j; //старые координаты

gettime(&t);

s1=t.ti_sec;

m1=t.ti_min;

h1=t.ti_hour;

while((ch=getch()) !=27)

{

if(ch==0)

ch=getch();

switch(ch)

{

case72:

for(k=24;k>+0;k--)

{ gotoxy(i,k); //puts("Бабах");}

putch(' '); Sleep(120);

}

break;

case 75: x=-1; y=0; break;

case 77: x=1; y=0; break;

}

i+=x;

if(i<1) i=1;

if(i>maxx-1) i=maxx-1;

gotoxy(si,sj); putch(' ');

gotoxy(i,j); putch(c);

si=i; sj=j; //старые координаты

}

gettime(&t);

s2=t.ti_sec;

m2=t.ti_min;

h2=t.ti_hour;

printf("\nGAME START:\n %2d час %02d мин %02d сеk\n",h1, m1, s1);

printf("\nGAME OVER :\n %2d час %02d мин %02d сеk\n",h2, m2, s2);

getch();return 0;

}

Задача 130. Вычислить, сколько раз в строке встречается каждый ее символ. Каждый протестированный символ удаляется функцией delchr().

// Программа отлажена в Visual Studio 2008

#include "stdafx.h"

#include<conio.h>

#include <iostream>

#include <string.h>

using namespace std;

int delchr(char s1[],char ch)

{ int i=0,k=0;

while (s1[i])

{

if(s1[i]!=ch)

s1[k++]=s1[i];

i++;

}

s1[k]=0;

return (i-k); //количество удаленных символов

}

int main()

{ char s1[30],ch; char s2[30];

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском !

wcout<< L"Введите строку ";

gets(s1); strcpy (s2, s1);

while (ch=s1[0]) //символы "наплывают" на 0 после удаления

{

wcout<<L"символ "<<ch<<L" встречается "

<<delchr(s1, ch)<<L" раз\n";

}

puts(s2);

getch();return 0;

}

Задача 131.Программа определяет, какой из символов строки встречается в ней наиболее часто. Каждый протестированный символ удаляется функцией delch().

// какая из букв встречается наиболее часто

// Программа отлажена в Visual Studio 2008

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

void delch ( char s1[],char ch)

{

int i=0,k=0;

while (s1[i])

{

if(s1[i]!=ch)

{

s1[k]=s1[i];

k++;

}

i++;

}

s1[k]=0;

}

int main()

{

char s1[80]; int max=0;

int i,k; char ch,c;

puts("Введи строку"); gets(s1);

while ((ch=s1[0]) !='\0')

{

i=0; k=0;

while (s1[i])

{

if(s1[i]==ch)

k++;

i++;

}

if (k>max)

{

max=k;

c=ch;

}

delch (s1,ch);

}

if(max!=1)

cout<<"Символ "<<c<<" встречается наибольшее число раз-"<<max;

else

cout<<"Все символы равноправны"

;

getch();return 0;

}

Задача 132.Программа определяет в строке самую длинную цепочку повторяющихся подряд символов.

// Программа отлажена в Visual Studio 2008

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

int main()

{

int i,m,j; char s1[80];

i=j=m=1;

printf("введи cтроку\n");

gets(s1);

while(s1[i])

{

if(s1[i]==s1[i-1])

j++;

else

{ if(j>m)

m=j;

j=1;

}

i++;

}

printf(" max = %d raz\n", (j>m)? j : m);

getch(); return 0;

}

Задача 133.Вводится строка, состоящая из 5 разных символов. Вывести на экран все их возможные перестановки и количество таких перестановок.

// Программа отлажена в Visual Studio 2008

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

int main()

{

char s[6]="12345";

int i, j, k, l, m, n=0;

char a, b, c, d, e;

for(i=0; i<5; i++)

{

a=s[i];

for(j=0; j<5; j++)

{

b=s[j];

for(k=0; k<5; k++)

{

c=s[k];

for(l=0; l<5; l++)

{

d=s[l];

for(m=0; m<5; m++)

{

e=s[m];

if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&

b!=d&&b!=e&&c!=d&&c!=e&&d!=e)

{

n++;

cout<<a<<b<<c<<d<<e<<"\n";

}

}

}

}

}

}

cout<<" Всего вариантов: "<<n;

getch(); return 0;

}

Задача 134.Вводится строка, начинающаяся, может быть, с пробелов. Посчитать, сколько букв содержит её первое слово. Вывести на экран это слово и количество букв.

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include <dos.h>

void main()

{

clrscr();

char s1[40];

int k=0, i=0;

cout<<"Введи строку ";

gets(s1);

while(s1[i]==' ')

i++;

while(s1[i]!=' '&&s1[i]!=0)

{

k++;

i++;

}

s1[i]=0;

puts(s1);

cout<<"В первом слове "<<k<<" букв!";

getch();

}

Задача 135. Слова в заданной фразе отделены друг от друга несколькими пробелами. Программа позволяет найти и выдать на экран слова, которые начинаются на заданную букву (здесь — «s»).

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <dos.h>

voidmain()

{

chars1[30];

int i;char ch;

clrscr();

puts("Введи строку с пробелами между словами ");

gets(s1);

puts(s1);

ch='s';

i=0;

while(s1[i]!='\0')

{

while(s1[i] == ' ')

i++;

if(s1[i]==ch)

while(s1[i]!=' '&& s1[i]!=0)

putchar(s1[i++]);

else

while(s1[i]!=' '&& s1[i]!=0)

i++;

}

getch();

}

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

# include<stdio.h>

# include<conio.h>

main()

{

charS[80];

int i=0; char ck,c;

clrscr();

puts("Введи строку с пробелами");

gets(S);

i=0;

puts("Введи букву");

c=getchar();

while(S[i]) i++;

while(--i>0) //i>=0 не работает для одного слова

{

while(S[i]==' ')

i--;

S[i+1]='\0';

ck=S[i];

while(S[i]!=' ' && i>0) // первое слово!

i--;

if(ck==c)

puts(&S[i]); // с ведущим пробелом...

}

getch();

}

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

#define L 80

#include <stdio.h>

#include <conio.h>

voidmain()

{

charS1 [L];

intk,i=0,nw,kw;

clrscr();

puts ("Введи фразу, слова отделены пробелами");

gets (S1);

while(S1[i])

{

while(S1[i]==' ')

i++;

nw=i;

while(S1[i]!=' '&& S1[i]!='\0')

i++;

kw=i-1;

if(S1[nw]==S1[kw])

{

for(k=nw;k<=kw;k++)

putchar(S1[k]);

putchar ('\n');

}

}

getch();

}

Задача 138. Слова в заданной фразе отделены друг от друга несколькими пробелами Программа меняет в каждом слове заданной строки порядок букв на противоположный (обращает в строке каждое слово).

// Программа отлажена в Visual Studio 2008

#include <iostream>

using namespace std;

#include <stdio.h>

int main()

{

char r, s1[80]; int nw,kw,i=0;

puts ("INPUT STRING ");

gets(s1);

while(s1[i])

{ //пропуск пробелов до слова

while(s1[i]==' ') //&&s1[i])-не обязательно!

i++;

nw=i;

//пропуск слова

while(s1[i]!=' ' && s1[i]!='\0')

i++;

kw=i-1;

//переворот

while(kw>nw)

{

r=s1[nw];s1[nw]=s1[kw];

s1[kw]=r;kw--;nw++;

}

}

puts(s1); return 0;

}

Задача 139.Программа пересылает из заданной строки S1 цифры в строку S2, а латинские буквы - в строку S3. Используется функция.

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

void buk_zufr(char s1[],char s2[],char s3[])

{

inti=0,k=0,t=0;

while(s1[i]!='\0')

{

if(s1[i]>'0' && s1[i]<'9')

s2[k++]=s1[i];

else

if((s1[i]>'A' && s1[i]<'Z') || (s1[i]>'a' && s1[i]<'z'))

s3[t++]=s1[i];

i++;

}

s2[k]='\0';

s3[t]='\0';

}

voidmain()

{

chars1[20],s2[20],s3[20];

clrscr();

puts("Vvedi ctroky");

gets(s1);

buk_zufr(s1,s2,s3);

puts(s2);

puts(s3);

getch();

}

Задача 140.Программа пересылает символы строки S1 в строку S2 в обратном порядке, а затем сцепляет S1 и S2, образуя палиндром.

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <string.h>

void make_palindrom(char s1[],char s2[])

{

inti=0,k=0;

while(s1[i]!='\0')

i++;

i--;

while(i>=0)

s2[k++]=s1[i--];

s2[k]='\0';

strcat(s1,s2);

}

voidmain()

{

chars1[80],s2[20];

clrscr();

puts("Vvedi ctroky");

gets(s1);

make_palindrom(s1,s2);

puts(s1);

getch();

}

Задача 141.Программа использует собственную функцию del( ) и стандартную функцию strcat( ) для удаления из заданной строки S[ ] подстроки длиной L символов, начиная с символа с номером K.

// Программа отлажена в Visual Studio 2008

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

void del(char s[], int k, int l)

{

int n=strlen(s);

if(k>n)

return;

s[k]='\0'; //начало удаляемой подстроки

if(k+l>=n)

return; //удаляем "хвост" строки

strcat(s,&s[k+l]); //сцепление

}

int main()

{

int k,l; char s[40];

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском !

wcout << L"Введи строку "; gets(s);

wcout << L"Введи k и l "; scanf("%d %d",&k,&l);

del(s,k-1,l);

puts(s);

getch();return 0;

}

Задача 142.Решается та же проблема, что и в предыдущей задаче, но функция strcat( ) не используется.

// Программа отлажена в Visual Studio 2008

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

void del(char s[], int k, int l)

{

int n=strlen(s),i ,j;

if(k>n)

return;

s[k]='\0'; //начало удаляемой подстроки

if(k+l>=n)

return; //удаляем "хвост" строки

i=k; j=k+l;

while(s[i++]=s[j++]); //сцепление

}

int main()

{

int k,l; char s[40];

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском !

wcout << L"Введи строку "; gets(s); ///endl;

wcout << L"Введи k и l "; scanf("%d %d",&k,&l);

del(s,k-1,l);

puts(s);

getch();return 0;

}

Задача 143.Программа вводит последовательно целые десятичные числа (Q-конец работы) и с помощью функции itobs( ) преобразует последовательность двоичных цифр числа в эквивалентную строку символов. Программа не зависит от размера данных типа int и может без всяких переделок использоваться в операционных системах, где данные типа int имеют различную длину.

// Программа отлажена вVisual Studio 2008

#include<stdio.h>

#include <iostream>

using namespace std;

const int size=8*sizeof(int);

//заполнение строки с конца

void itobs(int n, char bs[])

{

for (int i=size-1; i>=0; i--)

{

bs[i]=(n & 1)+'0';

n>>=1;

}

bs[size]='\0';

}

int main()

{

char str1[size+1]; setlocale(NULL, ".1251");

int num ; printf("Введи число или Q ");

while (scanf("%d",&num)==1)

{

itobs (num,str1);

printf ("%d будет %s \n",num,str1);

printf("Введи число или Q ");

}

return 0;

}

Задача 144.Слова в заданной фразе отделены друг от друга несколькими пробелами. Удалить из строки те слова, в которых есть одинаковые буквы. Проверку наличия в слове одинаковых букв реализует функция YES_NO( ).

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include <stdio.h>

#include <string.h>

#include <iostream>

#include <conio.h>

using namespace std;

int YES_NO(char s[])

{

int i,j,k; char c;

k=strlen(s);

for(i=0;i<k-1;i++)

{

c=s[i];

for(j=i+1;j<k;j++)

if(c==s[j]) //буква повторяется

return(0);

}

return(1);

}

int main()

{

int i=0,j,n;

char s1[]=" мама мыла раму мылом ", word[15];

static char s2[]="";

puts(s1);

while(i < strlen(s1))

{

//пропуск пробелов перед словом

while(s1[i]==' ')

i++;

j=0;

//выделение слова

while(s1[i] != ' ' && s1[i] != '\0')

word[j++]=s1[i++];

//конец слова

word[j++]=' '; word[j]='\0';

puts(word);

//если нет повторяющихся букв

if(YES_NO(word))

strcat(s2,word); //сцепление слов

}

puts(s2);

getch();return 0;

}

Задача 145.Создать функцию, определяющую, состоят ли два заданных слова из одинаковых литер и отличаются, быть может, только их порядком (таковы, например, словаабракадабраибарадакбара).

// Программа отлажена вVisual Studio 2008

#include <stdio.h>

#include <conio.h>

#include <string.h>

// Сортировка литер

void ch_sort(char a[])

{ int i,k,n=strlen(a);char p;

for(i=0; i<n-1; i++)

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

if(a[i]>a[k])

{

p=a[i];

a[i]=a[k];

a[k]=p;

}

}

// Функция проверяет, состоят ли 2 слова из одинаковых букв

// возвращает значение типа bool

bool twoword(char s1[], char s2[])

{

ch_sort(s1); ch_sort(s2);

// puts(s1); puts(s2);

if (strcmp(s1,s2))

return false ;

else

return true ;

}

//основная

int main()

{

char s1[]="арбадакарба",

s2[]="барадакбара" ;

if(twoword(s1,s2))

puts("cлова из одинаковых литер_YES");

else

puts("cлова из неодинаковых литер_NO");

getch();return 0;

}