ПО ДИСЦИПЛИНЕ «ПРОГРАММИРОВАНИЕ»




МЕТОДИЧЕСКИЕ УКАЗАНИЯ

К ЛАБОРАТОРНЫМ РАБОТАМ

ПО ДИСЦИПЛИНЕ «ПРОГРАММИРОВАНИЕ»

Язык С++

 

 

Составители

И. А. КОЛОМИЕЦ

С.С. ГЛАДЬО

 

Владимир 2012


УДК 621.396

ББК 32.988-5я7

 

Рецензент

Кандидат технических наук,

доцент кафедры радиотехники и радиосистем

Владимирского государственного университета

В.А.Ефимов

 

 

Печатается по решению редакционного совета

Владимирского государственного университета

 

 

Методические указания к лабораторным работам по дисциплине «Программирование», часть 1 / Владим. гос. ун-т; сост. И. А. Коломиец,
С. С. Гладьо. – Владимир: Изд-во Владим. гос. ун-та, 2012. – 39 с.

 

Рассматриваются вопросы решения практических задач на ЭВМ, создания программ на языке высокого уровня С++ для вычислительных процессов различных структур, для задач обработки различных типов данных. Особое внимание уделяется структурному подходу, модульности. Приводятся примеры выполнения каждого задания, раскрываются приемы программирования. Содержат требования к содержанию отчета и таблицу номеров задач для каждой работы по указанному в литературе задачнику.

Предназначены для студентов направления 230100 – «Информатика и вычислительная техника» всех форм обучения, но могут быть полезны для всех, начинающих изучать язык С++.

Библиогр.: 8 назв.

 

 

УДК 621.396 ББК 32.988-5я7


Введение

 

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

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

Основная цель лабораторных работ – сформировать у студентов фундаментальные основы знаний, необходимые при проектировании программ для вычислительных систем, привить навыки системного подхода к решению поставленной задачи, на практике познакомить с этапами решения практических задач на ЭВМ, научить оформлять сопроводительную документацию.

 

Содержание отчетов

Каждая лабораторная работа выполняется с оформлением соответствующей документации. В документации обязательно должны быть представлены следующие пункты:

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

2. Схема алгоритма решения задачи.

3. Спецификации всех разработанных процедур и/или функций.

4. Текст программы решения задачи на языке высокого уровня С++.

5. Тесты и результаты тестирования. Тесты должны включать входные и выходные данные и содержать все возможные варианты входных данных. Тесты должны покрывать все ветви алгоритма.

6. Выводы по работе.

Все представленные пункты должны быть отражены в отчете по каждой лабораторной работе.

 

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

 

Индивидуальным заданием к каждой лабораторной работе является соответствующая задача из задачника [5], номер которой определяется по таблице 1 (см. приложение 2). Столбцы таблицы соответствуют номерам лабораторных работ, а строки - вариантам. Если преподавателем не оговорено другое, то номер варианта есть номер студента в списке группы.

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

Творческий подход к выполнению задания заключается в выборе методов решения задач, структурировании алгоритмов и объединении структурных блоков в единый проект, комментировании текста программ.

 

Подготовка к лабораторным работам

 

Для выполнения лабораторных работ потребуется среда разработки, поддерживающая язык С++. В данных методических указаниях будем ориентироваться на Microsoft Visual Studio, версии не ниже 8.0.

Все лабораторные работы данного цикла ориентированы на создание консольных приложений, поскольку изучение средств визуализации проходит на старших курсах подготовки студентов.

Для создания проекта в среде Microsoft Visual Studio выполните следующее:

1. Запустите Microsoft Visual Studio.

2. Выберите в меню создание нового проекта: File-> New -> Project...

3. В открывшемся окне:

а) выберите Visual C++

б) выберите Win32 Consol Application (Visual C++).

в) в строке ввода Name введите имя проекта, в строке Location укажите место расположения будущего проекта на диске (рабочая директория проекта), в строке Solution name будет то же самое имя проекта, что и в Name.

4. Нажмите кнопку ОК.

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

Для компиляции приложения выберите в меню Build->Build Solution (или нажмите F7). Если компиляция выполнилась без ошибок, то в рабочей директории проекта будет создан исполняемый файл с именем проекта и расширением .exe. Если компилятор обнаружил ошибки, то их список будет располагаться в окне Output, там же появляется сообщение об успешной («Build succeeded»), либо неуспешной («Build FAILED») компиляции.

