- •2. Методические указания к выполнению лабораторных работ
- •Лабораторная работа №1 Следование
- •Варианты индивидуальных заданий Выполнить поразрядные логические операции над машинными кодами
- •Пример программы
- •Лабораторная работа №2 Операторы ветвления
- •Варианты индивидуальных заданий
- •Пример разработки математической модели и схемы алгоритма решения задачи для варианта задания вида:
- •Текст программы
- •Лабораторная работа №3 Операторы цикла
- •Варианты индивидуальных заданий
- •Пример программы
- •Лабораторная работа №4 Статические массивы
- •Варианты индивидуальных заданий
- •Пример программы на обработку одномерного массива
- •Пример программы на обработку двумерного массива (матрицы)
- •Лабораторная работа №5 Динамические массивы
- •Варианты индивидуальных заданий
- •Пример программы на обработку одномерного массива
- •Пример программы на обработку двумерного массива (матрицы)
- •Лабораторная работа №6 Методы сортировки
- •Варианты индивидуальных заданий Методы сортировки
- •Области сортировки элементов матриц
- •Примеры программ
- •Лабораторная работа №7 Передача имён функций в качестве параметров
- •Текст программы
- •Лабораторная работа №8 Строки и текстовые файлы
- •Варианты индивидуальных заданий
- •Пример программы
- •Лабораторная работа №9 Структуры и файлы структур
- •Пример программы
- •Лабораторная работа №10 Линейные списки
- •Варианты индивидуальных заданий
- •Пример программы
- •Лабораторная работа №11 Стек, дек, очередь
- •Варианты индивидуальных заданий
- •Пример программы
- •Лабораторная работа №12 Классы
- •Варианты индивидуальных заданий
- •Примеры программ
- •Литература
Пример программы
//Программа создает файл строк. Признак окончания ввода -
//пустая строка. Затем файл построчно читается,
//и программа удаляет из каждой строки, содержащей слова,
//разделенные произвольным количеством пробелов, все слова с чётным номером.
//Обработанная строка записывается в новый файл
//Тема: ОБРАБОТКА С-СТРОК + ФАЙЛЫ (ПОТОКИ)
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#define FNAME_I "D:\\st_i.txt\0" //имя исх. файла задано константной строкой
#define FNAME_R "D:\\st_r.txt\0" //имя рез. файла задано константной строкой
const int RAZ = 80 ; //максимальная длина строки
const char PR_R[] = "r" ; //признак открытия файла на чтение
const char PR_W[] = "w" ; //признак открытия файла на запись
void make_file(char *fname) ; //функция создания файла
int proverka_file(char *fname, const char *) ; //проверка наличия файла
void obrabotka_file(char *, char *) ; //обработка содержимого
void vivod_file(char*) ; //вывод содержимого файла на печать
//main_Begin______________________________________________________________
int main()
{clrscr() ;
char fname_i[20] = FNAME_I ;
char fname_r[20] = FNAME_R ;
//создаем исходный файл
make_file(fname_i) ;
//выводим его содержимое
if(!proverka_file(fname_i, PR_R))
{cout << "Ошибка открытия файла " << fname_i << " на чтение" << endl ;
cout << "Нажмите <Enter>" << endl ;
getchar() ;
return 0 ; //если исходный файл не создан
}
cout << "Содержимое исходного файла:" << endl ;
vivod_file(fname_i) ;
//обрабатываем файл
obrabotka_file(fname_i, fname_r) ;
//выводим содержимое результата
if(!proverka_file(fname_r, PR_R))
{cout << "Ошибка открытия файла " << fname_r << " на чтение" << endl ;
cout << "Нажмите <Enter>" << endl ;
getchar() ;
return 0 ; //если результирующий файл не создан
}
cout << "Результат (в каждой строке удалены слова с чётным номером):\n" ;
vivod_file(fname_r) ;
cout << endl << "Для завершения нажмите <Enter>" ;
getchar() ;
return 0 ;
}
//main_End________________________________________________________________
//make_file_ Begin________________________________________________________
void make_file(char *fname_i)
{char st[RAZ] ; //исходная строка
FILE *in ; //текстовый файл
char otv ; //ответ пользователя
//Открываем файл в режиме чтения (r)
//Если файл с таким именем уже есть, то либо пользователь вводит
//новое имя, либо новые записи будут дописаны поверх старых
while(proverka_file(fname_i, PR_R))
{cout << "Такой файл уже есть! Зададите новое имя Y/N?" << endl ;
cin.get(otv) ;
if(otv == 'Y' || otv == 'y')
{cout << "Введите новое имя:" << endl ;
cin >> fname_i;
cin.get() ; //убираем символ '\n' из потока
}
else {cin.get() ; //убираем символ '\n' из потока
break ;
}
}
//проверяем возможность открытия файла для записи
//поскольку полное имя файла могло быть задано с ошибкой
if(!proverka_file(fname_i, PR_W))
{cout << "Ошибка открытия файла " << fname_i << " на запись" << endl ;
cout << "Нажмите <Enter>" << endl ;
getchar() ;
exit(0) ;
}
//Открываем файл в режиме записи (w) текста (по умолчанию)
//Если файл с таким именем уже есть, то новые данные
//будут дописаны поверх старых
in = fopen(fname_i, PR_W) ;
cout << "Создание файла." << endl ;
cout << "Признак окончания ввода - ввод пустой строки" << endl ;
cout << "Введите строку и нажмите <Enter>" << endl;
cout << "->" ;
cin.getline(st, RAZ) ; //функция вводит строку целиком, включая
//пробелы и символ \n
while(strlen(st))
{fprintf(in, "%s\n", st) ;
cout << "Введите строку и нажмите <Enter>" << endl ;
cout << "->" ;
otv++ ;
cin.getline(st, RAZ) ;
}
fclose(in) ; //закрываем файл
}
//make_file_End___________________________________________________________
//proverka_file_Begin_____________________________________________________
//проверка наличия файла
int proverka_file(char *fname, const char *pr)
{
//Открываем файл
if((fopen(fname, pr)) == NULL) //файл не существует
return(0) ;
return(1) ;
}
//proverka_file_End_______________________________________________________
//obrabotka_file_Begin____________________________________________________
//обработка содержимого файла
void obrabotka_file(char *fname_i, char *fname_r)
{FILE *in, *out ; //исходный и результирующий файлы (потоки)
char st[RAZ] ; //исходная строка
char sr[RAZ] ; //результирующая строка
char pr[RAZ] ; //обрабатываемое слово
int i, j, k ; //номер обрабатываемого символа
int flag ; //признак четного номера слова
int n ; //длина результирующей строки
in = fopen(fname_i, PR_R) ; //открываем файл на чтение
out = fopen(fname_r, PR_W) ; //открываем файл на запись
fgets(st, RAZ, in) ; //читаем строку из файла in
while(!feof(in))
{i = 0 ;
n = 0 ;
flag = 1 ;
sr[i] = '\0' ;
while(st[i])
{k = 0 ;
while(st[i] == ' ') //удаляем в строке ведущие пробелы
i++;
while(st[i] != ' ' && st[i+1]) //выделяем очередное слово
{pr[k] = st[i] ;
k++ ;
i++ ;
}
if(flag) //если у слова нечетный номер -
{flag = 0 ; //заносим в результирующую строку
for(j = 0; j < k; j++,n++)
sr[n] = pr[j] ;
if(st[i])
sr[n] = ' ' ;
n++ ;
}
else flag = 1 ;
i++ ;
}
sr[n++] = '\0' ; //закрываем результирующую строку
fprintf(out, "%s\n", sr) ; //записываем обработанную строку в новый файл
fgets(st, RAZ, in) ; //считываем новую строку из файла
}
fclose(in) ; fclose(out) ; //Закрываем файлы in и out
}
//obrabotka_file_End______________________________________________________
//vivod_file_Begin________________________________________________________
//вывод содержимого файла на экран
void vivod_file(char *fname)
{FILE *in_out ;
char st[RAZ] ; //считанная строка
in_out = fopen(fname, PR_R) ; //открываем файл на чтение
fgets(st, RAZ, in_out) ; //читаем строку из файла in_out
while(!feof(in_out))
{cout << st ; //выводим очередную строку на экран
fgets(st, RAZ, in_out) ;
}
fclose(in_out) ;
}
//vivod_file_End__________________________________________________________
