КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Символьная информация и строки
Одномерные массивы МАССИВЫ, СТРОКИ И УКАЗАТЕЛИ Do Void main(void) Void main(void) {const a=-20, b=60, c=10; float x=a, y; clrscr(); while (x<=b) { if (x<2) y=30+2*x; else if (x>=50) y=x+6; else y=6-2*x; cout<<"x="<<x<<": y="<<y<<"\n"; x+=c; } getche(); } Цикл DO-WHILE:
# include <iostream.h> # include <conio.h> {const a=-20, b=60, c=10; float x=a, y; clrscr(); { if (x<2) y=30+2*x; else if (x>=50) y=x+6; else y=6-2*x; cout<<"x="<<x<<": y="<<y<<"\n"; x+=c; } while (x<=b); getche(); } В языках Си/Си++, кроме базовых типов, разрешено вводить и использовать производные типы, полученные на основе базовых. Массивы и указатели – наиболее простые и известные производные типы.
Массив – это упорядоченная последовательность переменных одного типа. Каждому элементу массива отводится одна ячейка памяти. Элементы одного массива занимают последовательно расположенные ячейки памяти. Все элементы имеют одно имя – имя массива и отличаются индексами – порядковыми номерами в массиве. Количество элементов в массиве называется его размером. Чтобы отвести в памяти нужное количество ячеек для размещения массива, надо заранее знать его размер. Резервирование памяти для массива выполняется на этапе компиляции программы. int a[100]; // массив из 100 элементов целого типа Операция sizeof(a) даст результат 400, т. е. 100 элементов по 4 байта. Элементы массива всегда нумеруются с 0. Чтобы обратиться к элементу массива, надо указать имя массива и номер элемента в массиве (индекс): a[55] – индекс задается как константа, a[I] – индекс задается как переменная, a[2*I] – индекс задается как выражение. Элементы массива можно задавать при его определении: int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Операция sizeof(a) даст результат 40, т.е. 10 элементов по 4 байта. Если количество значений меньше, чем объявленная длина массива, то эти значения получат только первые элементы, остальные будут содержать так называемый «мусор»: int a[10]={1, 2, 3, 4, 5}; Если размер массива не указан явно, то его длина вычисляется компилятором по количеству значений, перечисленных при инициализации: int a[ ]={1, 2, 3, 4, 5}; Здесь будет определен массив из 5 элементов.
Для символьных данных в Си введен тип char. Для представления символьной информации используются символы, символьные переменные и текстовые константы. Примеры: const char c=’c’; //символ – занимает один байт, его значение не меняется char a, b; //символьные переменные, занимают по одному байту, // значения меняются const char *s=“Пример строки\n”; //текстовая константа Строка в Си – это массив символов, заканчивающийся нуль-символом – ‘\0’(нуль-терминатором). По положению нуль-терминатора определяется фактическая длина строки. Количество элементов в таком массиве на 1 больше, чем изображение строки. Присвоить значение строке с помощью оператора присваивания нельзя. Поместить строку в массив можно либо при вводе, либо с помощью инициализации.
Пример: void main() { char s1[10]="string1"; int k=sizeof(s1); cout<<s1<<"\t"<<k<<endl; char s2[ ]="string2"; k=sizeof(s2); cout<<s2<<"\t"<<k<<endl; char s3[ ]={‘s’,’t’,’r’,’i’,’n’,’g’,’3’} k=sizeof(s3); cout<<s3<<"\t"<<k<<endl; char *s4="string4";//указатель на строку, ее нельзя изменить k=sizeof(s4); cout<<s4<<"\t"<<k<<endl; } Результаты: string1 10 – выделено 10 байтов, в том числе под \0 string2 8 – выделено 8 байтов (7 + 1 байт под \0) string3 8 – выделено 8 байтов (7 + 1 байт под \0) string4 4 – размер указателя
Примеры: char *s=”String5”; //выделяется 8 байтов для строки char*ss; //описан указатель ss=”String6”; //память не выделяется, поэтому программа может //закончиться аварийно. char *sss=new char[10]; //выделяем динамическую память strcpy(sss,”String7”); //копируем строку в память
Для ввода и вывода символьных данных в библиотеке языка Си определены следующие функции: int getchar(void) – осуществляет ввод одного символа их входного потока, при этом она возвращает один байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла. int putchar (int c) – помещает в стандартный выходной поток символ c. char* gets(char*s) – считывает строку s из стандартного потока до появления символа ‘\n’, сам символ ‘\n’ в строку не заносится. int puts(const char* s) записывает строку в стандартный поток, добавляя в конец строки символ ‘\n’, в случае удачного завершения возвращает значение больше или равное 0 и отрицательное значение (EOF=-1) в случае ошибки. Примеры: char s[20]; cin>>s; //ввод строки из стандартного потока cout<<s; //вывод строки в стандартный поток Результат работы программы: При вводе строки “123 456 789”, чтение байтов осуществляется до первого пробела, т. е. в строку s занесется только первое слово строки “123/0”, следовательно, выведется: 123.
char s[20]; gets(s); //ввод строки из стандартного потока puts(s); //вывод строки в стандартный поток Результат работы программы: При вводе строки “123 456 789”, чтение байтов осуществляется до символа ‘\n’, т.е. в s занесется строка”123 456 789\n\0”, при выводе строки функция puts возвращает еще один символ ‘\n’, следовательно, будет выведена строка “123 456 789\n\n”.
char s[20]; scanf(“%s”, s); //ввод строки из стандартного потока printf(“%s”, s); //вывод строки в стандартный поток При вводе строки “123 456 789”, чтение байтов осуществляется до первого пробела, т. е. в строку s занесется только первое слово строки “123/0”, следовательно, выведется 123. Так как s – имя массива, т.е. адрес его первого элемента, операция & в функции scanf не используется.
Для работы со строками существуют специальные библиотечные функции, которые содержатся в заголовочном файле string.h. Рассмотрим некоторые из этих функций.
unsigned strlen (const char*s); Вычисляет длину строки s. int strcmp (const char*s1, const char *s2); Сравнивает строки s1 и s2. Если s1<s2, то результат отрицательный, если s1==s2, то результат равен 0, если s2>s1 – результат положительный. int strncmp (const char*s1, const char *s2); Сравнивает первые n символов строк s1 и s2. Если s1<s2, то результат отрицательный, если s1==s2, то результат равен 0, если s2>s1 – результат положительный. char * strcpy (char*s1, const char*s2); Копирует символы строки s1 в строку s2. char * strncpy (char*s1, const char*s2, int n); Копирует n символов строки s1 в строку s2. Конец строки отбрасывается или дополняется пробелами. char * strcat (char*s1, const char*s2); Приписывает строку s2 к строке s1. char * strncat (char*s1, const char*s2); Приписывает первые n символов строки s2 к строке s1.
Пример: Дана строка символов, состоящая из слов, слова разделены между собой пробелами. Удалить из строки все слова, начинающиеся с цифры.
#include <stdio.h> #include <string.h> void main() { char s[250], //исходная строка
Дата добавления: 2015-06-04; Просмотров: 438; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |