Негосударственное частное образовательное учреждение высшего образования «Технический университет УГМК» КОНТРОЛЬНАЯ РАБОТА ПО ДИСЦИПЛИНЕ «Программирование и алгоритмизация» Направление подготовки Профиль подготовки 15.03.04 Автоматизация технологических процессов и производств Автоматизация технологических процессов и производств Уровень высшего образования бакалавриат (бакалавриат, специалитет, магистратура) Студент: (ФИО) Группа: Преподаватель: (ФИО) г.Верхняя Пышма 2019 г. Вариант 13 Задание 1. Теоретические основы программирования Переведите из одной системы счисления в другую: 2->8: 10010011011; Разделим исходный код на группы по 4 разряда. 100100110112 = 0100 1001 1011 2 Затем заменяем каждую группу на код из таблицы. Двоичная СС Шестнадцатеричная СС 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F Получаем число: 0100 1001 1011 2 = 49B16 16->8: FA80; Заменяем каждый разряд на код из таблицы. Двоичная СС Шестнадцатеричная СС 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 2 1111 F Получаем число: FA8016 = 11111010100000002 Полученное число переведем в 8-у систему счисления. Разделим исходный код на группы по 3 разряда. 11111010100000002 = 001 111 101 010 000 000 2 Затем заменяем каждую группу на код из таблицы. Двоичная СС Восьмеричная СС 000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7 Получаем число: 001 111 101 010 000 000 2 = 1752008 10->16: 639 Перевод целых десятичных чисел в любую другую системы счисления осуществляется делением числа на основание новой системы счисления (в нашем случае это 16) до тех пор, пока в остатке не останется число меньшее основания новой системы счисления. Новое число записывается в виде остатков деления, начиная с последнего. Целая часть от деления Остаток от деления 639 div 16 = 39 639 mod 16 = 15 39 div 16 = 2 39 mod 16 = 7 2 div 16 = 0 2 mod 16 = 2 0 div 16 = 0 0 mod 16 = 0 Остаток от деления записываем в обратном порядке. Получаем число в 16-ой системе счисления: 027F 639 = 027F16 Стек некоторой программы начинается с ячейки с адресом 78F8:9DE0 и заканчивается ячейкой A837:A04F. Определите размер стека. Физический адрес начала области 0х78F80 + 0х9DE0 = 0х82D60, конца области 0хA8370 + 0хA04F = 0хB23BF. Размер этой области равен 0хB23BF - 0х82D60 + 1 = 0x2F660 2F660 = 194144/16 = 12134 word 3 Дискета 3,5'', имеющая емкость 1,44М, разбита на кластеры, имеющие размер 512b. Кластеры пронумерованы, начиная с номера 2. Сколько всего имеется кластеров и сколько байт необходимо отвести для хранения одного номера? Объем дискеты 1474560 байт. 1474560 делим на 512, получаем 2880. Сектора 0 и 1 резервировались под загрузчик ОС. Сектора со 2-го по 33 под FAT16. В системе FAT16 под номер кластера отводится 16 бит. Вычислите сумму 30 + (-100) так, как это происходит в машине. Переведите результат в 10-ую систему счисления. Представим числа 3010 и -10010 в обратном коде. Представим число 30 в двоичном коде. 30 = 111102 Обратный код для положительного числа совпадает с прямым кодом. Для отрицательного числа все цифры числа заменяются на противоположные (1 на 0, 0 на 1), а в знаковый разряд заносится единица. Двоичное число 0011110 имеет обратный код 0,0011110 Представим число -100 в двоичном коде. 100 = 11001002 Двоичное число 1100100 имеет обратный код 1,0011011 Сложим числа 00011110 и 10011011 В 1-ом разряде возникло переполнение (1 + 1 = 10). Поэтому записываем 0, а 1 переносим на 2-й разряд. 7 6 5 4 3 2 1 0 1 0 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 В 2-ом разряде возникло переполнение (1 + 1 = 10). Поэтому записываем 0, а 1 переносим на 3-й разряд. 7 6 5 4 3 2 1 0 1 1 0 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 В 3-ом разряде возникло переполнение (1 + 1 + 1 = 11). Поэтому записываем 1, а 1 переносим на 4-й разряд. 7 6 5 4 3 2 1 0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 В 4-ом разряде возникло переполнение (1 + 1 + 1 = 11). Поэтому записываем 1, а 1 переносим на 5-й разряд. 7 6 5 4 3 2 1 0 1 1 1 1 4 0 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 В итоге получаем: 7 6 5 1 0 0 0 1 0 0 1 0 1 4 1 1 1 1 3 1 1 1 1 2 1 1 0 0 1 0 1 0 1 1 0 1 Результат сложения: 10111001 В старшем бите 1. Следовательно, в результате сложения получили отрицательное число. Переведем его обратно в прямой код. Для этого найдем обратный код (инвертируем все биты, кроме знакового): 1000110 Получили число 1000110. В десятичном представлении это число имеет вид: Для перевода необходимо умножить разряд числа на соответствующую ему степень разряда. 1000110 = 26*1 + 25*0 + 24*0 + 23*0 + 22*1 + 21*1 + 20*0 = 64 + 0 + 0 + 0 + 4 + 2 + 0 = 70 Результат сложения (в десятичном представлении): -70 Гипотетический вещественный тип doom занимает 6 байт, порядок занимает 14 бит. Определите диапазон для этого типа. Найдите машинный ноль и машинный епсилон. Порядок со знаком занимает 14 бит, поэтому минимальное двоичное значение порядка равно -213. Для перевода этого числа к десятичному основанию решим показательное уравнение -213 = -10х. Логарифмируя по основанию 10, получаем х = 13*lg2 » 13×0,3010 = 3,913. Таким образом, m0 равен 13 3,913 0,12 ∗ 2−2 = 0,12 ∗ 2−10 ≫ 0,5 ∗ 102463,82 ≫ 3,3 ∗ 102463 Мантисса в двоичной системе счисления занимает 34 бит, из которых один бит определяет знак мантиссы. Первые знаки двоичной мантиссы равны 0,12 и всегда одинаковы. Поэтому память под 0,1 не отводится. Остальные 33 бит мантиссы занимают разряды с номерами от -2 до -34. “Правый сосед” единицы равен 0,100…0012*21, где последняя единица стоит в -34-м разряде. Тогда me = 2-34 = 10-34*lg(2) = 10-10,235 = 1,718*10-10. Таким образом, у типа doom размер мантиссы в десятичных знаках 10-11, диапазон типа в положительной части от 3,3*10-2463 до 3,3*102463. me = 2-11, m0 = 3,3*10-2463 Выпишите Ascii-коды, соответствующие следующей фразе: BCD20 ¼╥ - это Ascii-коды соответствующие BC16(18810) и D216(21010) Составьте схему алгоритма. Найти скалярное произведение двух векторов. Исходные данные: два одномерных массива размерностью n чисел Вычисляемые данные: сумма попарных произведений элементов массива. Формулы метода: для векторов 𝑎⃗ и 𝑏⃗⃗ размерности n вычисляется сумма ∑𝑛𝑖=1 𝑎𝑖 𝑏𝑖 блок-схема алгоритма 5 Начало ввод размерности векторов и самих векторов a, b S=0 i=1..n S=S+ai*bi Вывод S Задание 2. Циклы Вычислить и вывести на экран в виде таблицы значения функции F на интервале от xнач. до xкон. с шагом dx. Вывести также таблицу в файл с помощью перенаправления потока из командной строки C:\>my.exe > table.txt Нарисуйте график табулированной функции средствами Excel или MatLab. Функция F принимает действительное значение, заданное формулой, если выражение V не равно нулю, и значение, округленное до целого, в противном случае. В выражении V используются логические операции &&, || и побитовые операции &, |. Через [a] обозначена целая часть числа a. Значения a,b,c, xнач., xкон., dx вводятся с клавиатуры. a xb, при c 0 и x 0 xa F ( x) 2b , при a>0 и x>0 xc ax 2 2 , в остальных случаях b c-x V = ([a] | [b]) ^ ([b] & [c]). #define _CRT_SECURE_NO_WARNINGS #include "stdafx.h" #include<iostream> #include <fstream> #include <math.h> using namespace std; int main(int argc, char *argv[]) { 6 setlocale(LC_ALL, "Russian"); FILE *F; if (argv[1] == NULL) //если аргумент в командной строке отсутствует, то пишем в файл 1.txt { cout << "Запись в файл 1.txt" << endl; fopen_s(&F,"1.txt","wt"); } else //иначе в указанный в аргументе файл { cout << "Запись в файл "<< argv[1] << endl; fopen_s(&F,argv[1],"wt"); } float a, b, c; float x0, xk, dx; //для ввода с клавиатуры расскоментировать нижеследующие строки и закоментировать шесть следующих /* cout << "Введите a = "; cin >> a; cout << "Введите b = "; cin >> b; cout << "Введите c = "; cin >> c; cout << "Введите начальное значение х0 = "; cin >> x0; cout << "Введите конечное значение хk = "; cin >> xk; cout << "Введите шаг dx = "; cin >> dx; */ a = 1; b = 4; c = 5; x0 = -10; xk = 10; dx = 0.5; float fractpart, intpart; fractpart = modf(a, &intpart); //по указателю fractpart находится целая часть unsigned inta = abs(intpart); //извлекаем ее и приводим к типу unsigned, поскольку с ним побитовые операции работают корректно fractpart = modf(b, &intpart);//и т.д. unsigned intb = abs(intpart); fractpart = modf(c, &intpart); unsigned intc = abs(intpart); //выводим для контроля cout << "a = "<<inta<<" b = "<<intb<<" c = "<<intc<<endl; int v = 0; if (((inta | intb) ^ (intb&intc)) != 0) //проверяем условие { v = 1; } //выводим для контроля cout << "v = " << v << endl; float x = x0; float y; //цикл по интервалу while (x <= xk) { if ((c < 0) && (x != 0)) //если да, то первая формула { y = a*x + b; 7 if (v = 0) //если да, то целые значения { printf("x = %10.3f y= %d\n", x, y); fprintf(F, "x = %10.3f y= %d\n", x, y); } else //иначе вещественные значения { printf("x = %10.3f y= %10.3f\n", x, y); fprintf(F, "x = %10.3f y= %10.3f\n", x, y); } } else if ((a > 0) && (x > 0)) //если да, то вторая формула { if ((x - c) != 0) //знаменатель не ноль { y = 2*b+(x-a)/(x - c); if (v = 0) { printf("x = %10.3f y= %d\n", x, y); fprintf(F, "x = %10.3f y= %d\n", x, y); } else { printf("x = %10.3f y= %10.3f\n", x, y); fprintf(F, "x = %10.3f y= %10.3f\n", x, y); } } else { printf("x = %10.3f Функция не определена\n", x); fprintf(F, "x = %10.3f Функция не определена\n", x); } } else { if ((c - x) != 0 ) //знаменатель не ноль { y = b*(a*x*x +2) / (c - x); if (v = 0) { printf("x = %10.3f y= %d\n", x, y); fprintf(F, "x = %10.3f y= %d\n", x, y); } else { printf("x = %10.3f y= %10.3f\n", x, y); fprintf(F, "x = %10.3f y= %10.3f\n", x, y); } } else { printf("x = %10.3f", x, " Функция не определена\n"); fprintf(F, "x = %10.3f", x, " Функция не определена\n"); } } x = x + dx; //шаг по интервалу } cin.get(); fclose(F); return 0; } 8 9 10 30 25 20 15 10 5 0 -15 -10 -5 0 5 10 15 Рис.1 График функции при a=1, b=4, c=5 Задание 3. Одномерные массивы Задания реализовать в виде отдельных функций. Провести тестирование этих функций В одномерном массиве, состоящем из n вещественных элементов, вычислить: количество элементов массива, лежащих в диапазоне от А до В; сумму модулей элементов массива, расположенных после максимального элемента. Упорядочить элементы массива по убыванию модулей элементов. #include #include #include #include #include #include "stdafx.h" <iostream> <ctime> <math.h> <random> <chrono> using namespace std; //using namespace std::chrono; void create_mas(double* num,int n)//сортировка пузырьком { 11 std::default_random_engine rnd(std::chrono::system_clock::now().time_since_epoch().count()); std::uniform_real_distribution<double> distribution(-25.0, 25.0); cout << "Исходный массив\n"; for (int i = 0; i < n; i++) { num[i] = distribution(rnd); printf("%7.2f", num[i]); } cout << endl; } void print_mas(double* num, int n)//вывод массива { for (int i = 0; i < n; i++) { printf("%7.2f", num[i]); } cout << endl; } void interval(double* num, int n,int a, int b)//попадание в интервал { int s = 0; for (int i = 0; i < n; ++i) //подсчитаем число элементов попавших в интервал { if ((num[i] < b) && (num[i] > a)) { s++; } } printf("Число элементов массива в интервале от a = %6.2f до b = %6.2f равно %d\n", a, b, s); cout << endl; } void sum_after(double* num, int n) { double max_el = num[0]; int num_max_el = 0; for (int i = 1; i < n; ++i) //ищем максимальный элемент массива { if (num[i] > max_el) { max_el = num[i]; num_max_el = i; } } double s = 0; for (int i = num_max_el; i < n; ++i) //считаем сумма модулей элементов массива после максимального { s = s + abs(num[i]); } printf("Сумма модулей элементов массива после максимального S = %6.2f\n", s); } void sort_up(double* num,int n)//сортировка пузырьком { int i, j; double d; 12 for (i = 0; i < n; ++i) { for (j = 0; j<n - i - 1; ++j)//n-i+1 { if (abs(num[j]) < abs(num[j + 1])) { d = num[j]; num[j] = num[j + 1]; num[j + 1] = d; } } } } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "Russian"); system("cls"); double a = 0.; double b = 15.; int n = 10; // число элементов массива double *mas_X = new double[n]; //инициализация массивов create_mas(mas_X,n); cout << endl; interval(mas_X, n, a, b); cout << endl; sum_after(mas_X, n); cout << endl; sort_up(mas_X, n); cout << "Упорядоченный по убыванию модулей массив" << "\n"; print_mas(mas_X, n); cout << endl; cout << endl; system("pause"); return 0; } Задание 4. Двумерные массивы Задания реализовать в виде отдельных функций. Провести тестирование этих функций. Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в зависимости от введенного режима). n может быть больше количества элементов в строке или столбце. 13 #include #include #include #include #include "stdafx.h" <iostream> <cmath> <random> <chrono> using namespace std; void create_mas(int **num, int n, int m)//заполнение массива { std::default_random_engine rnd(std::chrono::system_clock::now().time_since_epoch().count()); std::uniform_int_distribution<int> distribution(0, 25); cout << "исходный массив\n"; for (int i = 0; i < n; i++) //заполняем массив случайными числами { for (int j = 0; j < m; j++) { num[i][j] = (int) distribution(rnd); printf("%5d", num[i][j]); } cout << endl; } cout << endl; } //печать массива void print_mas(int **num, int n, int m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { printf("%5d", num[i][j]); } cout << endl; } cout << endl; } //сдвиг элементов массива 1 - вниз, 2 - вправо void shift_to(int **num, int n, int m, int q, int l) { int nmin=0,buf_a; for (int k = 0; k < l; k++) { if (q == 1) { for (int i = n - 1; i > 0; i--) { nmin = i - 1; for (int j = 0; j < m; j++) { buf_a = num[i][j]; num[i][j] = num[nmin][j]; num[nmin][j] = buf_a; } } } if (q == 2) { 14 for (int j = m - 1; j > 0; j--) { nmin = j - 1; for (int i = 0; i < n; i++) { buf_a = num[i][j]; num[i][j] = num[i][nmin]; num[i][nmin] = buf_a; } } } } } int main() { setlocale(LC_ALL, "Russian"); int n = 4; // число строк массива int m = 5; // число столбцов массива int **mas_X = new int*[n]; //инициализаци¤ массива for (int i = 0; i < n; i++) { mas_X[i] = new int[m]; // инициализация указателей } //заполнение массива случайными числами create_mas(mas_X, n, m); int q = 0; cout << "Введите 1 для сдвига вниз или 2 для сдвига вправо q = "; cin >> q; int l = 0; cout << "Введите число циклов сдвига l = "; cin >> l; cout << endl; int nmin = 0; int buf_a; if (q == 0) { cout << "Вы не ввели направление сдвига!"; } else { //сдвиг массива shift_to(mas_X, n, m, q, l); cout << endl<<"Измененный массив" << endl; //печать массива print_mas(mas_X, n, m); } system("pause"); return 0; } 15 Задание 5. Организация ввода-вывода С клавиатуры вводится текстовая строка на английском языке. Выведите ее на экран так, чтобы все слова начинались с большой буквы. #include "stdafx.h" #include <iostream> #include <cstring> using namespace std; int main() { setlocale(LC_ALL, "Russian"); cout << "Enter the string: "; char in_string[500]; // строковый массив для ввода gets_s(in_string); // функция gets() считывает все введённые символы с пробелами до тех пор, пока не будет нажата клавиша Enter cout << endl; cout << endl; bool flag = false; for (int i = 0; i < strlen(in_string); i++) //по всем символам строки { 16 if ((in_string[i] == ' ') && (flag == false)) //если пробел и flag не поднят, т.е. первый пробел { printf("%c", in_string[i]); //печатаем его и поднимаем flag flag = true; } else if ((in_string[i] != ' ') && ((flag == true)|| (i == 0))) //если не пробел и flag поднят, т.е. первый символ после пробела или это первый символ в строке { printf("%c", toupper(in_string[i])); //переводим в верхний регистр, печатаем его и опускаем flag flag = false; } else //в других случаях просто печатаем символ { printf("%c", in_string[i]); } } cout << endl; cin.get(); return 0; } Задание 6. Построение схем алгоритмов Постройте схемы алгоритмов для указанных задач. Используйте стандартные блоки, комментарии, символы внутристраничных и межстраничных переносов. Дан многочлен f ( x) a n x n ... a 0 . Найти значение производной f´(x) в данной точке. 17 Начало ввод степени многочлена ввод коэффициентов многочлена формирование массива коэффициентов - mas точка, в которой ищем значение производной ввод x y=mngchl(x) y’=proizv(x) вывод y, y’ Конец 18 Начало Функция mngchl(x), возвращающая значение многочлена в точке х result=0 i=0..n result=result*x+mas[i] Конец Начало Функция proizv(x), возвращающая значение производной многочлена в точке х result=0 i=0..n-1 result=result*x+mas[i+1]*(i+1) Конец 19