Главная страница
Навигация по странице:

  • Постановка задачи Этапы анализа предметной области

  • Описание объектов и связей между ними

  • Описание задач, которые будут решаться

  • Исходные данные (область определения)

  • Выходная область Строка чисел в десятичной системе счисления Тестовые данные

  • Описание структур данных

  • Блок-схемы алгоритмов

  • Описание функций

  • Оценка сцепления и связности модулей Оценка сцепления

  • Оценка связности Последовательная

  • Листинг программы с комментариями

  • РГЗ по информатике. RGZ_ОТЧЕТ. Новосибирский Государственный Технический Университет


    Скачать 109.46 Kb.
    НазваниеНовосибирский Государственный Технический Университет
    АнкорРГЗ по информатике
    Дата29.04.2022
    Размер109.46 Kb.
    Формат файлаdocx
    Имя файлаRGZ_ОТЧЕТ.docx
    ТипОтчет
    #504926

    Новосибирский Государственный Технический Университет


    Кафедра АСУ
    Отчёт по расчётно-графическому заданию

    по дисциплине «Информатика»

    Факультет: АВТФ

    Преподаватель:

    Лауферман О. В.

    Группа: АВТ-114

    Выполнил:

    Измайлов Александр Олегович

    2021 год

    Задание.

    Напечатайте k-тую степень основания n в десятичной системе счисления, например, k = 50, n = 2, результат 2 50 = 1125899906842624 (значение хранится в символьном массиве - строке)
    Постановка задачи

    Этапы анализа предметной области

    Результаты

    Терминология,

    используемая

    в условии

    задачи

    В программировании строковый тип (англ. string «нить, вереница») — тип данных, значениями которого является произвольная последовательность (строка) символов алфавита. Каждая переменная такого типа (строковая переменная) может быть представлена фиксированным количеством байтов либо иметь произвольную длину.
    Возведение в степень — арифметическая операция, первоначально определяемая как результат многократного умножения числа на себя.
    Система счисления — символический метод записи чисел, представление чисел с помощью письменных знаков. Система счисления: даёт представления множества чисел; даёт каждому числу уникальное представление; отражает алгебраическую и арифметическую структуру чисел.
    Десятичная система счисления — позиционная целочисленная система счисления с основанием 10. Для представления чисел в ней используются цифры от 0 до 9.

    Описание объектов и связей между ними

    Натуральные числа от 0 до 9, в десятичной системе счисления, хранятся в виде пользовательских структур данных, представляющих символьный массив.

    Описание задач, которые будут решаться

    Реализация возведения в степень числа в виде строки без перевода в целочисленный тип данных.

    Исходные данные

    (область определения)

    Два числа в десятичной системе счисления.

    Краткое

    описание

    решения

    Умножаем первое число само на себя до второго введённого числа. Рассматриваем возможные исключения (Степени 0, 1, -1; отрицательное число, возводимое в степень).

    Выходная область

    Строка чисел в десятичной системе счисления

    Тестовые данные

    Модуль проверки ввода

    Ввод

    Вывод результата проверки

    123

    True(нету ошибок)

    0123

    Первый символ 0(false)

    123as13

    Вы ввели что-то кроме цифр(false)

    --123

    Вы ввели что-то кроме цифр(false)

    -462327

    True(нету ошибок)

    Модуль умножения числа в степень

    Число и степень

    Итоговое число

    2^50

    1125899906842624

    123456789^3

    1881676371789154860897069

    -12345^3

    -1881365963625

    -12345^2

    152399025

    652123^0

    1

    73214^1

    73214

    7^-1

    1/7

    Схема иерархии программных модулей - структура программы



    Описание структур данных



    Имя

    Тип

    Назначение

    1

    base

    Символьный массив

    Содержит в себе изначальное число

    2

    Result_num

    Символьный массив

    Новый/конечный результат

    3

    temp_result

    Символьный массив

    Временно запоминает предыдущий результат

    Блок-схемы алгоритмов



    Описание функций

    Функция

    Ее назначение

    Параметры

    exceptions

    Обработка исключений

    char base[](основа которую умножают в степень), int degree(степень)

    checking_on_negative_number

    Проверка на отрицательность числа

    char number[](Число)

    checking_input_on_only_numbers

    Проверка на ввод только чисел

    char input[](ввод)

    sdvig

    Сдвиг массива вправо

    char result_num[](конечный результат),

    int length_result(итоговая длина)

    proverka

    Проверка на выход из массива, если нулевой элемент>9

    int &length_result, int &temp_index(временный индекс), char result_num[], int num(отступ)

    increasing_array

    Увеличивает массив, если будет выход из массива

    int result_index(конечный индекс), int& length

    _result, char result_num[]

    Pow_string_num

    Возведение числа в степень

    char base[], int degree

    Оценка сцепления и связности модулей

    Оценка сцепления

    Сцепление по данным: 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);

    }

    Анализ результатов проектирования, кодирования, отладки и тестирования.


    Были допущены ошибки при работе с вводом данных, при работе с вычислениями.

    Список литературы




    1. Язык программирования C++ (стандарт С++11). Краткий курс / Бьёрн Страуструп. Пер. с англ. – М.: Издательский дом Бином, 2017 г.- 176 с.: ил.

    2. Лауферман О. В. Информатика (2016) [Электронный ресурс]. - Новосибирск: НГТУ, cop. 2003-2016. - Режим доступа: http://dispace.edu.nstu.ru/didesk/course/show/5867 - свободный. – Загл. с экрана.

    3. Информатика: учебное пособие / Н. И. Лыгина, О. В. Лауферман. - Новосибирск : Изд-во НГТУ, 2017. – 79

    4. Системы счисления и их применение / С. Б. Гашков : 2-е изд., испр. и доп. — М. : изд-во МЦНМО, 2012.— 68 с. : ил

    5. Bjarne, Stroustrup Programming: Principles and Practice Using C++ / Stroustrup Bjarne. — 2nd Edition. — : Addison-Wesley Professional, 2014. — 1312 c. — Текст : непосредственный.

    6. Стенли, Б. Л. Язык программирования C++. Базовый курс / Б. Л. Стенли, Лажойе Жози, Э. М. Барбара. — 5-е издание. — : , 2017. — 1120 c. — Загл. с экрана.

    7. Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес. — : Addison-Wesley Professional, . — c. — Загл. с экрана.

    8. Ричард, Бёрд Жемчужины проектирования алгоритмов / Бёрд Ричард. — 1-е изд. — : DMK, 2015. — c. — свободный.


    написать администратору сайта