Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ОБРАБОТКА СИМВОЛЬНЫХ ДАННЫХ
ПОЯСНЕНИЯ К ФУНКЦИЯМ ЗАГОЛОВОЧНОГО ФАЙЛА string.h // СОКРАЩЕНИЯ: возв-т - возвращает, Ук -указатель. // ОБОЗНАЧЕНИЯ: s, s1, s2 - Ук-ли на строки, ch - символ, n - кол-во символов
typedef unsigned size_t; // 0..65535
void *memchr(const void *blok, int ch, size_t n); // возв-т Ук на первое // вхождение ch в первые n байтов блока памяти с Ук blok, иначе NULL int memcmp(const void *bl1, const void *bl2, size_t n); // сравнение первых n // байтов (как unsigned char) в блоках памяти bl1 и bl2, // возв-т: > 0, если bl1 > bl2; == 0, если bl1 == bl2; < 0, если bl1 < bl2 void *memcpy(void *bl1, const void *bl, size_t n); // копирует n байтов из // bl в bl1, возв-т Ук на bl1 void *memmove(void *bl1, const void *bl, size_t n); // то же, что и memcpy(), // но блоки bl1 и bl могут перекрываться void *memset(void *arr, int ch, size_t n); // заполняет первые n байтов // массива arr символом ch, возвращает arr char *strcat(char *s1, const char *s2); // добавляет s2 к s1 (конкатенация) char *strncat(char *s1, const char *s2, size_t n); // добавляет n символов // s2 к s1 (конкатенация) char *strchr(const char *s, int ch); // возв-т Ук на первое положение ch // в s, иначе NULL int strcmp(const char *s1, const char *s2); // сравнение s1 и s2 в лексико- // графическом порядке (см. memcmp() ) int strncmp(const char *s1, const char *s2, size_t n); // как memcmp() char *strcpy(char *s1, const char *s2); // копирует s2 в s1, возв-т s1 char *strncpy(char *s1, const char *s2, size_t n); // копирует n первых // символов s2 в s1, возв-т s1 size_t strlen(const char *s); // возв-т длину s в байтах char *strpbrk(const char *s1, const char *s2); // возв-т Ук на первое // вхождение символа из s2 в s1 char *strrchr(const char _FAR *s, int ch); // возв-т Ук на последнее // вхождение ch в s size_t strspn(const char *s1, const char *s2); // возв-т смещение от начала // строк s1 и s2 до первого несовпадения символов в этих строках size_t strcspn(const char *s1, const char *s2); // возв-т первую позицию i // в s1, для которой символ s1[i] встречается и в s2 char *strstr(const char *s1, const char *s2); // возв-т Ук на первое // вхождение s2 в s1 char *strtok(char *s1, const char *s2); // возв-т Ук на слово в s1 и исполь- // зуется для выделения слов в s1. Разделителем слов является любой из сим- // волов в s2. При первом вызове strtok() помещает в s1 NULL на место первого // символа, совпадающего с одним из знаков в s2. При повторных вызовах strtok // в качестве ее первого параметра нужно указывать NULL char *strdup(const char *s); // возв-т Ук на копию s в динамической памяти char *strlwr(char *s); // преобразует символы строки к нижнему регистру char *strset(char *s, int ch); // заполняет символом ch строку s char *strnset(char *s, int ch, size_t n); // заполняет символом ch n первых // позиций строки s char *strrev(char *s); // меняет порядок символов в s на обратный char *strupr(char *s); // преобразует символы строки к верхнему регистру // Программа 1.А (FUN_PTR.CPP). Функция, возвращающая указатель. #include <iostream.h> #include <stdlib.h> // функция exit(), константа NULL char *str_sim(char *str1, char *str2, char sim); // Функция возвращает указатель на ту из строк str1 или str2, // в которой символ sim встречается больше раз void main(void) { char *st1 = "Строка первая", // буква 'a' в строке - дважды *st2 = "Ещё строка", // буква 'a' в строке - один раз *st; st = str_sim(st1, st2, 'а'); // 'а' - из русского алфавита! if (st == NULL) { cout <<"\n В строках "<<st1 <<" и " <<st2 <<" символ" <<" встречается одинаковое число раз"; exit(1); } cout <<endl <<st <<endl; } char *str_sim(char *str1, char *str2, char sim) { char *sp; int k1 = 0, // число символов sim в строке str1 k2 = 0; // то же в строке str2 sp = str1; while (*sp) { if (*sp == sim) k1++; sp++; } sp = str2; while (*sp) { if (*sp == sim) k2++; sp++; } if (k1 == k2) return NULL; if (k1 > k2) return str1; return str2; }
/*Программа 1.B(LEKS_WRD.CPP), использует функции вв/выв языка С. Ввести строку - последовательность слов, разделенных одним из символов: .,:;!? или пробелом, и распечатать те из них, перед которыми стоят только лексикографически меньшие, а за ними - только большие слова. Функция strtok(char *str, const char *divide) возвращает указатель на слово и используется для выделения слов из строки str. Разделителем слов считается любой из знаков в divide. При первом вызове strtok() помещает в str NULL на место первого символа, совпадающего с одним из знаков в divide. При повторных вызовах strtok() в качестве первого параметра нужно указывать NULL. ТЕСТ: str = "ba ab,bb.bc;cd?ca!ee", результат: bb bc ee */ #include <stdio.h> // функция gets(char *str) вводит строку с пробелами #include <conio.h> // функции: cputs(), putch(), getch() #include <string.h> // для работы со строками #define LEN 80 // длина вводимой строки #define NUM_W 40 // количество слов в строке void main() { int i, j, k = 0; char str[LEN], // вводимая строка *words[NUM_W], // массив указателей на слова в строке str divide[] = ".,:;!? "; // cтрока знаков – разделителей cputs("\n\r Введите строку: "); gets(str); words[k] = strtok(str, divide); // выделяется первое слово while((words[++k] = strtok(NULL, divide)) != 0); // ... остальные слова cputs("Список упорядоченных слов: "); for (i = 0; i < k; i++) // цикл по словам { for (j = 0; j < i; j++) // cлова слева от i-го слова if(strcmp(words[i], words[j]) < 0) goto following; for (j = k-1; j > i; j--) // cлова справа от i-го слова if(strcmp(words[i], words[j]) > 0) goto following; cputs(words[i]); putch(' '); following: } getch(); // просмотр экрана до нажатия клавиши }
/* Программа 1.C (SWORDS.CPP), использует функции вв/выв языка С. Среди введенных слов вывести на экран сначала те, которые начинаются и оканчиваются одной и той же буквой, а затем - все остальные. ТЕСТ: str = "aba ab,bb.bc;cd?exe", результат: aba bb exe ab bc cd */ #include <conio.h> #include <stdio.h> // функция gets(), вводит строку с пробелами #include <string.h> // для работы со строками #define LEN 80 // максимальная длина вводимой строки #define NUM_W 40 // максимальное количество слов в строке
void main() { int i, l, k = 0; char str[LEN], // вводимая строка *words[NUM_W], // массив указателей на слова в строке str divide[] = ".,:;!? ", // cтрока знаков - разделителей *p; printf("\n Введите строку длиной не более %d символов: ", LEN-1); gets(str); str[LEN-1] = '\0'; // на случай недопустимо длинной строки cputs("Слова в нужном порядке: "); p = strtok(str, divide); // выделяется первое слово while( p ) { l = strlen( p ); // длина строки if ( *p == *(p+l-1 )) // если первая и последняя буквы в слове { cputs(p); putch(' '); } // равны, - слово на экран, else words[k++] = p; // иначе - запись в массив слов p = strtok(NULL, divide); // выделяются остальные слова } for (i = 0; i < k; i++) {cputs(words[i]); putch(' '); } getch(); }
/* Программа 1.D (FIRST_VO.CPP). Вывести на экран слова введенного текста (длинная строка), изменив каждое слово следующим образом: буквы слова, стоящие до первой гласной, перенести в конец слова. ТЕСТ: str = "baba abba,buly.psi", результат: abab abba ulyb ips */ #include <iostream.h> #include <string.h> void main() { int j, len, k, N, p; char *str, // вводимая строка *vowel = "aeoiuy", // гласные буквы *divide = ".,:;!? ", // строка знаков - разделителей *word, // текущее слово let1; // первая гласная буква cout <<"\n Какова максимальная длина строки ? "; cin >>N; cin.get(); // очистка буфера клавиатуры от символов, вводимых Enter str = new char[N]; cout <<"Введите строку из слов: "; cin.getline(str, N); cout <<"Преобразованная строка: "; word = strtok(str, divide); while (word) { len = strlen(word); for (j = 0; j < len; j++) // поиск в слове первой гласной буквы if (strchr(vowel, word[j]) != NULL) break; j %= len; // если гласных не было, положим j=0, для чего ? for (k = 0; k < j; k++) // j раз сдвигаем слово циклически на одну { let1 = word[0]; // букву влево for (p = 0; p < len-1; p++) word[p] = word[p+1]; word[p] = let1; } cout <<word <<' '; word = strtok(NULL, divide); } cin.get(); // просмотр экрана до нажатия клавиши Enter delete str; // освобождение памяти }
/* Программа 1.E (INSTR_LN.CPP), использует функции вв/выв языка С++. Вывести на экран аргументы командной строки в прямом порядке, если первым из них идет опция -s, и в обратном порядке, если первый аргумент - опция -r (саму опцию не выводить). ТЕСТ: С:\BC31\MY_PROG> ins_line -r мне не дают книгу На экране должно быть: книгу дают не мне */ //#include <conio.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> void main(int argc, char *argv[]) // argc - количество аргументов // в массиве argv, для теста: // argc = 6, *argv[] = {"ins_line","-r","мне","не","дают","книгу" } { if (argc < 2) { puts("Нужны аргументы в командной строке! \n"); exit(-1); } if (argv[1][0]=='-' && argv[1][1]=='s' && argv[1][2]=='\0') { ++argv; // вывод аргументов на экран, начиная с третьего while (--argc > 1) printf((argc>2)?"%s ":"%s\n", *++argv); } else if(strcmp(argv[1], "-r") == 0) // ... в обратном порядке while (--argc>1) printf((argc>2)?"%s ":"%s\n", *(argv+argc)); else puts("Первым должен быть аргумент -s или -r"); getch(); }
/* Программа 1.F (HISTGRAM.CPP) Построить на экране гистограмму числа вхождений каждой строчной латинской буквы в текст. Конец ввода последовательности букв - признак конца файла (EOF) - клавиши Ctrl+Z, Enter */ #include <iostream.h> #include <conio.h> void main() { int i, j, c, max; static int histgrm[26]; // число вхождений каждой буквы в текст char hist_str[53], // очередная строка в гистограмме ch; for (i = 0; i < 52; i++) hist_str[i] = ' '; hist_str[52] = '\0'; cout <<"Введите текст, заканчивающийся EOF: Ctrl+Z, Enter \n"; while ( (c = cin.get()) != EOF ) if(c >= 'a' && c <= 'z') histgrm[c-'a']++; // находим максимальное число вхождений букв в текст, это и будет // количество строк в гистограмме max = histgrm[0]; for (i = 1; i < 26; i++) if(histgrm[i] > max) max = histgrm[i]; for (i = max; i >= 1; i--) // вывод гистограммы на экран { for (j = 0; j < 26; j++) if ( histgrm[j] == i ) hist_str[2*j+1] = '*'; cout <<hist_str <<endl; } for (ch = 'a'; ch <= 'z'; ch++) cout <<' ' <<ch; cout <<endl; getch(); }
|
||
Последнее изменение этой страницы: 2018-06-01; просмотров: 135. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |