- •Лабораторные работы по курсу
- •Лабораторная работа №1. Начало работы со средой программирования Microsoft Visual Studio 2005. Простейшие программы
- •Цели и постановка задачи
- •1.2 Начальные сведения о работе с Microsoft Visual Studio 2005.
- •1.3 Требования к коду программы
- •Варианты задания для пунктов 1 и 2.
- •Лабораторная работа №2. Битовые операции в языке с.
- •2.1 Цели и постановка задачи
- •2.2 Требования к коду программы
- •3.3 Варианты задания
- •Лабораторная работа №3. Работа с массивами, динамической памятью и файловый ввод-вывод.
- •4.1 Цели и постановка задачи
- •3.2 Требования к коду программы
- •3.3 Варианты задания
- •4.3 Задание
- •4.4 Варианты задания
- •5.3 Варианты заданий
- •Лабораторная работа №6. Основы объектно-ориентированного программирования.
- •6.1 Цели и постановка задачи
- •6.2. Требования к коду программы
- •6.3. Некоторые основные понятия объектно-ориентированного программирования
- •6.4 Варианты задания
- •Лабораторная работа №7. Интерфейс командной строки
- •Варианты задания
- •Лабораторная работа №8. Знакомство с программированием графического интерфейса пользователя.
- •8.1 Цели и постановка задачи
- •8.3 Требования к исходному коду
3.3 Варианты задания
-
Перевернуть битовое представление числа – первый бит сделать последним, второй – предпоследним и т.д.
-
Поменять местами старший и младший байт в целом числе.
-
Поменять местами тетрады в байте – старшую с младшей.
-
Поменять тетрады в двухбайтном целом числе – 1-ю с 4-ой, а 2-ю и 3-ю не трогать.
-
Поменять тетрады в двухбайтном целом числе – 2-ю с 3-ей, а 1-ю и 4-ю не трогать.
-
Поменять тетрады в двухбайтном целом числе – 1-ю с 3-ей, а 2-ю и 4-ю не трогать.
-
Поменять тетрады в двухбайтном целом числе – 2-ю с 4-ой, а 1-ю и 3-ю не трогать.
-
В целом двухбайтном числе заменить младший байт на перевёрнутый старший.
-
В целом двухбайтном числе заменить старший байт на перевёрнутый младший.
-
Посчитать количество единиц в двоичной записи числа.
-
Посчитать количество нулей в двоичной записи числа.
-
Из двухбайтного целого числа получить два – в младшем байте первого собрать все нечётные биты исходного числа, а в младшем байте второго – чётные. Старшие байты чисел-результатов должны содержать нули.
-
Из двух целых чисел a и b собрать одно, состоящее из чётных битов a и нечётных битов b.
-
Из двух целых чисел a и b собрать одно, где 1-ая и 3-я тетрады из a, а 2-ая и 4-ая – из b.
-
Дано два целых числа a и b. В a занулить те нечётные биты, которые в b равны 1. Чётные биты a не трогать.
-
Дано два целых числа a и b. В a установить в 1 те чётные биты, которые в b равны 0. Нечётные биты a не трогать.
-
Дано два целых числа a и b. Получить из них два целых числа следующим образом – первое состоит из старших байтов a и b, второе – из младших.
Лабораторная работа №3. Работа с массивами, динамической памятью и файловый ввод-вывод.
4.1 Цели и постановка задачи
Цель: Научится работать с файлами для чтения и записи из них числовых данных в текстовом формате, а так же изучить обращение с таким типом данных как массивы.
Задание:
-
Написать функцию, реализующую указанный вариант обработки данных, аргументами которой являются необходимые матрицы (двумерные массивы) и вектора (одномерные массивы). Также аргументами функции должны быть размерности используемых массивов.
-
Написать программу, которая использует функцию из пункта 1 для обработки матриц и векторов, значения которых загружаются из файлов. После загрузки из файлов начальных данных программа выводит их на экран, потом производит обработку, записывает получившиеся результаты в файлы, и выводит результаты на экран.
3.2 Требования к коду программы
При выполнении данного задания, а так же последующих необходимо выполнять ряд требований, которые помогают программисту допускать меньшее число ошибок:
-
Избегайте использования глобальных переменных. Это приводит к частым ошибкам, связанных с использованием одного и того же ресурса для разных целей, “утечкам памяти” и непредсказуемому поведению программы при выходе за границы выделенной памяти. Самой распространенной ошибкой является использование одной и той же глобальной переменной в разных функциях. Одна функция изменила для себя ее значение, а вторая, к которой вернулась программа, нужное ей значение этой переменной утратило, так как его затерла предыдущая функция. Другим часто встречающимся подводным камнем являются массивы. Если их объявлять глобальными, то обращаться можно к любому их элементу из любого места программы, притом, что выход за границы массива не приводит к ошибке исполнения, ошибка в вычислениях будет неявной и ее будет трудно найти.
-
При описании переменных или массивов, инициализируйте их (придавайте начальное значение, особенно если оно известно). Например:
int i = 0, j = 10;
double d=1,0;
for ( ; i < j; i++)
d = i / d; // не всегда может возникнуть деление на ноль если забыть инициализацию
-
Для динамического выделения памяти следует помнить, что в данном случае приходится обращаться к этой памяти через указатель на массив, причем на одномерный массив, даже если вы выделяете память под многомерный. Если вы хотите работать с матрицей (двумерным массивом) в динамической памяти так же, как вы работаете с двумерными массивами в статической памяти, можно использовать, например, следующий способ: создать указатель на массив указателей на массивы, где каждый элемент – это указатель на соответствующую строку матрицы, а потом выделить память для каждой строки этой матрицы:
double **mat = 0; // описана матрица, но память для неё пока не выделена
// будем выделять память под матрицу размером N на M:
mat = (double **)malloc(N * sizeof(double *)); // выделили массив указателей на N строк
for (int i = 0; i < N; i++) // проходим все строки
mat[i]=(double *)malloc(M*sizeof(double)); //выделяя под каждую M столбцов
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
mat[i][j] = 0; // очищаем каждый элемент матрицы
// работаем с матрицей
...
// здесь матрица стала ненужной, можно её удалить
for (int i = 0; i < N; i++) // проходим все строки, удаляя каждую
free(mat[i]);
free(mat); // удаляем массив указателей на строки
После того как матрица становится ненужной, ее следует удалить из памяти, чтобы она не занимала место, в противном случае возможны утечки памяти в программе – самой неуловимой ее ошибки. В примере выше показано, как это делать. Обратите внимание, что порядок высвобождения памяти обратный порядку ее выделения.
-
Если вы решили использовать один и тот же файл и для чтения, и для записи, следует помнить, что функция fopen при этом требует использования специальных форматов, например "r+", "w+". В программе необходимо учитывать возможность того, что функция открытия файла завершит работу неуспешно, и при необходимости надо отображать сообщение об этой ошибке и прекращать выполнение программы.