Ввод-вывод символьных данных и строк 


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



ЗНАЕТЕ ЛИ ВЫ?

Ввод-вывод символьных данных и строк



1) Ввод-вывод одиночного символа

getchar() – функция (без параметров) используется для ввода одиночного символа из входного потока. Она возвращает 1 байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.

putchar(ch) – функция используется для вывода одиночного символа, то есть помещает в стандартный выходной поток символ ch. Аргументом функции вывода может быть одиночный символ (включая знаки, представляемые управляющими последовательностями), переменная или функция, значением которой является одиночный символ.

Например:

/*Программа вводит из входного потока один символ, а затем выводит его на экран*/

#include <stdio.h>

void main() {

сhar ch;

ch=getchar();

putchar(ch);

}

 

Пример 2. Введите предложение, в конце которого стоит точка, и подсчитайте общее количество символов, отличных от пробела (не считая точки).

#include <stdio.h>

void main() {

char z; //z - вводимый символ

int k; //k - количество значащих символов

printf("Напишите предложение с точкой в конце:\n");

for (k=0; (z=getchar())!='.';)

/*выражение z=getchar() заключено в скобки, так как

операция присваивания имеет более низкий ранг,

чем операция сравнения*/

if (z!=' ')

k++;

printf("\nКоличество символов=%d",k);

}

 

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

Напишите предложение с точкой в конце:

1 2 3 4 5 6 7 8 9 0.

Количество символов=10

2) Ввод-вывод стандартного текстового(символьного) потока

gets(s) – функция, которая считывает строку s из стандартного потока до появления символа '\n', сам символ '\n' в строку не заносится.

puts(s) – функция, которая записывает строку в стандартный поток, добавляя в конец строки символ '\n', в случае удачного завершения возвращает значение больше или равное 0 и отрицательное значение (EOF = -1) в случае ошибки.

 

Например:

#include <stdio.h>

void main() {

char s[20];

gets(s);

puts(s);

}

Результат выполнения программы: при вводе строки "123 456 789" чтение данных осуществляется побайтно до символа '\n', то есть в s занесется строка "123 456 789\0" (управляющая последовательность '\0' на экран не выводится, а является признаком конца строки). При выводе строки функция puts возвращает в конце строки дополнительно один символ '\n', следовательно, будет выведена строка "123 456 789\n" (управляющая последовательность '\n' на экран не выводится, а осуществляет перевод курсора на новую строку).

 

Пример 3. Вычислите длину строки

#include <stdio.h>

void main() {

char st[100];

int i=0;

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

gets(st);

while(st[i++]);

printf("Длина введенной строки = %i\n",i-1);

}

 

3) Стандартные потоки ввода-вывода символьных данных и строк

cin – оператор, который определяет стандартные потоки ввода данных.

cout – оператор, который определяет стандартные потоки вывода данных.

<< – операция записи данных в поток;

>> – операция чтения данных из потока.

Например:

#include <iostream.h>

void main() {

char s[20];

cin>>s; //ввод строки из стандартного потока

cout<<s; //вывод строки в стандартный поток

}

Результат выполнения программы: при вводе строки "123 456 789" чтение данных осуществляется побайтно до первого пробела, то есть в s занесется только первое слово строки "123\0", следовательно, выведется: "123".

Пример 4. Введите слово и замените в нем все вхождения заглавной латинской 'A' на малую латинскую 'a'. Выведите слово после редактирования.

#include <iostream.h>

void main(){

char st[80];

int i;

cout << "\nВведите слово: ";

cin >> st;

for(i=0;st[i]!=’\0’;i++)

if (st[i]=='A') st[i]='a';

cout << "\nСлово после редактирования: "<< st;

}

 

4) Форматированный ввод-вывод символьных данных и строк

printf() – функция, осуществляющая форматированный вывод данных.

scanf() – функция, осуществляющая форматированный ввод данных.

%c – спецификатор формата ввода-вывода одиночного символа.

%s – спецификатор формата ввода-вывода строки символов.

Например:

#include <stdio.h>

void main() {

char s[20];

scanf("%s",s);

//для строк не используется обращение по адресу &

printf("%s",s);

}

Результат выполнения программы: при вводе строки "123 456 789", чтение данных осуществляется побайтно до первого пробела, то есть в строку s занесется только первое слово строки "123\0", следовательно, выведется: "123". Так как s – имя символьного массива, то есть адрес его первого элемента, операция & в функции scanf не используется.

 

