- •Т.Э. Шульга программирование.
- •Глава 1. Основы программирования на языке высокого уровня 6
- •Глава 2. Динамические структуры данных 40
- •Глава 3. Основы объектно-ориентированного программирования 53
- •Введение
- •Глава 1. Основы программирования на языке высокого уровня
- •Void main()
- •Задания
- •1.2. Переменные. Основные типы данных
- •Ввод – вывод значений переменных
- •Форматирование данных при обменах с потоками ввода-вывода
- •Void main()
- •Void main()
- •Преобразование типов
- •Задание 1. Описание переменных и преобразование типов
- •Задание 2. Форматирование вывода
- •1.3. Основные операции
- •Void main ()
- •Задания
- •1.4. Конструкции выбора
- •Void main()
- •Void main()
- •Void main()
- •Задание 1. Обработка введенного символа
- •Задание 2. Вычисление значения функции
- •Задание 3. Применение разветвляющихся алгоритмов при решении простейших задач
- •Задание 4. Mультиветвление
- •1.5. Конструкции цикла и передачи управления
- •Void main()
- •Задание 1. Детерминированные циклы. Простейшие задачи
- •Void main()
- •Задание 2. Итерационные циклы. Простейшие задачи
- •Void main()
- •Int last;
- •Задание 3. Одномерные массивы
- •Void main ()
- •Int a[100],n,max,imax;
- •Задание 4. Вложенные циклы
- •Void main ()
- •Задание 5. Двумерные массивы
- •Void main ()
- •Задание 6. Посимвольная обработка строк
- •Void main()
- •Задание 7. Сортировка массива
- •Void main ()
- •1.6.Функции
- •Int oct (int a)// определение функции
- •Void main()
- •Void main()
- •Int strcmp(const char *str1, const char* str2);
- •Int fclose (file * stream);
- •Int feof(file *stream);
- •Int fseek ( file* stream, long offset, int origin);
- •Задание 1. Определение и вызов функций
- •Задание 2. Рекурсивные функции
- •Задание 3. Использование библиотечных функций string.H
- •Void main()
- •Задание 4. Использование библиотечных функций stdio.H
- •Void main ()
- •Глава 2. Динамические структуры данных
- •Int year;
- •Int children;
- •Задание 1. Структуры
- •Int year;
- •Int month;
- •Int visokos(int year)
- •Vivod (date d)
- •Int day_number(date d)
- •Vivod(mas[I]);
- •Vivod (min(mas,n));
- •Задание 2. Динамический список
- •Int mark;
- •Void vvod ()
- •Void vivod()
- •If (begin)
- •Void vivod_f()
- •If (begin)
- •Void add()
- •Void udol () //
- •If (begin)
- •Void del()
- •Void main ()
- •Задание 3. Использование стеков и очередей
- •Глава 3. Основы объектно-ориентированного программирования
- •Void empty();
- •If (len) delete []s;
- •Void cStr::empty()
- •Задание 1 . Описание простейшего класса
- •Задание 2 . Класс string
- •Void main()
- •Void main ()
- •Задание 3. Класс fstream
- •Задание 4. Наследование
- •Список литературы
Void main ()
{
string s,s1,*s2;//Cоздали два объекта класса
//string и указатель на объект классса string
int k=0;
string razd=" ,.:";
/*Создали объект класса string, с помощью конструктора копирования для хранения разделителей между словами */
string glas="aeoiuy";
/*Создали объект класса string, с помощью конструктора копирования для хранения гласных*/
cout<<"Enter string ";
getline(cin,s);//Считали строку из потока cin
s2=new string [s.length()/2];//Выделили память под
//массив строк
s1=s;
/* Скопировали строку s в строку s1 с помощью переопредленной операции = */
int n= s1.find_first_of(razd);
/*Нашли позицию первого разделителя в строке s1*/
while (n!=NPOS)
{
if (n)
{
s2[k]=s1.substr(0,n);
/*Сохранили подстроку до разделителя как очередной элемент массива */
if (glas.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];
k++;
}
s1=s1.substr(n+1);
/*Далее рассматриваем только оставшуюся часть строки*/
n=s1.find_first_of(razd);//Нашли позицию очередного
//разделителя
}
s2[k]=s1; //Обработка последнего слова
if (glas.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];
}
Отметим, что в данном решении задачи, так же как и в решении задачи в примере 6.3. массив слов введен лишь для демонстрации возможности сохранения слов в массиве для дальнейшей обработки. Однако, в данной задачи не предполагается дальнейшая обработка выделенных из строки слов, поэтому нет необходимости сохранять их в массиве. Поэтому целесообразнее не определять массив строк string *s2, а определить лишь одну строку string s2, которую и использовать для обработки очередного выделенного слова.
Задание 3. Класс fstream
Каждому студенту рекомендуется выполнить хотя бы одно из упражнений 1-12 задания 4 из параграфа 1.6, использую класс fstream.
Для поддержки файлового ввода и вывода стандартная библиотека С++ содержит классы ifstream (входной файловый поток), ofstream(выходной файловый поток), fstream (двунаправленный файловый поток). Файловый потоки обеспечивают более надежный ввод/вывод, чем стандартные функции библиотеки С. Для использования файловый потоков необходимо подключить к программе заголовочный файл <fsteam.h>.
Над файловыми потоками можно выполнять следующие операции:
-
создание потока (потокового объекта)
-
открытие потока и связывание его с файлом
-
обмен с потоком (ввод/вывод)
-
закрытие файла (отсоединение от потока).
Создание потока можно осуществитьс с помощью конструктора без параметров, например
ofstream outFile;// создан выходной поток
Чтобы свзяать поток, созданный таким образом, с файлом используют метод open().
Например,
outFile.open(“1.txt”);
Метод open() может иметь следующие параметры
ios::in Открыть файл для ввода
ios::out Открыть файл для вывода
ios::ate Установить указатель на конец файла
ios::app Открыть в режиме добавления в конец файла
ios::trunc Если файл сущесвтует обрезать его до нулевой длины
ios::binary Открыть в двоичном режиме
ios::nocreate Если файл не существует, установить поток в нулевое значение
ios::noreplace Если файл существует, устновить поток в нулевое значение
Обмен данных с файлами входными и выходными потоками осуществяется также как со стандарными потоками cin и cout соотвественно – с помощью опраций чтения из потока (>>) и записи в поток (<<) и специальных методов.
Например,
char c, s[20];
inFile.get(c);// считали очередной символ в переменную с
inFile>>c;//считали очердной символ в переменную с
inFile.getline(s,sizeof(s)); // считали строку в массив s
outFile.put(c); // записали символ с
outFile<<c<<s; //записали символ с и строку s
Контролировать, достигнут ли конец файла при считывании данных из потока, позволяет метод eof(), возращающий нулевое значение, если конец файла не достигнут и ненулевое в простивном случае.
При различных ошибочных ситуациях, напрмер переполнение диска или отсутсвия файла на диске, потоковый объект утанавливается в нулевое значение. Например,
ifstream inFile(“1.txt“);
if (!inFile) cout<<"Не существет такого файла!";
Для закрытия файла (отсоединения от потока) используют метод close(). Например,
outFile.close();
Пример. Решим задачу из примера 6.4, использую класс fstream. Дан текстовый файл, строки которого содержат не более m (m<=20) символов. Считать строки и записать их в файл result.txt в порядке считывания, причем каждая строка должна быть «перевернута».
#include <fstream.h>
void main ()
{
char filename[255];
cout<<"Введите имя файла ";
cin>>filename;
ifstream inFile(filename);
/*определили входной файловй поток (для чтения) и прикрепили к нему файл с именем filename */
if (inFile) // Если файл успешно открыт
{
ofstream outFile; //определили выходной файловый поток
//(для записи)
outFile.open("result.txt"); //присоединили файл с именем
//"result.txt" к выходному потоку
char s[20];// определяем массив для хранения
//считанной строки
while(!inFile.eof()) //Цикл считывания строк
{
inFile.getline(s,sizeof(s));// Считали очередную строку
int l=strlen(s);
if (s[l-1]!='\n') outFile<<s[l-1];
for (int j=l-2; j>=0; j--) outFile<<s[j];
//цикл записи символов строки в обратном порядке
outFile<<'\n';//запись символа новой строки
}
inFile.close();
outFile.close ();
cout<<"Файл записан";
}
else cout<<"Не существет такого файла!";
}