Uploaded by java_k

Вариант №13

advertisement
Негосударственное частное образовательное учреждение
высшего образования
«Технический университет УГМК»
КОНТРОЛЬНАЯ РАБОТА ПО ДИСЦИПЛИНЕ
«Программирование и алгоритмизация»
Направление подготовки
Профиль подготовки
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

xa

F ( x)  2b 
, при a>0 и x>0
xc

 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
Download