Пример 5. Записать введенную строку символов в обратном порядке.

#include <stdio.h>

void main(){

char st[80];

char temp;

int i,len=0;

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

scanf("%s",st);

while (st[len++]); //вычисление длины строки

len-=2;//поправка на символ конца строки и нумерацию с нуля

for(i=0;i<len;i++,len--){

temp=st[i]; //обмен символов

st[i]=st[len];

st[len]=temp;

}

printf("\nПолученная строка > %s",st);

}

Внутренние коды символов

В языке С++ принято соглашение, что везде, где синтаксис позволяет использовать целые числа, можно использовать и символы, то есть данные типа char, которые при этом представляются числовыми значениями своих внутренних кодов. Такое соглашение позволяет сравнительно просто упорядочивать символы, обращаясь с ними как с целочисленными величинами. Например, внутренние коды десятичных цифр в таблицах кодов ASCII упорядочены по числовым значениям, поэтому несложно перебрать символы десятичных цифр в нужном порядке.

//Печать десятичных цифр и их кодов

#include <stdio.h>

void main() {

char z;

for (z='0'; z<='9'; z++) {

if (z=='0' || z=='5')

printf ("\n");

printf("%c - %x ",z,z);

}

}

 

Пример 6. Вывести на экран вторую часть таблицы кодировки символов (символы с кодами от 128 до 255). Таблица должная состоять из восьми колонок и шестнадцати строк.

#include <stdio.h>

#define SM 128

void main() {

unsigned char ch;

/*если ch объявить как char, то буквам русского алфавита

будут соответствовать отрицательные коды*/

int i,j;

printf("Таблица ASCII кодировки символов\n");

for (i=0; i<16; i++) { // шестнадцать строк

ch=i+SM;

for (j=1; j<=8; j++) { // восемь колонок

printf ("%5c -%4i",ch,ch);

ch+=16;

}

printf ("\n");

}

}

Задания

1. Наберите коды программ из Примеров 3, 4 и 5. Выполните компиляцию и запуск программ

2. Введите предложение, слова в котором разделены пробелами и в конце которого стоит точка. Удалите повторяющиеся пробелы между отдельными словами (оставляя по одному пробелу), вывести отредактированное предложение на экран.

3. Дана строка. Выполните синтаксический анализ текста. Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.

Введите строку

Город Тула основан в 1946 г. I was burn in Tula in 1991.

Во введенной строке:

малых русских букв – 16

заглавных русских букв – 2

малых латинских букв – 14

заглавных латинских букв – 2

цифровых символов –8

остальных символов – 14

4. Напишите программу, которая проверяет, является ли введенная с клавиатуры строка целым числом (знак числа не учитывать). Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.

Введите число: 24.5

Введенная строка не является целым числом.

Домашние задания

1. Наберите коды программ из Примеров 1, 2 и 6. Выполните компиляцию и запуск программ.

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

Введите данные:

Фамилия > Кузнецов

Имя > Евгений

Отчество > Петрович

Уважаемый Кузнецов Е.П.! Вы прошли регистрацию.

3. Введите строку и символ. Определите частоту появления данного символа в строке. Частота вычисляется как отношение количества данных символов в строке к длине всей строки (пробелы учитываются, а символ конца строки не учитывается). Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.

Введите строку > Мама мыла раму.

Введите символ > а

Частота появления символа 'а' в строке "Мама мыла раму." равна 0,27


Лабораторная работа 26

Функции для работы со строками

 

Цель работы: научиться использовать в программе функции для работы со строками в языке C++.

Теоретические сведения

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

В программах взависимости от типа вызовы функций для работы со строками задаются в виде:

ИмяФ(СписокАргументов);

или

ИмяПерем=ИмяФ(СписокАргументов);

где ИмяФ – имя функции;

СписокАргументов – список аргументов, передаваемых в тело функции;

ИмяПерем – идентификатор соответствующего типа.

Например:

y=strlen(st);

/*объекту y присвоить значение длины строки st*/

 

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

· Функции, работающие с регистрами, распространяются только на латиницу.

· В С++ некоторые параметры функций обработки символов принадлежат типу int (unsigned), поэтому, если число станет больше 128 (255), функция будет работать с ошибкой.

· Перед первым обращением к строке она должна быть объявлена и проинициализирована. Во многих случаях пустую строку необходимо бывает задать в качестве начального значения строки. Такую инициализацию можно выполнить с помощью вызова функции strcpy(s, " ");, но более эффективным будет присваивание *s=0;.

· Функции копирования (кроме strncpy) не проверяют длину строки. Размер строки-приемника должен быть больше, чем размер источника на 1 символ (для символа ’\0’).

При вызове функции strncpy следует помнить, что, если длина копируемой строки превосходит параметр kol, то строка-получатель не будет завершена символом ’\0’. В этом случае такой символ надо дописывать в конец строки вручную.


 

Функции для работы со строками – файл stdlib.h
Краткое описание действий преобразует строку str в вещественное число типа double преобразует строку str в целое число типа int преобразует строку str в целое число типа long преобразует целое v в строку str. При изображении числа используется основание baz (2≤baz≤36). Для отрицательного числа и baz=10 первый символ «минус» (–). преобразует длинное целое v в строку str. При изображе-нии числа используется основание baz (2≤baz≤36). преобразует беззнаковое длинное целое v в строку str
Прототип double atof (const char *str); int atoi (const char *str); long atol (const char *str); char *itoa (int v, char *str, int baz); char *ltoa (long v, char *str, int baz); char *ultoa (unsigned long v, char *str, int baz);
Функция atof atoi atol itoa ltoa ultoa
Функции для работы со строками – файл string.h
Краткое описание действий приписывает строку si к строке sp (конкатенация строк) ищет в строке str первое вхождение символа с сравнивает строки str1 и str2. Результат отрицателен, если str1<str2; равен нулю, если str1==str2, и положителен, если str1>str2 (сравнение беззнаковое) копирует байты строки si в строку sp определяет длину первого сегмента строки str1, содержащего символы, не входящие во множество символов строки str2 выделяет память и переносит в нее копию строки str вычисляет длину строки str преобразует буквы верхнего регистра в строке в соответствующие буквы нижнего регистра
Прототип char *strcat (char *sp, const char *si); char *strchr (const char *str, int c); int strcmp (const char *str1, const char *str2); char *strcpy (char *sp, const char *si); int strcspn (const char *str1, const char *str2); char *strdup (const char *str); unsigned strlen (const char *str); char *strlwr (char *str);
Функция strcat strchr strcmp strcpy strcspn strdup strlen strlwr
Продолжение
Краткое описание действий приписывает kol символов строки si к строке sp (конкатенация) сравнивает части строк str1 и str2, причем рассматрива-ются первые kol символов. Результат отрицателен, если str1<str2; равен нулю, если str1==str2, и положите-лен, если str1>str2 копирует kol символов строки si в строку sp («хвост» отбрасывается или дополняется пробелами) сравнивает не более kol символов строки str1 и строки str2, не делая различия регистров (см. функцию strncmp) заменяет первые kol символов строки str символом c ищет в строке str1 первое появление любого из множества символов, входящих в строку str2 ищет в строке str последнее вхождение символа с заполняет строку str заданным символом c определяет длину первого сегмента строки str1, содержа-щего только символы, из множества символов строки str2 ищет в строке str1 подстроку str2. Возвращает указатель на тот элемент в строке str1, с которого начинается подстрока str2 преобразует символьную константу str в число двойной точности. Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str ищет в строке str1 лексемы, выделенные символами из второй строки преобразует символьную константу str к значению «длинное число» с основанием baz (2≤baz≤36). Если endptr не равен NULL, то *endptr возвращается как указатель на символ, при достижении которого прекращено чтение строки str преобразует буквы нижнего регистра в строке str в буквы верхнего регистра
Прототип char *strncat (char *sp, const char *si, int kol); int strncmp (const char *str1, const char *str2, int kol); char *strncpy (char *sp, const char *si, int kol); int strnicmp (char *str1, const char *str2, int kol); char *strnset (char *str, int c, int kol); char *strpbrk (const char *str1, const char *str2); char *strrchr (const char *str, int c); char *strset (char *str, int c); int strspn (const char *str1, const char *str2); char *strstr (const char *str1, const char *str2); double strtor (const char *str, char **endptr); char *strtok (char *str1, const char *str2); long strtol (const char *str, char **endptr, int baz); char *strupr (char *str);
Функция strncat strncmp strncpy strnicmp strnset strpbrk strrchr strset strspn strstr strtod strtok strtol strupr