Для отладки программы можно выполнять ее по шагам, для этого выберите в меню Debug-> Step Over (или Step Into), или нажмите F10 (F11).

 

Лабораторная работа № 1.
Алгоритмизация линейных
вычислительных процессов.

 

1. Цель работы

Изучение принципов алгоритмизации линейных вычислительных процессов, способов записи алгоритмов. Исследование структуры программ, типов данных, стандартных библиотек. Получение навыков отладки программ.

2. Порядок выполнения работы

2.1. Изучить структуру программы на языке С++, структуру проекта Visual Studio (VS).

2.2. Изучить простые типы данных, объявление переменных и констант, процедуры и операторы ввода-вывода (printf и scanf, cin и cout).

2.3. Изучить порядок использования библиотечных ресурсов, директиву #include, библиотеку iostream, файл stdafx.

2.4. Создать проект в VS (см. подготовка к лабораторным работам), в функцию main внести текст представленного примера. В тексте примера намеренно допущен ряд типичных для начинающих ошибок.

2.5. Выполнить компиляцию получившейся программы и получить список ошибок.

2.6. Исправить все указанные ошибки и скомпилировать еще раз.

2.7. Если компиляция неудачная, снова выполнить п. 2.6.

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

2.9. Записать алгоритм п. 2.8 на языке С++.

2.10. Добавить созданный текст п. 2.9 к тексту функции main и добиться успешной компиляции всего проекта.

2.11. Подготовить набор тестов (см. содержание отчетов, п. 5) и выполнить тестирование проекта:

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

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

 

3. Пример выполнения задания

Найти скалярное произведение двух векторов; считать, что размерность векторов равна 3, угол между векторами 600.

Метод решения: скалярное произведение равно произведению длин двух векторов на косинус угла между ними.

3.1 Текст программы на С++.

  //модуль lab1.cpp   #include "stdafx.h" #include <cmath> #define int M_PI 3.14 const level = 2;   int main() { //добавление возможности писать на русском языке setlocale(LC_ALL, "RUS");   int x1, x2; //координаты первого вектора int y1, y2; //координаты второго вектора double a = 60; //угол между векторами int p; //скалярное произведение printf("Введите координаты первого вектора: x1, x2, x3 = \n"); scanf("%%%i", x1, x2, x3); printf("x1 = %s\n", x1); printf("x2 = %s\n", x2); printf("x3 = %s\n", x3); printf("Введите координаты второго вектора: y1, y2, y3 = \n"); scanf("%%%i", y1, y2, y3); printf("y1 = %s\n", y1); printf("y2 = %s\n", y2); printf("y3 = %s\n", y3);   d1 = sqrt((double)(x1*x1 + pow((double)x2, level) + pow((double)x3, (double)level))); d2 = sqrt((double)(y1*y1 + pow((double)y2, (int)2) + pow((double)y3, level))); radians = a * M_PI / 180 p = d1*d2 * cos(radians); printf("Длина первого вектора = 5.2i\n", d1); printf("Длина второго вектора = 5.2i\n", d2); printf("Скалярное произведение = 5.2i\n");   system("pause"); //Для продолжения нажмите любую клавишу... //(чтобы окошко не закрывалось) return 0; }

4. Контрольные вопросы

1. Какие существуют способы записи алгоритма?

2. Метод нисходящего проектирования, в чем его особенности?

3. Линейные операторы языка С++.

4. Простые типы данных языка С++.

5. Структура программы на языке С++.

6. Стандартные библиотеки и их подключение.

7. Что такое идентификатор, переменная, константа?

8. Что такое совместимость типов?

9. Явное и неявное преобразование типов.

 

Лабораторная работа № 2.
Алгоритмизация разветвляющихся
вычислительных процессов.

 

1. Цель работы

Изучение принципов алгоритмизации и структуры алгоритмов разветвляющихся вычислительных процессов.

2. Порядок выполнения работы

2.1. Изучить структуры алгоритмов разветвляющихся вычислительных процессов. Изучить отличия структурного алгоритма от неструктурного.

2.2. Изучить синтаксис и работу операторов ветвления if и switch.

