- •ГЛАВА 7. ОСНОВЫ АЛГОРИТМИЗАЦИИ
- •1. ПОНЯТИЕ ОБ АЛГОРИТМЕ
- •2. ОСНОВНЫЕ СТРУКТУРЫ
- •2.1. Структура «следование»
- •2.2. Структура «развилка»
- •2.3. Структура «цикл»
- •3. ОСНОВНЫЕ ТИПЫ АЛГОРИТМОВ
- •3.1. Линейный алгоритм
- •3.2. Разветвленный алгоритм
- •3.3. Циклический алгоритм
- •Практические задания
- •1. Алгоритмы линейной структуры
- •2. Алгоритмы разветвляющейся структуры
- •3. Алгоритмы циклической структуры (цикл «ПОКА»)
- •4. Алгоритмы циклической структуры (цикл «ДО»)
- •ГЛАВА 8. ОСНОВЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ VISUAL С++ 2005
- •ВВЕДЕНИЕ
- •1. РАЗРАБОТКА ПРОГРАММЫ
- •2. ПЕРЕМЕННЫЕ
- •3. ЛИНЕЙНАЯ ПРОГРАММА
- •3.1. Оформление линейной программы
- •3.2. Программирование в стандартизованной среде CLR
- •Практические задания
- •Русская система мер
- •4. ПРОГРАММА С ВЕТВЛЕНИЕМ
- •Практические задания
- •5. ЦИКЛ С ПАРАМЕТРОМ
- •6. ЦИКЛ «ПОКА»
- •Практические задания
- •7. ОДНОМЕРНЫЕ МАССИВЫ
- •7.1. Понятие об одномерном массиве
- •7.2. Сортировка в одномерном массиве
- •Практические задания
- •8. ДВУМЕРНЫЕ МАССИВЫ
- •8.1. Понятие о двумерном массиве
- •8.2. Датчик случайных чисел
- •Практические задания
- •9. ФУНКЦИИ
- •9.1. Понятие о пользовательских функциях
- •Рис. 8.20. Пятиугольник со сторонами a, b, c, d, f и диагоналями h,g.
- •9.2. Рекурсия
- •9.3. Вызов функции из функции
- •9.4. Функция типа void и глобальные переменные
- •9.5. Передача в функцию имени функции
- •Практические задания
- •10. СОБСТВЕННАЯ БИБЛИОТЕКА ПРОГРАММИСТА
- •10.1. Перегрузка функций
- •Рис. 8.25. Результат работы программы примера
- •11. ПЕРЕЧИСЛИМЫЙ ТИП
- •11.1. Понятие о перечислимом типе
- •11.2. Множественный выбор
- •12. УКАЗАТЕЛИ
- •12.1. Понятие об указателях
- •12.2. Указатели и функции
- •12.3. Указатели и динамические массивы
- •12.4. Указатели и перегрузка операций
- •13. ОБРАБОТКА СИМВОЛЬНЫХ СТРОК
- •13.1. Символьные переменные
- •13.2. Символьные строки (как массивы символов)
- •13.3. Обработка массивов строк
- •Практические задания
- •14. СТРУКТУРЫ
- •Практические задания
- •15. КЛАССЫ
- •15.1. Понятие класса
- •15.2. Открытые и закрытые члены класса
- •15.3. Конструкторы и деструкторы
- •Практические задания
- •Раздел А
- •Раздел Б
- •16. ФАЙЛЫ
- •16.1. Работа с текстовыми файлами
- •16.2. Работа со структурами в файлах
- •16.3. Работа с классами в файлах
- •Практические задания
- •Раздел А
- •Раздел Б
- •ПРИЛОЖЕНИЯ
- •Приложение 1. Список библиотечных функций
- •Математические функции
- •Строковые функции (для работы с символьными массивами)
- •Приложение 2. План лабораторных работ
- •ГЛАВА 9. ПРИЛОЖЕНИЯ WINDOWS FORMS
- •ВВЕДЕНИЕ
- •1. РАЗРАБОТКА ПРИЛОЖЕНИЯ
- •3. ДИНАМИЧЕСКИЕ ССЫЛКИ НА ОБЪЕКТЫ
- •3.1 Понятие о динамических ссылках.
- •3.2. Программа «Калькулятор»
- •4. ИСПОЛЬЗОВАНИЕ ТАЙМЕРА. КОМПОНЕНТ CHECKBOX
- •4.1 Таймер
- •4.2. Компонент CheckBox
- •5. СПИСКИ ВЫБОРА И ПОЛОСЫ ПРОКРУТКИ. ГРАФИЧЕСКИЕ КОМПОНЕНТЫ В C++Builder
- •5.1. Список выбора ListBox
- •5.2. Полосы прокрутки
- •5.3. Графика
- •6. РАБОТА С ТЕКСТОВЫМИ ФАЙЛАМИ.
- •6.1. Чтение и запись текстового файла
- •ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ
- •Раздел 1. Кнопки, метки и окна редактирования
- •Раздел 2. Радиокнопки
- •Раздел 3. Полосы прокрутки
- •Раздел 4. Обработка текстовых файлов
- •ЛИТЕРАТУРА
- •ТЕСТЫ
- •Тесты по основам алгоритмизации
- •Тесты по программированию на С++
- •Учебное издание
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.