Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Базовый курс. Ч.3. Основы алгоритмизации и про- граммирования в среде Visual C++ 2005.pdf
Скачиваний:
53
Добавлен:
05.02.2023
Размер:
3.81 Mб
Скачать

92

13.3.Обработка массивов строк

Внекоторых случаях для ввода строк правильнее использовать

метод cin.getline(s,n).

Отличия

его

от

метода

cin.get(s,n) в следующем:

 

 

 

 

·Метод getline считывает из входного потокаn-1 символов или менее (если символ перевода строки встретится раньше) и записывает их в строковую переменную S.

·Символ перевода строки(\n встречается, когда нажимает Enter) также считывается (удаляется) из входного потока, но не записывается в строковую переменную, вместо него размещается завершающий 0.

·Если в строке исходных данных более n-1 символов. Следующий ввод будет выполняться из той же строки, начиная с первого несчитанного символа

·Метод get работает аналогично, но оставляет в потоке символ перевода строки. В строковую переменную добавляется завершающий 0.

Для обработки строк существует ряд специальных функций:

·функция strcpy(s1,s2) – она копирует в строкуS1 содержимое строки S2

·функция strcmp(s1,s2) – она сравнивает содержимое строк s1 и s2: если они равны, то функция дает 0, если s1<s2, то отрицательное число и если s1>s2, то положительное

·функция _itoa(I,s,r) – преобразует целое I в строку s, пользуясь системой счисления с основанием r

Все эти функции находятся в заголовочном файле string.h . Пример 13.5. Дан список из 10 фамилий. Найти однофамильцев

и, если они есть, указать их порядковые номера в списке.

/поиск однофамильцев в списке из 10 фамилий

#include <iostream> #include <string.h> #include <stdlib.h> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

const int n=10; int i,j, k;

char fam [n+1] [20], s[20],s2[20],s3[20]; int main()

93

{for (i=1;i<=n;i++)

{cout<<Rus("введи фамилию № ")<<i<<" "; cin.getline(s,19); strcpy(fam[i],s);} k=0;

for (i=1;i<n;i++)

 

{

strcpy(s,fam[i]);

 

for (j=i+1;j<=n;j++)

 

{

strcpy(s2,fam[j]);

 

 

if (strcmp(s, s2)==0) { cout<<s;

k++; _itoa(k,s3,2); strcpy(fam[j],s3);

//затирание уже найденных

однофамильцев

} }}

 

cout<<" "<<i<<" "<<j;cout<<endl;

return(0);}

 

char* Rus(const char* str)

 

{AnsiToOem(str, str_rus); return str_rus;}

Результат работы программы на рис. 8.31.

Рис. 8.31. Результат работы программы примера 13.5

Рассмотрим, как реализуется задача сортировки в массиве строк.

Пример 13.6. Дан список из10 фамилий. Упорядочить их по алфавиту.

// упорядочение фамилий в списке из 10 фамилий

#include <iostream> #include <string.h> #include <stdlib.h> #include <windows.h> using namespace std;

char* Rus(const char* str);

94

char str_rus[256];

const int n=10; int i,j, k; char fam [n+1] [20], s[20],s2[20],s3[20];

int main()

{for (i=1;i<=n;i++)

{cout<<Rus("введи фамилию №")<<i<<" "; cin.getline(s,19);

strcpy(fam[i],s); } k=0;

for (i=1;i<n;i++)

{for (j=1;j<n;j++)

{strcpy(s,fam[j]);

strcpy(s2,fam[j+1]);

if (strcmp(s, s2)>0)

{strcpy(s3,fam[j]);

strcpy(fam[j],fam[j+1]);strcpy(fam[j+1],s3);

} }}

cout<<"\n";

for (i=1;i<=n;i++)

{cout<<Rus("теперь фамилия №")<<i<<" "<<fam[i]<<endl;} return(0); }

char* Rus(const char* str)

{AnsiToOem(str, str_rus); return str_rus;

}

Результат работы на рис. 8.32.

Рис. 8.32. Результат работы программы примера 13.6

95

Пример 13.7. Дан список из10 фамилий. Упорядочить их по алфавиту, используя динамические массивы.

//алфавитное упорядочение фамилий с использованием

//динамического массива

#include <iostream> #include <string.h> #include <windows.h> using namespace std;

char* Rus(const char* str); char str_rus[256];

int main()

{ int i,j,n,m; char s[20],s2[20], s3[20]; cout<<Rus("введите количество фамилий "); cin>>n;

//объявление переменной типа "указатель на указатель" и

//выделение памяти под массив указателей на число фамилий char **fam = new char* [n+1];

cout<<Rus("введи макс. длину фамилии "); cin>>m;

//ниже - цикл для выделения памяти под каждую фамилию

//на максимально указанную длину фамилии

for (i=1;i<=n;i++) fam[i]= new char[m]; //цикл ввода фамилий

for (i=1; i<=n; i++){ cout<<Rus("введи ")<<i; cout<<Rus("-ю фамилию "); cin>>fam[i];}

//упорядочение фамилий путем сравнения соседних

//элементов и перестановки их

for (i=1; i<n; i++) for (j=1; j<n; j++) { if (strcmp(fam[j],fam[j+1])>0)

{strcpy(s3,fam[j]); strcpy(fam[j],fam[j+1]); strcpy(fam[j+1],s3);} }

for (i=1;i<=n; i++)

cout<<Rus("теперь фам №")<<i<<" "<<fam[i]<<endl; return(0); }

char* Rus(const char* str)

{ AnsiToOem(str, str_rus); return str_rus; }

Результат работы на рис. 8.33.