2.3. Изучить пример выполнения задания. Обратите внимание, что здесь и далее библиотечные модули, используемые в работе, подключаются в файле stdafx.h, а сам файл stdafx.h подключается в основном модуле, содержащим точку входа консольного приложения – функцию main.

2.4. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям из пункта 2.5.

2.5. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать ввод и вывод всех требуемых данных через диалог ЭВМ с человеком (интерфейс ввода-вывода), организовать проверку входных данных на допустимые значения. Запрещается использование неструктурного оператора goto. Возможно использование досрочного выхода из процедуры с помощью оператора return.

2.6. Разработать программу на языке С++ для алгоритма п. 2.4.

2.7. Выполнить отладку и компиляцию программы, получить исполняемый файл.

2.8. Выполнить тестирование программы несколькими наборами входных данных.

3. Пример выполнения задания

Даны действительные числа a, b, c, d.

Если a<=b<=c<=d, то каждое число заменить наибольшим из них; если a>b>c>d, то оставить без изменений; в противном случае все числа заменяются их квадратами.

3.1 Текст программы на С++.

  // модуль lab2.cpp   #include "stdafx.h"   const int level = 2;   int main() { setlocale(LC_ALL, "RUS");   //диалог и ввод данных-------------------------------------------------------------------------- int lm = 0; //для меню cout << "Выберите желаемое действие: " << endl; cout << "1: Решить задачу: " << endl; cout << "2: Выйти из приложения (без решения задачи)" << endl; cout << "Введите желаемое действие: "; cin >> lm; switch(lm){ //switch case 1: float a, b, c, d; printf("Введите число a = "); scanf("%f", &a); printf("Введите число b = "); scanf("%f", &b); printf("Введите число c = "); scanf("%f", &c); printf("Введите число d = "); scanf("%f", &d); //решение задачи--------------------------------------------------------------------------------- if ((a <= b) & (b <= c) & (c <= d)) { a = d; //a = b = c = d; b = d; c = d; } else if ((a > b) & (b > c) & (c > d)) // если написать противоположное условие, то операторы будут в блоке "true"; //пустой оператор else { // различные способы возведения в квадрат a *= a; b = b*b; c = pow(c, 2); d = pow(d, level); } //вывод результатов----------------------------------------------------------------------------- printf("\nЧисло a = %3.2f", a); printf("\nЧисло b = %3.2f", b); printf("\nЧисло c = %3.2f", c); printf("\nЧисло d = %3.2f\n\n", d);   break; default: break; }// конец switch   std::system("pause"); return 0; }

 

4. Контрольные вопросы

1. Какие управляющие структуры используются в языке C++ для организации разветвляющихся алгоритмов?

2. Поясните порядок выполнения оператора if…else и его сокращенной формы?

3. Поясните порядок выполнения оператора switch. Каково здесь назначение оператора break?

4. Сколько операторов можно написать после ключевых слов if и else?

5. Что такое составной оператор?

6. Как разрешается неоднозначность, которая может возникнуть при использовании вложенных операторов if?

 

Лабораторная работа № 3.
Алгоритмизация циклических
вычислительных процессов.

 

1. Цель работы

Изучение принципов алгоритмизации и структуры алгоритмов циклических вычислительных процессов, и задач, связанных с обработкой массивов. Изучение структурированного типа данных – массива. Освоение методики пошаговой детализации задачи.

 

2. Порядок выполнения работы

2.1. Изучить структуры алгоритмов циклических вычислительных процессов. Изучить общие принципы работы с массивами.

2.2. Изучить синтаксис и работу операторов for, while и do-while, директиву #define.

2.3. Изучить пример выполнения задания. Обратите внимание, что имя массива фактически есть адрес первого элемента массива в памяти.

2.4. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям из пункта 2.5, используя метод пошаговой детализации.

2.5. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Для решения задачи использовать одномерный массив. Необходимо предусмотреть именованную константу для задания размерности массива, величина константы должна быть не менее 20. Фактический рабочий размер массива должен определяться переменной, задаваемой в качестве исходных данных. Предусмотреть инициализацию массива на выбор пользователя ручным способом или с помощью генератора случайных чисел. Необходимо использовать все три оператора цикла: либо разные части алгоритма выполнить, используя разные операторы цикла, либо одну и ту же часть выполнить тремя способами.

2.6. Разработать программу на языке С++ для алгоритма п. 2.4.

2.7. Выполнить отладку и компиляцию программы, получить исполняемый файл.

