Указатели. Связь массивов и указателей

Цели работы:

¨ освоить основные операции с указателями;

¨ научиться выполнять доступ к элементам массива через указатели

Краткие сведения об использовании указателей

Понятие указателя

Указатель – это переменная, в которой хранится адрес памяти. Основные операции при работе с указателями - & и *.

Операция определения адреса &определяет адрес ячейки памяти, содержащей заданную переменную. Например, если v – имя переменной, то &v – указатель на эту переменную (т.е. её адрес).

Операция косвенной адресации (операция разыменования указателя) *позволяет обратиться к значению, на которое указывает указатель. Если p – указатель, то *p – значение, на которое он указывает.

Объявление указателя выполняется следующим образом:

тип * имя_указателя[=инициатор];

Пример:

int a=10, b;

int *ptr = &a; //инициализация указателя адресом переменной a

cout <<“указатель =“<<ptr<<“\nПеременная =”<<*ptr;

*ptr=8;

cout << “Переменная a=” << a << endl; // будет выведено 8

Размер указателя зависит от архитектуры компьютера и используемой модели памяти (обычно 4 байта).

Над указателями могут выполняться некоторые арифметические операции - --, ++, к нему можно прибавить и вычесть целое число, из одного указателя можно вычесть другой. При выполнении арифметических действий с указателями предполагается, что указатель указывает на массив элементов соответствующего типа. При прибавлении к указателю целочисленного значения указатель сдвигается на соответствующее количество элементов.

Например:

int *p;

p+=5;

Если int имеет размер 4 байта, то при прибавлении к указателю числа 5 он сдвигается на 20 байт.

Разность двух указателей представляет собой количество элементов массива, их разделяющих.

Связь между массивами и указателями

В C++ массивы и указатели тесно связаны друг с другом. Имя массива можно рассматривать как указатель-константу на начало массива (адрес первого элемента массива):

int a[10];

int *p=a; //то же самое, если бы мы написали int *p = &a[0]; - адрес первого элемента массива

Наоборот, с указателями можно работать как с массивами - использовать операцию индексирования - []:

p[3]=11; //можно было бы написать *(p+3)=11; , используя смещение вместо индекса

cout << a[3]; //11

Следует не забывать, что имя массива можно рассматривать как указатель-константу, его изменение невозможно.

Динамическое формирование массивов

Для динамического управления памятью используются операции new и delete. Операция new выделяет объём памяти для одного или нескольких объектов указанного типа:

int *i, *j;

i = new int; //выделяет память под один элемент int и возвращает указатель на него

j = new int [50]; // выделяет память под массив из 50 элементов int и возвращает указатель на первый элемент

k = new int [20][30]; //выделяет память под массив 20*30 элементов и возвращает указатель на первый элемент.

Операция delete освобождает захваченную память:
delete i;

delete [] j; delete [] k;

 

Пример программы с использованием указателей

В данном примере динамически формируется массив из N элементов и заполняется с клавиатуры. Если первый элемент массива больше последнего элемента, то они меняются местами. После этого массив выводится на экран.

#include <iostream.h>

void main()

{ int n, *c;

cout<<”количество элементов?”; cin>>n; cin.get();

c=new int[n]; int*p=c;

cout<< ”введите элементы массива”<<endl;

for(;p<c+n;p++) cin>>*p;

if (*c>*(c+n-1))//c+n-1 – адрес последнего элемента

{int temp=*c; *c=*(c+n-1); *(c+n-1)=temp;}

for(p=c;p<c+n;p++) cout<<*p<<’ ‘;

cout<<endl; cin.get();

}

Варианты индивидуальных заданий

В приведенных вариантах содержится по две задачи на обработку массивов, которые надо решить, используя указатели для обращения к элементам массивов и динамически выделяя память под массивы (как в приведенном выше примере). Кроме этих двух задач, необходимо решить задачи 4 и 5 из первой работы, используя указатели вместо индексов.

Любое обращение к элементам массива по их индексам в данной работе запрещается!

 

Вариант 1

1. В массиве C из N элементов найти элемент, имеющий наименьшее значение и поменять его местами с последним элементом. Значение N задать при помощи ввода, а сам массив сформировать из случайных чисел в диапазоне от -100 до 100.

2. Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B путем их слияния так, чтобы сначала располагались все элементы массива A, а затем все элементы массива B. Значения N и M ввести с клавиатуры, а массивы A и B сформировать из случайных чисел в диапазоне от 0 до 100.

 

Вариант 2

1.Задан массив из N элементов, состоящий только из нулей и единиц. Определить, строго ли чередуются элементы в массиве. Программа должна вывести либо слово "да", либо слово "нет". Значение N и элементы массива ввести с клавиатуры.

2. Заданы два массива A и B по N элементов. Сформировать и вывести на печать массив L из 2*N элементов:
L=(A(1)+B(1),A(1)-B(1),A(2)+B(2),A(2)-B(2),.....,A(N)+B(N),A(N)-B(N))
Значение N и элементы массива A ввести с клавиатуры.

 

Вариант 3

1. Задан массив A из N элементов. Сформировать массив B, coдержащий только те элементы массива A, значение которых больше заданного числа X. Значения X, N и элементы массива A ввести с клавиатуры.

2. Задан массив А из 20 элементов. Поменять местами 1-й элемент с 11-м , 2-й с 12-м , 3-й с 13-м и т. д. Вывести массив в исходном и полученном состояниях. Элементы массива A должны быть случайными числами в диапазоне от 0 до 100.

 

Вариант 4

1. В массиве A из 20 элементов определить наибольшие из первых десяти элементов и последних десяти элементов и поменять их местами. Элементы массива A должны быть случайными числами в диапазоне от 0 до 100.

2. В массиве A из N элементов поменять местами первый элемент с последним, второй - с предпоследним и т.д. Элементы массива A должны быть случайными числами в диапазоне от 0 до 100. N вводится.

 

Вариант 5

1. Задан массив А из 20 элементов. Поменять местами 1-й элемент с 11-м , 2-й с 12-м , 3-й с 13-м и т. д. Вывести массив в исходном и полученном состояниях. Элементы массива A должны быть случайными числами в диапазоне от 0 до 100.

2. Вывести на экран 25 случайных чисел, находящихся в диапазоне от –100 до 100. Затем найти и вывести на экран номера самого первого и самого последнего и максимального из отрицательных чисел в этом ряду.

 

Вариант 6

1. Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B путем их слияния так, чтобы сначала располагались все элементы массива A, а затем все элементы массива B.

2. Задан массив A из N элементов. Сформировать массив B, содержащий только положительные элементы массива A.

 

Вариант 7

1.В массиве C из N элементов найти элемент, имеющий наименьшее значение и поменять его местами с последним элементом. Массив задать вводом.

2. Реализовать такой алгоритм сортировки массива: сначала найти минимальный элемент и поменять местами с первым, затем найти минимальный элемент, начиная со второго и поменять местами со вторым и т.д.

 

Вариант 8

1. В заданном массиве удалить элемент с заданным номером. Массив и номер удаляемого элемента задаются вводом.

2. В отсортированный массив вставить произвольное число, введенное с клавиатуры, в нужное место.

 

Вариант 9

1. В массиве C из N элементов найти элементы, имеющие наименьшее и наибольшее значение и поменять их местами. Массив задать вводом.

2. Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B путем их слияния так, чтобы сначала располагались все элементы массива A, а затем все элементы массива B. Значения N и M ввести с клавиатуры, а массивы A и B сформировать из случайных чисел в диапазоне от 0 до 100.

 

Вариант 10

1. В массиве C из N элементов найти элемент, имеющий наименьшее значение и поменять его местами с последним элементом. Массив задать вводом.

2. Реализовать такой алгоритм сортировки массива: сначала найти минимальный элемент и поменять местами с первым, затем найти минимальный элемент, начиная со второго и поменять местами со вторым и т.д.

Вариант 11

1. В массиве C из N элементов найти элементы, имеющие наименьшее и наибольшее значение и поменять их местами. Массив сформировать из случайных чисел в диапазоне от -100 до 100.

2. Задан массив A из N элементов и массив B из M элементов. Сформировать массив L из массивов A и B путем их слияния так, чтобы сначала располагались все элементы массива A, а затем все элементы массива B. Значения N и M ввести с клавиатуры, а массивы A и B сформировать из случайных чисел в диапазоне от 0 до 100.

 

Вариант 12

1. В массиве A из 20 элементов определить наименьшие из первых десяти элементов и последних десяти элементов и поменять их местами. Элементы массива A задать вводом.

2. В массиве A из N элементов поменять местами первый элемент с последним, второй - с предпоследним и т.д. Элементы массива A должны быть случайными числами в диапазоне от 0 до 100. N вводится.

 

Лабораторная работа №3

Обработка строк текста

Цели работы:

¨ Освоить работу со строками в стиле С (строки с завершающим нулем)

¨ Освоить стандартную библиотеку для работы со строками string.h

¨ Закрепить навыки работы с указателями

Краткие сведения об обработке строк

Строка в C – это последовательность символов, заканчивающаяся символом c кодом 0 (‘\0’). Строкой может быть как массив с элементами типа char, так и указатель на char.

Описание строк текста

char color[16] – создали массив символов без его заполнения.

char color [] = “blue” – создали массив из 5 элементов и заполнили его.

char *colorPtr = “blue” – то же самое, но при этом создается еще переменная-указатель colorPtr.

Ввод-вывод строк

Функция gets читает строку с консоли. Символ возврата каретки не становится частью строки. Например:

char s[256]; gets(s);

Функция gets требует подключения файла stdio.h. При использовании библиотеки iostream для ввода строк рекомендуется использовать функцию cin.getline. Например:

char s[256]; cin.getline(s, 256);

Обратим внимание, что стандартная операция ввода cin>>s прочитает символы строки до первого пробела.

Функция puts(s) выводит аргумент-строку s и символ конца строки.

Функции преобразования строк

atof(s) – преобразует строку s в тип double

atoi(s) – преобразует строку s в тип int

atol(s) – преобразует строку s в тип long

strtod (s, *ends) – преобразует строку s в тип double. При этом ends будет указывать на непреобразованный остаток исходной строки.

Функции операций над строками

strcpy(s1, s2) - копирует строку s2 в s1. Данная функция может быть использована для удаления или вставки символов. Например:

strcpy(s,s+1); - удалили первый символ из строки s

strcpy(s+1,s); - освободили место для вставки символа в начало строки.

strncpy(s1, s2, n) копирует не более чем n символов из s2 в s1

strcat(s1, s2) дописывает строку s2 в конец строки s1

strncat(s1, s2, n) дописывает строку s2 в конец строки s1, не более чем n символов

Функции сравнения строк

strcmp(s1, s) – сравнивает s1 с s.

Возвращает 0, <0, >0, если s1 соответственно =s, <s, >s.

strncmp(s1, s2, n) – сравнивает до n символов s1 с s. Возвращает 0, <0, >0, если s1 соответственно =s, <s, >s.

Функции поиска в строках

strchr(s, c) – находит позицию первого вхождения символа c в строку s и возвращает указатель на эту позицию.

strstr(s1, s2) – находит позицию первого вхождения строки s2 в s1.

Примеры программ

Пример 1. Удаление пробелов из заданной строки.

1 вариант программы, с созданием промежуточной строки

 

#include <stdio.h>

#include <conio.h>

#include <string.h>

main()

{ int r=0,i=0; char s[80],s1[80];

printf("?");gets(s);

for(i=0;s[i]!=0;i++)

if (s[i]!=' ') {s1[r]=s[i];r++;}

s1[r]=0;

strcpy(s,s1);

puts(s); getch();

}

2 вариант, удаление пробелов выполняем с использованием функции strcpy. Обратите внимание, насколько сократился текст программы.

 

#include <stdio.h>

#include <conio.h>

#include <string.h>

main()

{ char *n; char s[80],s1[80];

printf("?");gets(s);

while(n=strchr(s,' ')) strcpy(n,n+1);

puts(s);

getch();

}

Пример 2. Разделение строки на слова, в С для этого есть очень хорошая функция strtok, которая позволяет выделять слова с использованием любых разделителей (в примере разделитель пробел, но в strtok можно задать целую строку из разделителей, например, “ ,.!?”)

#include <string.h>

#include <stdio.h>

#include <iostream.h>

int main(void)

{ char input[80]; char *p;

cin.getline(input,80);

p = strtok(input, " ");

while (p)

{ printf("%s\n", p);

p = strtok(NULL, " ");

}

cin.get(); return 0;

}

Варианты индивидуальных заданий

Вариант 1

1. С клавиатуры вводится строка символов, представляющая из себя произвольное арифметическое выражение. Проверить баланс открывающихся и закрывающихся скобок.

2. Удалить из заданного текста фрагменты, заключенные в скобки (скобки могут быть вложенными).

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. имеется строка символов, представляющая из себя произвольное арифметическое выражение. Проверить баланс открывающихся и закрывающихся скобок (оформить как логическую функцию).

б. удалить из заданной строки фрагменты, заключенные в скобки (скобки могут быть вложенными). Если баланс скобок нарушен, возвратить строку без изменения

в. возвратить позицию первого символа операции (+ - * / %). Если таких символов нет, возвратить 0.

Вариант 2

1. Вводится строка произвольного текста. Вывести на экран первое и последнее слово (слова разделены пробелами).

2. Удвоить первое слово и удалить последнее.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. три функции для удаления концевых пробелов (ведущих, завершающих, всех концевых пробелов)

б. функция для удаления лишних пробелов между словами (оставить по одному пробелу)

 

Вариант 3

1. Вводится строка произвольного текста, затем вводится произвольный символ. Удалить эти символы из строки, если они в ней есть.

2. Вводится строка произвольного текста, затем вводится произвольный символ. Удвоить эти символы в строке, если они в ней есть.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. подсчитать количество слов в строке

б. возвратить слово с заданным номером (если такого слова нет, возвратить пустую строку)

в. удалить слово с заданным номером (если такого слова нет, возвратить строку без изменения).

 

Вариант 4

1. Удалить из заданной строки текста лишние пробелы (оставить только по одному пробелу между словами).

2. Удвоить каждый пробел в строке.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. определить, есть ли в заданной строке слова, начинающиеся на заданную букву (слова разделены пробелами)- логическая функция.

б. удалить слова, начинающиеся на заданную букву, если таких слов нет, оставить строку без изменения.

в. удвоить слова, начинающиеся на заданную букву, если таких слов нет, оставить строку без изменения. Удвоенные слова разделить знаком – (например, был самый – станет самый-самый)

Вариант 5

1. Определить, есть ли в заданной строке текста слова из четырех букв.

2. Удвоить в заданной строке все гласные буквы.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. определить, есть ли в заданной строке слова, заканчивающиеся на заданную букву (слова разделены пробелами, в конце слова может быть знак препинания)- логическая функция.

б. удалить слова, заканчивающиеся на заданную букву, если таких слов нет, оставить строку без изменения. Удвоенные слова разделить знаком – (например, был самый – станет самый-самый)

в. удвоить слова, заканчивающиеся на заданную букву, если таких слов нет, оставить строку без изменения.

 

Вариант 6

1. Составить программу, которая удаляет из заданной строки текста все цифры, если они есть.

2. Составить программу, которая удваивает в заданной строке текста все цифры, если они есть.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. возвратить количество слов в заданной строке

б. возвратить количество слов из заданного количества букв

в. возвратить первое слово максимальной длины

 

Вариант 7

1. Составить программу, которая в заданном тексте заменяет все заглавные буквы на строчные.

2. Вводится произвольная строка. Удалить самое длинное слово.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

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

б. возвратить последнюю букву первого слова.

в. возвратить последнее слово строки (без пробелов и знаков препинания)

 

Вариант 8

1.Составить программу, выясняющую, является ли данное слово перевертышем ( так называются слова, читающиеся одинаково слева направо и справа налево, например: ПОТОП, НАГАН ).

2. Вводится произвольная строка. Удалить из нее гласные буквы.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. возвратить количество слов из трех букв в заданной строке.

б. возвратить первую букву последнего слова заданной строки

в. в заданной строке удвоить все пробелы.

 

Вариант 9

1. Вводится строка произвольного текста. Вывести на экран предпоследнее и последнее слово (слова разделены пробелами).

2. Удалить последнее слово и удвоить предпоследнее.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. выяснить, является ли данное слово перевертышем ( так называются слова, читающиеся одинаково слева направо и справа налево) - оформить как логическую функцию.

б. возвратить первое слово строки (без пробелов и знаков препинания).

в. удалить первое слово строки со всеми пробелами.

 

Вариант 10

1.Вводятся две строки произвольного текста. Найти позицию первого несовпадающего символа. Предусмотреть и случаи, когда несовпадающих символов нет.

2. Вводятся две строки произвольного текста. Поменять местами первые слова в этих строках.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

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

б. удалить последнее слово из заданной строки.

в. удвоить все пробелы в заданной строке.

 

Вариант 11.

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

2. Удалить из заданного слова все гласные буквы.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. возвратить позицию первого несовпадающего символа двух строк, если несовпадающих символов нет, возвратить нуль.

б. поменять местами первое и последнее слово в заданной строке.

в. удалить все знаки препинания из заданной строки.

 

Вариант 12

1.Вводится строка, представляющая из себя фамилию, имя и отчество. Вывести на экран фамилию и инициалы (инициалы и фамилию).

2. То же задание, но не просто вывести полученную строку на экран, но заменить исходную строку на строку с инициалами.

3. Следующие задания оформить в виде функций. Отдельно разработать демонстрационную программу для демонстрации работоспособности функций.

а. удалить первое слово из заданной строки.

б. удалить последнее слово из заданной строки.

в. удвоить заданный символ (задается в качестве параметра) в заданной строке.

Лабораторная работа №4

Работа с файлами

Цели работы:

¨ познакомиться с возможностями по обработке текстовых файлов;

¨ освоить основы работы с двоичными файлами.

Краткие сведения о работе с файлами с использованием библиотеки stdio

Для работы с внешним файлом на диске в программе требуется объявить файловую переменную: FILE файловый указатель, например: FILE *f;

Открытие файла выполняет функция fopen(), которая возвращает переменную типа FILE. Вся дальнейшая работа с файлом выполняется с использованием файлового указателя.

FILE *fopen(const char *fname, const char *mode);

Первый параметр – имя файла

Второй параметр – режим открытия файла:

“r” – открывает текстовый файл для чтения

“w” – открывает текстовый файл для записи

и др.

Если файл открыть не удалось, возвращается пустой указатель – NULL. Пример:

FILE *f; //файловый указатель

f = fopen(“c:\\autoexec.bat”,”r”); //открыть файл для чтения

if (f==NULL) //если не открылся, выводим сообщение об ошибке

{

printf(“Error\n”);

};

Закрытие файла выполняется функцией fclose. Пример: fclose(f);

Функция feof() позволяет узнать, достигнут ли конец файла. Пример:

while(!feof(f))

{

//читаем из файла

}

Чтобы прочитать из файла один символ, используется функция fgetc:

int fgetc(FILE *stream);

Пример:

char c = fgetc(f);

Чтобы прочиать из файла строку символов, используется функция fgets:

char *fgets(char *str, int num, FILE *stream);

Функция читает из файла строку символов и помещает её в переменную str. Символы читаются до тех пор, пока не будет достигнут символ новой строки или конец файла или не будет прочитано (num-1) символов. В переменной str за последним прочитанным символом помещается нулевой символ.

Пример:

char str[256];

fgets(str,256,f);

printf(“str=%s\n”,str);

 

Функция fprintf выполняет форматированный вывод в файл. Аналогична функции printf:

int fprintf(FILE *stream, const char *format, …);

Пример:

char s[]=”строка”;

int len = strlen(s); //длина строки s

fprintf(f,”длина строки ‘%s’ = %d”,s,len);

Примеры программ

1. Пример обработки текстового файла – копирование строк из одного файла в другой

#include <stdio.h>

#include <conio.h>

main()

{FILE *fin,*fout;

if (fin=fopen("binfile.cpp","r"))

{ char s[100];fout=fopen("b1.cpp","w");

while (fgets(s,100,fin)) {puts(s);fputs(s,fout);}

} else puts("error");

fclose(fout);

getch();return 0;

}

2. То же самое, но демонстрируются функции fprintf, fscanf

#include <stdio.h>

#include <conio.h>

main()

{FILE *fin,*fout;

if (fin=fopen("binfile.cpp","r"))

{ char s[100];fout=fopen("b1.cpp","w");

while (fscanf(fin,"%s",s)!=EOF) {printf("%s\n",s);fprintf(fout,"%s\n",s);}

} else puts("error");

fclose(fout);

getch();return 0;

}

3. Пример обработки двоичного файла – заполнение его значениями 0 1 2 … 9 и вывод их в обратном порядке

#include <stdio.h>

#include <conio.h>

main()

{FILE *f; f=fopen("a.dat","w+b"); int i;

for (i=0;i<10;i++) fwrite(&i,sizeof(int),1,f);

fseek(f,0,0); int x;

for (i=9;i>0;i--) {fseek(f,i*sizeof(int),0);fread(&x,sizeof(int),1,f); printf("%d ",x);}

getch();

}

Варианты индивидуальных заданий

Вариант 1

1. Даны два текстовых файла X.TXT и Y.TXT. Создать третий файл с произвольным именем, в который поместить сначала все строки файла X.TXT, затем все строки файла Y.TXT. Подсчитать число строк в полученном файле, максимальную и среднюю длину строки.

2. Создать текстовый файл, в который записать в столбик несколько чисел. Составить программу, которая подсчитывала бы количество чисел в файле, а затем дописывала бы в его конец столько случайных чисел, чтобы всего чисел оказалось 20. Кроме того, программа должна найти минимальное и максимальное число в полученном файле.

3. Составить программу, которая создает на диске двоичный файл из 20 целых случайных чисел из диапазона [0,50].Затем программа должна создать текстовый файл, записав в него те числа из исходного файла, значения которых больше самого первого из чисел. Все числа из исходного файла вывести на экран в прямом и обратном порядке.

 

Вариант 2

1. Дан текстовый файл с произвольным именем. Выяснить, имеется ли у него одна самая короткая строка или таких строк несколько. Вывести "одна" или "не одна". Все самые короткие строки записать в файл X.TXT.

2. Создать на диске два текстовых файла, в каждый записать в столбик по 6 чисел. Составить программу, которая из двух исходных файлов создавала бы два новых: первый из 12 чисел, в котором чередуются числа из первого и второго файлов; второй - из 6 чисел, где каждое число представляет собой сумму соответствующих чисел первого и второго файлов.

3. Составить программу, которая создает на диске двоичный файл из N случайных чисел из диапазона [-100,100] (N - вводится). Затем создать еще два двоичных файла: в первый записать все положительные числа из исходного файла, а во второй - отрицательные и нули. Вывести на экран содержимое всех трех файлов в прямом и обратном порядке.

 