Пример 1.

//Программа демонстрирует работу функций из файла stdlib.h

#include <stdio.h>

#include <stdlib.h>

void main(){

char sv[]="23.547",

si[]="1234",

sl[]="-112424",

st1[15],st2[25],st3[15];

double v;

int i;

long l,t=457821;

 

v=atof(sv);

printf("Преобразование строки в вещественное число =

%f\n",v);

i=atof(si);

printf("Преобразование строки в целое число = %d\n",i);

l=atol(sl);

printf("Преобразование строки в длинное целое число =

%ld\n",l);

printf("Преобразование длинное целое число в строку =

%s\n",ultoa(t,st1,10));

printf("Преобразование длинное целое число в строку =

%s\n",ultoa(t,st2,2));

printf("Преобразование длинное целое число в строку =

%s\n",ultoa(t,st3,16));

}

Пример 2.

//Программа демонстрирует работу функций из файла string.h

#include <stdio.h>

#include <string.h>

void main(){

char st[100],sp[100],str[100],

si[]="qwerty",

sl[]="qwerty",

sw[]="qwertyu";

int len=0, sravn1, sravn2, sravn3, kol=5;

printf("Введите строку: ");

gets(st);

len=strlen(st); printf("Длина строки = %d\n",len);

printf("Конкатенация строк: %s\n",strcat(st,"12cdb"));

sravn1=strcmp(si,sl);

printf("Сравнение строк: %s==%s результат %d\n",

si,sl,sravn1);

sravn2=strcmp(si,sw);

printf("Сравнение строк: %s<%s результат %d\n",

si,sw,sravn2);

sravn3=strcmp(sw,si);

printf("Сравнение строк: %s>%s результат %d\n",

sw,si,sravn3);

printf("Копирование байтов: %s\n",strcpy(sp,st));

printf("Преобразование букв нижнего регистра в верхний:

%s\n", strupr(st));

printf("Преобразование букв верхнего регистра в нижний:

%s\n", strlwr(st));

printf("Копирование %d символов в другую строку: %s\n",

kol,strncpy(str,st,kol));

printf("Поиск в строке первого появления символа из

другой строки: %s\n",strpbrk(st,si));

printf("Поиск в строке последнее вхождение заданного

символа: %s\n",strrchr(st,'t'));

}

 

Пример 3.

//Поиск множества неповторяющихся символов строки

#include <stdio.h>

#include <string.h>

void main(){

char st[80];

int i,j,flag,len;

printf("Введите строку: ");

gets(st);

len=strlen(st); //длина строки

printf("Неповторяющиеся символы строки образуют

множество: ");

for (i=0;i<len;i++){

flag=0; //флаг проверки на совпадение

for (j=0;j<i;j++) //сравнение символа с предыдущими

if (st[i]==st[j]) flag=1;

if (flag==0)printf("%c",st[i]);

}

}

 

Пример 4.

/*Удаление лишних левых и внутренних пробелов в строке при выводе*/

#include <stdio.h>

#include <string.h>

void main(){

char st[80];

int i=0,len;

printf("Введите строку: ");

gets(st);

len=strlen(st);//длина строки

printf("Преобразованная строка: ");

//Удалены лишние пробелы слева

while (st[i++]==' ');

//Удалены лишние пробелы внутри строки

for (--i;i<len;i++)

if ((st[i]!=' ')||(st[i+1]!=' '))

printf("%c",st[i]); //если рядом два пробела

}

 

Задания

1. Наберите коды программ из Примеров 1 и 2. Выполните компиляцию и запуск программ.

2. Дана строка, в которой слова разделены одним пробелом. Замените первые буквы всех слов на заглавные (если слово начинается с заглавной буквы, оставьте без изменения).

3. Дана строка, в которой слова разделены одним пробелом. Подсчитайте, сколько букв 'w' встречается в каждом слове.

Домашние задания

1. Наберите коды программ из Примера 3 и 4. Выполните компиляцию и запуск программ.

2. Дана строка, в которой слова разделены одним пробелом. Подсчитайте, сколько в каждом слове букв, совпадающих с его первой буквой.

3. Дана строка. Преобразуйте ее так, чтобы сначала следовали цифровые символы, а затем все остальные. Порядок следования символов между собой не изменять.


Лабораторная работа 27

Решение задач на строки

 

Цель работы: научиться решить задачи на строки, используя, функции для работы со строками и изучить принцип работы строк и указателей в языке C++.

Теоретические сведения

Строки и указатели

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

Так как все строки в языке С++ заканчиваются нулевым символом, который имеет значение «ложь», то условие в операторе while(*str) будет истинным до тех пор, пока программа не достигнет конца строки.

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

/*Пример собственной функции копирования строки s2 в s1*/

char * strcpy_my (char *s1, char *s2){

char *ptrs1 = s1;

//указатель инициализирован на начало строки

while ((*s1++ = *s2++)!= 0);

return ptrs1; //возвращается указатель на строку s1

}

 

Следующий пример демонстрирует, что использование нулевого ограничителя упрощает различные операции над строками.

/*Пример собственной функции конкатенации*/

char * strcat_my (char *s1, char *s2) {

char *p1, *p2;

p1 = s1; p2 = s2;

while (*p1!= ‘\0’) p1++; //найти конец 1-ой строки.

//или while (*p1) p1++;

while ((*p1 = *p2)!= 0) {

/*копировать строку р2, пока не будет скопирован нулевой

Ограничитель*/

p1++;

p2++; //Передвинуть указатели к следующему байту

} //или while ((*p1++ = *p2++)!= 0);/*.

return s1;

}

 

 

Пример 1.

/*Демонстрация работы с указателями и с функциями для обработки строк*/

#include <stdio.h>

#include <string.h>

void main() {

char string[100], temp[100], *result, simvol;

int numresult, res;

/*создает строку "computer program" посредством

использования strcpy и strcat*/

strcpy(string, "computer");

result = strcat(string," program");

printf("1) создали строку\n%s\n",result);

/*находит строку, в которой первый раз обнаружено 'a'*/

simvol='a';

result = strchr(string,simvol);

printf("2) находим в строке первое вхождение символа

\'%c\'\n%s\n",simvol,result);

/* создает копию строки */

result = strcpy(temp,string);

printf("3) создали копию строку\n%s\n",result);

/* находит "a","b","c" в строке */

strcpy(string,"xyzabbc");

res = strcspn(string,"abc");

printf("4) определяем длину заданного сегмента

\n%d\n",res);

/*создает новый указатель на строку для дублирования

строки*/

result = strdup(string);

printf("5) создали новый указатель на строку

\n%s\n",result);

}

 

В предыдущих примерах рассматривалось присваивание указателю адреса только первого элемента массива. Однако это можно делать и с адресом любого отдельного элемента массива путем добавления символа '&' к индексированному имени. Особенно удобно пользоваться этим правилом при выделении подстроки. Например, следующая программа выводит на экран остаток введенной строки после первого пробела:

Пример 2.

/*Вывести на экран остаток строки после первого пробела*/

#include <stdio.h>

void main() {

char s[80], *p;

int i;

printf("ввести строку: ");

gets(s);

/*найти первый пробел или конец строки*/

for(i=0; s[i] && s[i]!=' '; i++);

p = &s[i];

printf(p);

}

В этой программе p будет указывать либо на пробел, если он есть, либо на ноль, если в строке нет пробелов. Если p указывает на пробел, то программа выведет на экран его и затем остаток строки. Например, если ввести фразу «язык программирования С++», функция printf() напечатает сначала пробел и затем «программирования С++». Если p укажет на ноль, то ничего не выводится на экран.

 

Пример 3:

//Выводит каждое отдельное слово и подсчитывает его длину

#include<iostream.h>

#include<string.h>

#include<stdio.h>

void main() {

char text[100],*p, *razd=".,";

int dlina;

puts ("Введите текст ");

gets(text);

p=strtok(text,razd); // Выделение первого слова текста

while (p) { // Пока можно выделить слово

dlina=strlen(p); // Определение длины слова

cout << "\n слово "<< p << " длина = " << dlina <<"\n";

p=strtok(NULL,razd);

//Выделение второго, третьего, и т.д. слов

}

}

Задания

1. Наберите коды программ из Примеров 2 и 3. Выполните компиляцию и запуск программ.

2. Дана строка, в которой слова разделены одним пробелом. Найдите и распечатайте все слова указанной длины n.

3. Дана строка из символов латинского алфавита. Вставьте пробел перед каждой заглавной буквой. Перед первой буквой пробел добавлять не надо. Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.

Введите строку символов латинского алфавита:



Поделиться:


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

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