2.8. Выполнить тестирование программы несколькими наборами входных данных.

3. Пример выполнения задания

Даны натурально число n, действительное число x.

Вычислить: .

3.1 Текст программы на С++.

  // модуль lab3.cpp   #include "stdafx.h" #define MAX_SIZE 100; //константа – максимальный размер массива   int main() { setlocale(LC_ALL, "RUS");   unsigned int n = 0; //фактический рабочий размер массива float x = 0; float mas[MAX_SIZE] = {0}; //объявление массива максимального размера //диалог и ввод данных------------------------------------------------------------------------- printf("Введите количество элементов в массиве (натуральное число) = "); scanf("%i", &n); printf("Введите вещественное число x = "); cin >> x; //решение задачи--------------------------------------------------------------------------------- //первый вариант реализация цикла (for) float p = 1; //произведение for(unsigned int k = 0; k < n; k++) { //-----------------------------счетный цикл mas[k] = (k/(k+1))-pow(cos(abs(x)), (int)k); p *= (mas+k)[0]; //mas – есть адрес массива в памяти } printf("\n\nПроизведение равно (первый способ) = %3.5f\n\n", p);   //второй вариант реализация цикла (while) unsigned int k = 0; //счетчик p = 1; while (k < n) { //--------------------------------------------цикл с предусловием mas[k] = (k/(k+1))-pow(cos(abs(x)), (int)k); p *= *(mas+k); k = k + 1; } cout << "Произведение равно (второй способ) = " << p << endl << endl;   //третий вариант реализации цикла (do-while) k = 0; p = 1; do { //----------------------------------------------------------цикл с постусловием mas[k] = (k/(k+1))-pow(cos(abs(x)), (int)k); p *= mas[k]; k++; }while(k < n); printf("Произведение равно (третий способ) = %3.5f\n\n\n", p); system("pause"); return 0; }

4. Контрольные вопросы

1. Функциональная схема цикла и назначение ее отдельных частей.

2. Какие виды циклов существуют, в чем их принципиальные отличия?

3. Назначение цикла for и его отдельных компонентов.

4. Укажите, сколько операторов можно разместить в теле цикла?

5. Можно ли в теле цикла изменять значение параметра цикла?

6. Можно ли вне тела цикла использовать значение параметра цикла?

7. Как работают операторы while и do-while?

8. Какими способами можно инициализировать массив?

9. Какими способами можно обращаться к элементам массива?

10. Какова общая схема работы с массивом?

 

Лабораторная работа № 4.
Программирование вложенных циклов
и матричных задач

 

1. Цель работы

Изучение принципов алгоритмизации и структуры алгоритмов, содержащих вложенные циклы, и задач, связанных с обработкой матриц и многомерных массивов.

 

2. Порядок выполнения работы

2.1. Изучить особенности организации вложенных циклов, принципы работы с многомерными массивами.

2.2. Изучить работу оператора break и принципы его применения.

2.3. Изучить пример выполнения задания.

2.4. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям из пункта 2.5, используя метод пошаговой детализации.

2.5. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Для решения задачи использовать многомерный массив. Необходимо предусмотреть именованную константу для задания размерности массива, величина константы должна быть не менее 20. Фактический рабочий размер массива должен определяться переменными, задаваемыми в качестве исходных данных. Предусмотреть инициализацию массива на выбор пользователя ручным способом или с помощью генератора случайных чисел.

2.6. Разработать программу на языке С++ для алгоритма п. 2.4.

2.7. Выполнить отладку и компиляцию программы, получить исполняемый файл.

2.8. Выполнить тестирование программы несколькими наборами входных данных.

3. Пример выполнения задания

Даны натуральные числа n и z, определяющие количество фактических строк и столбцов в матрице соответственно, действительные числа , …, . Получить в порядке следования все , удовлетворяющие неравенствам .

Метод решения: для каждого элемента матрицы xi,k (начиная с x 0,1) проверяется, все ли перед ним стоящие элементы меньше его, при этом каждая следующая строка матрицы считается продолжением предыдущей.

 