Вариант 3

1. Дан текстовый файл с произвольным именем. Создать файл B.TXT, в который поместить первую половину строк исходного файла и C.TXT, в который поместить оставшуюся половину. Вывести на экран первую и последнюю строку исходного файла.

2. Составить программу, которая создает на диске текстовый файл из 20 записанных в столбик случайных чисел из диапазона [0,100] (воспользоваться функцией RANDOM). Затем создать еще два файла. В первый включить только те числа из исходного, которые меньше среднего арифметического, а во второй - остальные.

3. Составить программу, которая создает на диске двоичный файл из 20 целых случайных чисел из диапазона [0,100] (воспользоваться функцией RANDOM).Затем создать еще два двоичных файла. В первый включить только те числа из исходного, которые меньше и равны 50, а во второй все остальные. Вывести на экран содержимое всех трех файлов в прямом и обратном порядке.

 

Вариант 4

1. Дан текстовый файл с произвольным именем. Вывести на экран только те его строки, в которых содержится хотя бы один восклицательный знак. Строки, в которых нет ни одного восклицательного знака, записать в файл A.TXT

2. Создать текстовый файл, в который записать несколько чисел, упорядоченных в порядке возрастания. Разработать программу, которая вводит с клавиатуры произвольное число и записывает его в файл таким образом, чтобы не нарушить упорядоченности.

3. Ту же задачу решить для двоичного файла. Числа можно вводить с клавиатуры и сразу записывать в файл, а можно сформировать файл автоматически из случайных чисел, упорядоченных по возрастанию.

 

Вариант 5

1. Дан текстовый файл с произвольным именем. Создать файл с именем B.TXT, в который записать только те строки из исходного файла, длина которых меньше заданного целого числа L. L задается оператором ввода. Его записать в файл B.TXT в виде отдельной, самой первой, строки.

2. Создать 2 текстовых файла, в которые записать по нескольку чисел, упорядоченных в порядке возрастания. Разработать программу, которая создает из исходных третий файл, в котором данные также упорядочены.

3. Составить программу, которая создает на диске двоичный файл из 20 целых случайных чисел из диапазона [0,100]. Отсортировать файл по возрастанию, не используя промежуточного массива.

 

Вариант 6

1. Дан файл с произвольным текстом (имя файла вводится). Подсчитать, сколько слов содержит этот файл. Переносы слов допускаются. Полученное значение вывести на экран и записать в текстовый файл с именем NUM.TXT

2. Создать текстовый файл, в который записать несколько чисел. Программа должна делать следующее. С клавиатуры вводится произвольное число. Удалить из файла все числа, равные введенному числу (рекомендуется создать промежуточный файл).

3. Ту же задачу решить для двоичного файла, который сформировать из чисел, введенных с клавиатуры (без создания промежуточного файла).

 

Вариант 7

1. Дан файл с произвольным текстом (имя файла вводится). Подсчитать, сколько слов в нем заканчиваются на букву "a". Полученное значение вывести на экран и записать в текстовый файл с именем NUM.TXT

2. Создать текстовый файл, в который записать несколько чисел. Программа должна делать следующее. С клавиатуры вводится произвольное число. Добавить это число в начало, конец и середину файла (рекомендуется создать промежуточный файл).

3. Ту же задачу решить для двоичного файла, который сформировать из чисел, введенных с клавиатуры (без создания промежуточного файла).

 

Вариант 8

1. Дан текстовый файл с произвольным именем. Подсчитать и вывести на экран число символов в нем, а также максимальную и минимальную длину строки. Создать файл с именем A.TXT, в который записать все самые длинные и самые короткие строки.

2. Создать текстовый файл, в который записать несколько чисел. Программа должна проверить, числа в файле упорядочены по возрастанию, по убыванию или вообще не упорядочены.

3. Сформировать двоичный файл из случайных чисел. Упорядочить числа в файле без использования промежуточного массива.

 

