Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Ввод-вывод символьных данных и строкСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
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’. В этом случае такой символ надо дописывать в конец строки вручную.
Пример 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; просмотров: 923; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.31.27 (0.014 с.) |