3.1 Текст программы на С++.

  // модуль lab4.cpp.   #include "stdafx.h" #define MAX_SIZE 100;   int main() { setlocale(LC_ALL, "RUS"); //фактическое количество элементов в строке - n, в столбце – z unsigned int n = 0, z = 0; float x[MAX_SIZE][ MAX_SIZE]; // диалог и ввод данных … (см. пример лаб. раб. № 3)---------------------------------- // инициализация массива псевдослучайными числами--------------------------------- for(unsigned int i = 0; i < n; i++) //внешний цикл – по строкам for(unsigned int j = 0; j < z; j++) //вложенный цикл – по столбцам { //генерация псевдослучайного числа x[i][j] = ((float)rand()/RAND_MAX+rand()%100 - rand()%50); } //вывод матрицы на экран--------------------------------------------------------------------- printf("\n\n"); for(unsigned int i = 0; i < n; i++) for(unsigned int j = 0; j < z; j++) printf("[%i][%i] элемент матрицы = %3.2f\n", i, j, x[i][j]); printf("\n\n"); // решение задачи--------------------------------------------------------------------------------- unsigned int stroka; //строка матрицы, в которой находится найденный //k элемент, подходящий по условию задачи for(unsigned int i = 0; i < n; i++) for(unsigned int k = 0; k < z; k++) { //обход матрицы до i строки, в которой находится k элемент bool flag = true; //флаг выполнения условия задачи for(unsigned int temp_i = 0; temp_i <= i; temp_i++) { if (flag == false) break; // выход из ближайшего цикла unsigned int temp_j = 0; //обнуляем счетчики unsigned int temp_k = 0; //обход матрицы (i строки) до k элемента (включительно) while(temp_j <= temp_k) { //анализириуем на какой строке находится k элемент if (i!= temp_i) //если k элемент находится на отличной от i строки temp_k = z-1; else temp_k = k; //если k элемент находится на i строке if (x[i][k] >= x[temp_i][temp_j]) stroka = temp_i; else { flag = false; //нарушение условия задачи break; } temp_j++; //увеличиваем счетчик (столбцы) }//while }//for if (flag) //анализируем флаг выполнения заданного условия printf("x[%i][%i] = %3.2f\n", stroka, k, x[stroka][k]); }//for printf("\n\n"); system("pause"); return 0; }

 

4. Контрольные вопросы

1. Какова общая схема работы с многомерным массивом?

2. Каковы правила организации вложенных циклов?

3. Какие существуют способы объявления массива?

4. Назовите алгоритм работы и правила использования неструктурного оператора break.

 

Лабораторная работа № 5.
Алгоритмизация задач обработки
символьной информации

 

1. Цель работы

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

 

2. Порядок выполнения работы

2.1. Изучить особенности объявления, обработки и представления в памяти ЭВМ символьного типа данных. Изучить определение пользовательского типа данных (typedef).

2.2. Изучить типы char и string, особенности их использования, изучить отличия символьной и строковой константы (к последней всегда добавляется нулевой байт).

2.3. Изучить работу с функциями библиотеки string.h: strlen, strupr, strchr, strlwr, strcat, strcpy, strcmp memset; библиотеки ctype.h: isdigit, isalnum, isalpha, tolower, toupper.

2.4. Изучить пример выполнения задания. Обратите внимание, что значение строковой переменной всегда должно заканчиваться нулевым байтом.

2.5. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям из пункта 2.6, используя метод пошаговой детализации.

2.6. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Для решения задачи использовать символьный массив и указатель на строку. Предусмотреть инициализацию массива и строк на выбор пользователя ручным способом или с помощью строковых констант. Использовать объявление символьного массива с предварительным заданием типа.

2.7. Разработать программу на языке С++ для алгоритма п. 2.5.

2.8. Выполнить отладку и компиляцию программы, получить исполняемый файл.

2.9. Выполнить тестирование программы несколькими наборами входных данных.

3. Пример выполнения задания

Даны символы s 1, s 2 … Известно, что символ s 1 отличен от пробела и что среди s 2, s 3 … имеется хотя бы один пробел. Рассматриваются s 1, …, sn - символы, предшествующие первому пробелу (n заранее неизвестно). Преобразовать последовательность s 1, …, sn, удалив все символы, не являющиеся буквами или цифрами, и заменив каждую большую букву одноименной малой.

3.1 Текст программы на С++.

  // модуль lab5.cpp   #include "stdafx.h" #include <Windows.h>   typedef char string_user[100]; //пользовательский тип строка из 99 символов //(в последний компилятор записывает 0, для обозначения конца строки) using namespace std; //область видимости для встроенного типа //string из библиотеки string.h int main() { setlocale(LC_ALL, "RUS"); //char st1[100]; // вариант объявления символьного массива из 99 символов // инициализация строковой константой---------------------------------------------- string_user st1("Ис2х!од)(ны:й тЕКСт 2: abcDF1+2=3!!!");   //или ввод исходной строки пользователем----------------------------------------------- printf("Введите последовательность символов - строку: \n"); std::cin.getline(st1, 99); printf("\n"); //проверка на допустимость входных данных while ((strlen(st1)==0) || (st1[0]==' ') || strchr(st1, ' ')==NULL) //strchr(st1, ' '); { printf("Повторите ввод, первый символ не должен быть пробелом\n"); std::cin.getline(st1, 99); printf("\n"); } OemToAnsi(st1, st1); //преобразует введенные данные в символьный набор   cout << "#Исходная последовательность символов" << endl; cout << st1 <<endl; //поиск первого пробела----------------------------------------------------------------------- int n = 0; //переменная для сохранения позиции пробела char buf[100] = ""; for (n = 0; st3[n]!= ' '; n++); //удаляем все символы, кроме букв и цифр---------------------------------------------- memset (buf, 0, 100); //очищаем строку, заполняя все символы нулями j = 0; for (int i = 0; i < n; i++) // для русского алфавита (маленькие и большие буквы) if (((int(st1[i]) >= -64)&&(int(st1[i]) <= -1)) || //добавляем английский алфавит ((int(st1[i]) >= 65 &&int(st1[i]) <= 90)||(int(st1[i]) >= 97 && st1[i] <= 122)) //добавляем цифры ||((int(st1[i]) >= 48 && int(st1[i]) <= 57))) buf[j++] = st1[i]; strcpy(st1, buf); //преобразуем большие буквы в маленькие (приводим к нижнему регистру)----- char * pst3 = strlwr(buf); cout << "#Преобразованная последовательность символов " << endl; cout << pst3 << endl;   system("pause"); return 0; }

 

4. Контрольные вопросы

1. Какие существуют способы организации символьных данных?

2. Объявление и инициализация символьных массивов.

3. В чем отличие символьной и строковой константы?

4. Как хранится строковое значение в памяти ЭВМ?

5. Общие принципы работы с символьными данными.

6. Библиотеки и функции для работы со строками.

7. Какие возможны операции над строками?

 

Лабораторная работа № 6.
Процедуры и функции

 

1. Цель работы

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

2. Порядок выполнения работы

2.1. Изучить принципы организации модульности в С++ (заголовочные файлы -. h и файлы реализации -. cpp), изучить организацию подпрограмм в С++, особенности связей по управлению и по данным.

2.2. Изучить понятия области видимости и время жизни переменных, формальные и фактические параметры функций. Изучить особенности передачи параметров в функцию по значению и по ссылке.

2.3. Изучить работу оператора return, тип void, операторов *, &.

2.4. Изучить пример выполнения задания. Обратите внимание на содержимое модулей func.h и func.cpp, их взаимосвязь с модулем lab 6 .cpp. Обратите внимание на список параметров каждой из функций и соответствующий вызов, на возвращаемые значения. Пример диаграммы модулей и спецификация одной из разработанных функций представлены в приложении 1.

2.5. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям п. 2.6, используя метод пошаговой детализации.

2.6. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Алгоритм решения задачи разбить на функциональные блоки, оформить блоки в виде функций, обязательно со списком параметров (каждый из способов передачи параметров должен быть использован в работе хотя бы один раз). Должна быть хотя бы одна функция, возвращающая значение (не void).

2.7. Разработать программу на языке С++ для алгоритма п. 2.5, удовлетворяющую требованиям п.2.8, используя модульный подход.

2.8. Требования к проекту. Сформировать по одному или несколько заголовочных модулей и файлов реализации, которые будут содержать разработанные функции. Написать главную функцию main, используя правила структурного подхода: она должна содержать в основном только вызов функций, все вычисления должны быть внутри разработанных функций.

2.9. Выполнить отладку и компиляцию программы, получить исполняемый файл.

2.10. Выполнить тестирование программы несколькими наборами входных данных.

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

3. Пример выполнения задания

Даны целые числа a 1, …, an, b 1, …, bm, k. Если в последовательности a 1, …, an нет ни одного члена со значением k, то первый по порядку член этой последовательности, не меньший всех остальных членов, заменить на значение k. По такому же правилу преобразовать последовательность b 1, …, bm применительно к 10.

 

3.1 Текст программы на С++ (часть).

  // модуль lab6.cpp #include "stdafx.h" #include "func.h"   int arr_a[100], arr_b[100]; //объявление массивов int main() { setlocale(LC_ALL, "RUS"); int a_size = 0, b_size = 0; //кол-во элементов в массиве a и b   cout << "Данные для первого массива a" << endl; menu(a_size, arr_a); out(a_size, arr_a); cout << "Данные для второго массива b" << endl; menu(b_size, arr_b); out(b_size, arr_b);   int k = 8; //число для сравнения (исходные данные) cout << "Обработка первого массива a" << endl; mission(a_size, arr_a, k); cout << "Обработка второго массива b" << endl; mission(b_size, arr_b, 10);   system("pause"); return 0; }//========================================================= //модуль func.h   //в этом файле описаны все интерфейсы подпрограмм #pragma once; // директива – «включать один раз» #include "stdafx.h"   void enter (int, int *); //функция ввода эл-ов массива (ввод с клавиатуры) void genm (int size, int * arr); //функция иниц. массива случайными числами void out (int size, int * arr); //функция вывода массива на экран void menu (int &size, int * arr); //функция отображения меню на экране bool InMas(int size, int * arr, int y); //функция проверки вхождения элемента в мас. void task(int size, int arr[], int y); //функция преобразования массива по заданию void mission(int size, int * arr, int &y);//функция вызова преобразования массива //============================================================ //модуль func.cpp (представлена только часть функций)   //функция проверки вхождения элемента в массив bool InMas(int size, int * arr, int y) { for(unsigned int i = 0; i < size; i++) if (arr[i] == y) return false; return true; }//-------------------------------------------------------------------------------------------------- //функция преобразования массива по заданию void task(int size, int arr[], int y) { int i = 0; //счетчик while(arr[i+1] > arr [i]) i++; arr[i] = y; }//------------------------------------------------------------------------------------------------- //функция вызова преобразования массива void mission(int size, int * arr, int &y) { cout << "Введите число для сравнения: "; cin >> y; if (mas(size, arr, y)) { cout << "В последовательности нет элемента со значением k" << endl; cout << "Преобразованный массив:" << endl; task(size, arr, y); out(size, arr); } else cout << "В последовательности есть элемент со значением k" << endl << "Массив не преобразуется" << endl; }

 

4. Контрольные вопросы

1. Что такое подпрограмма? Каково ее назначение?

2. Назовите основные принципы модульности и как они реализованы в С++.

3. Что такое область видимости и время жизни объекта программы?

4. Глобальные и локальные переменные.

5. Формальные и фактические параметры.

6. Назовите основные принципы структурного программирования.

7. Как происходит передача параметров в подпрограмму, какие аппаратные и программные средства для этого используются?

8. В чем принципиальное отличие передачи параметра по значению и по ссылке, в каких случаях используется одно и другое?

9. Что такое синоним переменной, чем он отличается от указателя?

10. Для чего нужно предварительное объявление функции?

11. Покажите в своей работе предварительное объявление, реализацию (тело) и вызов функции.

 

Лабораторная работа № 7.
Файлы и структуры

 

1. Цель работы

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

 

2. Порядок выполнения работы

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

2.2. Изучить возможности и правила перегрузки функций.

2.3. Изучить синтаксические конструкции enum и struct, объявление файловой переменной FILE *.

2.4. Изучить функции для работы с бинарными и текстовыми файлами: fopen, fclose, fwrite, fread, ferror, eof, fgets, fputs.

2.5. Изучить пример выполнения задания.

2.6. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям п. 2.7, используя метод пошаговой детализации.

2.7. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Необходимо решить задачу, предполагая, что исходная информация может храниться и в бинарном, и в текстовом файле. Организовать информацию для хранения в бинарном файле в виде структуры, одно из полей которой сделать перечисляемого типа. Алгоритм решения задачи разбить на функциональные блоки, оформить блоки в виде функций. Выделить функции, одинаковые по смыслу, но различные по реализации, в зависимости от типа входных данных, и создать перегружаемые функции.

2.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: