РГЗ по информатике. RGZ_ОТЧЕТ. Новосибирский Государственный Технический Университет
Скачать 109.46 Kb.
|
Новосибирский Государственный Технический Университет Кафедра АСУ Отчёт по расчётно-графическому заданию по дисциплине «Информатика» Факультет: АВТФ Преподаватель: Лауферман О. В. Группа: АВТ-114 Выполнил: Измайлов Александр Олегович 2021 год Задание. Напечатайте k-тую степень основания n в десятичной системе счисления, например, k = 50, n = 2, результат 2 50 = 1125899906842624 (значение хранится в символьном массиве - строке) Постановка задачи
Тестовые данные Модуль проверки ввода
Модуль умножения числа в степень
Схема иерархии программных модулей - структура программы Описание структур данных
Блок-схемы алгоритмов Описание функций
Оценка сцепления и связности модулей Оценка сцепления Сцепление по данным: main<=>checking_input_on_only_numbers, main<=>Pow_string_num, Pow_string_num<=> Exceptions Сцепление по образцу: Pow_string_num<=> checking_on_negative_number, Pow_string_num<=> proverka, Pow_string_num<=> increasing_array Оценка связности Последовательная связность: Main, checking_on_negative_number Функциональная связность: Sdvig, Exceptions, checking_input_on_only_numbers Коммуникативная связность: Pow_string_num, increasing_array, proverka Листинг программы с комментариями #include #define strinlen 8000 bool exceptions(char base[], int degree)//поиск исключений { if (degree == 0) { printf("1"); return true; } if (degree == 1) { puts(base); return true; } if (degree == -1) { printf("1/"); puts(base); return true; } return false; } bool checking_on_negative_number(char base[])//проверка на отрицательность числа { int length = strlen(base); if ((base[0]) == '-')//если первый символ это минус, то сдвиг массива влево на 1 ячейку { base[0] = NULL; for (int h = 0; h < length; h++) base[h] = base[h + 1]; return true; } return false; } bool checking_input_on_only_numbers(char input[]) { bool checks = false; char numbers[] = "0123456789"; int length = strlen(input); for (int i = 0; i < length; i++) { if ((input[i] == '-') && (i == 0))//пропуск знака минуса continue; if (input[i] == NULL) break; checks = false; for (int j = 0; j < 10; j++) { if (input[i] == numbers[j])//проверка на соответствие цифрам { checks = true; break; } } if (checks == false) return false; } return true; } void sdvig(char result_num[], int length_result) { for (int h = length_result - 1; h >= 0; h--)//сдвиг массива вправо на 1 ячейку result_num[h + 1] = result_num[h]; } void proverka(int& length_result, int& temp_index, char result_num[], int num) { if ((((length_result - 1) - temp_index - num) <= 0) && (result_num[(length_result - 1) - temp_index - num] > 9))//предотвращение выхода из массива { result_num[length_result] = 0; sdvig(result_num, length_result); length_result++; result_num[length_result] = NULL; result_num[0] = 0; result_num[(length_result - 1) - temp_index - num] %= 10;//Взять остаток от 10 у индекса перед выходом из массива temp_index++; result_num[(length_result - 1) - temp_index - num]++;//прибавить к следующему индексу 1 } } void increasing_array(int result_index, int& length_result, char result_num[]) { if ((result_index + 1) > length_result) // увеличивание финальной длины { result_num[length_result] = 0; sdvig(result_num, length_result); length_result++; result_num[length_result] = NULL; result_num[0] = 0; } } void Pow_string_num(char base[], int degree) { if (exceptions(base, degree)) return; char result_num[strinlen], temp_result[strinlen];//временный/ финальный результат result_num[0] = NULL; temp_result[0] = NULL; bool minus = false; minus = checking_on_negative_number(base); if (degree % 2 == 0)//если степень четная, то число положительное minus = false; bool negative_degree = false; if (degree < 0)//работа с отрицательной степенью { degree *= -1; negative_degree = true; } int length = strlen(base);//длина основания strcat_s(temp_result, base); int length_result = strlen(temp_result);//финальная длина int temp_length = length_result;//временная длина for (int deegr = 2; deegr <= degree; deegr++)//умножение в n-ую степень { for (int h = 0; h < length_result; h++)//зануление массива result_num[h] = 0; for (int i = 0; i < length; i++) { for (int j = 0; j < temp_length; j++) { int digit = (base[length - i - 1] - '0') * (temp_result[temp_length - j - 1] - '0');//умножение индекса основания(i) на индекс временного результат(j) int result_index = i + j;//индекс сдвига по массиву if (digit == 0) { increasing_array(result_index, length_result, result_num); result_index++; } while (digit > 0)//пока полученное число больше 0, перенос чисел в следующие ячейки массива { increasing_array(result_index, length_result, result_num); result_num[(length_result - 1) - result_index] += digit % 10; int temp_index = result_index; proverka(length_result, temp_index, result_num, 0); if (result_num[(length_result - 1) - result_index] > 9) { result_num[(length_result - 1) - result_index] = result_num[(length_result - 1) - result_index] % 10; result_num[(length_result - 1) - result_index - 1]++; while ((result_num[(length_result - 1) - temp_index - 1] > 9) && ((length_result - 1) - temp_index - 1) > 0) { result_num[(length_result - 1) - temp_index - 1] %= 10; temp_index++; result_num[(length_result - 1) - temp_index - 1]++; } int temp_index = result_index; proverka(length_result, temp_index, result_num, 1); } digit /= 10; result_index++; } } } temp_length = length_result; for (int i = 0; i < length_result; i++) result_num[i] += '0';//перевод ячеек массива из числа в строку for (int g = 0; g < temp_length; g++) temp_result[g] = result_num[g]; temp_result[temp_length] = NULL; } if (negative_degree == true)//если отрицательная степень printf("1/"); if (minus == true)//если число отрицательное printf("-"); result_num[length_result] = NULL; puts(result_num); } bool input(char input[]) { fgets(input, 7999, stdin);//ввод основания if (input[0] == '0') { printf("Первый символ 0"); return false; } for (int i = 0; i < strinlen; i++) { if (input[i] == '\n') { input[i] = NULL; break; } } if (checking_input_on_only_numbers(input) == false) { printf("Вы ввели что-то кроме цифр"); return false; } return true; } int main() { setlocale(LC_ALL, ""); char base[strinlen]; char degree[strinlen]; int degree_int; do { printf("\nВведите число которое нужно возвести в степень: "); if (input(base) == true) { break; } } while (true); do { printf("\nВведите степень: "); if (input(degree) == true) { degree_int = atoi(degree); break; } } while (true); printf("\nПолученное число: "); Pow_string_num(base, degree_int); } Анализ результатов проектирования, кодирования, отладки и тестирования.Были допущены ошибки при работе с вводом данных, при работе с вычислениями. Список литературыЯзык программирования C++ (стандарт С++11). Краткий курс / Бьёрн Страуструп. Пер. с англ. – М.: Издательский дом Бином, 2017 г.- 176 с.: ил. Лауферман О. В. Информатика (2016) [Электронный ресурс]. - Новосибирск: НГТУ, cop. 2003-2016. - Режим доступа: http://dispace.edu.nstu.ru/didesk/course/show/5867 - свободный. – Загл. с экрана. Информатика: учебное пособие / Н. И. Лыгина, О. В. Лауферман. - Новосибирск : Изд-во НГТУ, 2017. – 79 Системы счисления и их применение / С. Б. Гашков : 2-е изд., испр. и доп. — М. : изд-во МЦНМО, 2012.— 68 с. : ил Bjarne, Stroustrup Programming: Principles and Practice Using C++ / Stroustrup Bjarne. — 2nd Edition. — : Addison-Wesley Professional, 2014. — 1312 c. — Текст : непосредственный. Стенли, Б. Л. Язык программирования C++. Базовый курс / Б. Л. Стенли, Лажойе Жози, Э. М. Барбара. — 5-е издание. — : , 2017. — 1120 c. — Загл. с экрана. Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. — : Addison-Wesley Professional, . — c. — Загл. с экрана. Ричард, Бёрд Жемчужины проектирования алгоритмов / Бёрд Ричард. — 1-е изд. — : DMK, 2015. — c. — свободный. |