Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

ОБРАБОТКА СИМВОЛЬНЫХ ДАННЫХ




ПОЯСНЕНИЯ К ФУНКЦИЯМ ЗАГОЛОВОЧНОГО ФАЙЛА 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 не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...