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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



 

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

Так, для ввода строки имеются полноценные методы 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;

}

 



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 452; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 54.174.85.205 (0.24 с.)