Вариант 9

1. Даны два текстовых файла с произвольными именами. Подсчитать, который из них содержит больше символов, и в котором больше строк. Результаты вывести на экран. Имена файлов, количество символов и количество строк в каждом из них сохранить в файле REZ.TXT, по каждому файлу все данные записать в виде одной строки.

2. Создать текстовый файл, в который записать последовательность из нулей и единиц. Программа должна представлять из себя простейший архиватор, который заменяет группу из повторяющихся нулей на их количество (одиночный нуль, конечно, не заменять). Рекомендуется создать промежуточный файл.

3. Сформировать двоичный файл из случайных чисел. Переставить в файле первое число с последним, второе с предпоследним и т.д..

 

Вариант 10

1. На диске имеется текстовый файл с произвольным именем. Подсчитать, сколько раз в нем встречается заданное слово (слово задается при помощи оператора ввода, считаем, что переносов слов в файле нет). Результат вывести на экран, а также создать файл REZ.TXT, в который записать фразу «Слово такое-то встречается в файле таком-то столько-то раз»

2. В текстовый файл записать 10 чисел. Дописать в его конец те же 10 чисел, но в обратном порядке (использовать промежуточный файл или массив).

3. Ту же задачу решить для двоичного файла. Не использовать ни промежуточного файла, ни массива.

 

Вариант 11

1. На диске имеется текстовый файл с произвольным именем. В файл A.TXT вывести все слова из заданного количества букв (количество букв в слове вводится), каждое в отдельной строке.

2. В текстовый файл записать 20 чисел. Переставить местами первые и последние 10 чисел (использовать промежуточный файл или массив).

3. Ту же задачу решить для двоичного файла. Не использовать ни промежуточного файла, ни массива.

 

Вариант 12

1. Дан файл с произвольным текстом (имя файла вводится). Подсчитать, сколько слов в нем начинаются на букву "a". Полученное значение вывести на экран и записать в текстовый файл с именем NUM.TXT

2. Создать текстовый файл, в который записать несколько чисел. Программа должна проверить, числа в файле упорядочены по возрастанию, по убыванию или вообще не упорядочены.

3. Сформировать двоичный файл из случайных чисел. Упорядочить числа в файле без использования промежуточного массива.

Заключение

Тематика лабораторных работ в данных методических указаниях была подобрана таким образом, чтобы в процессе их выполнения студенты получили представление о различных аспектах разработки программ на языке C++ и освоили как можно больше стандартных приемов разработки и отладки программ.

Внимательное и добросовестное выполнение лабораторных работ является необходимым условием для успешной разработки программного продукта в рамках курсового проекта по данной дисциплине и залогом будущих успехов в работе в области информационных технологий.

 

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Ахо, А. Структуры данных и алгоритмы/ А.Ахо, Д. Хопкрофт, Д. Ульман; пер. с англ. – М.: Вильямс, 2000. – 384 с.

2. Бежанова, М. Современные понятия и методы программирования /М.М. Бежанова, И.В. Поттосин—М.: Научный мир, 2000.— 191 с.

3. Бежанова, М. Практическое программирование. Структуры данных и алгоритмы: учебник / М.М. Бежанова, Л.А. Москвина, И.В. Поттосин —М.: Логос, 2001. —223 с.

4. Подбельский, В. Язык С++: Учебное пособие для ВУЗов / В.В.Подбельский — М.: Финансы и статистика, 2002. — 560с.

5. Дворжецкий, А. Программирование на С и С++ / А. Дворжецкий —М.: Познавательная книга плюс, 2000. —272 с.

6. Либерти, Дж. ОсвойсамостоятельноC++ за 21 день / Дж. Либерти; пер. с англ. —М.: Вильямс, 2000. — 816 с.

7. Баженова, Н. Visual С++ 6.0 / Н.Ю.Баженова — М.: Диалог-МИФИ, 1999. — 416 с.