Отчёт_Лебедев_И.И._М3О-111Б-20. Федеральное государственное бюджетное образовательное учреждение высшего образования московский авиационный институт
Скачать 322.26 Kb.
|
М ИНИСТЕРСТВО науки и высшего ОБРАЗОВАНИЯ РОссИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ (национальный исследовательский университет)» Факультет №3 «Системы управления, информатика и электроэнергетика» Кафедра № 304 «Вычислительные машины, системы и сети» Информатика Отчет по практике Задания 10, 25, 38 Выполнил студент группы 3О-111Б Лебедев И.И. Проверила доцент, к.т.н., Дмитриева Е.А. Москва 2021 год. Оглавление Задание 3 Структурная схема алгоритма 5 Текст программы 10 Результаты работы 15 Вывод 19 ЗаданиеРазработать 3 программы на С++, выполняющие 3 задания из имеющегося списка: 1) возможность для каждого задания ввода входных данных из файла (или генератора случайных чисел) и с клавиатуры в интерактивном режиме; 2) возможность для каждого задания вывода результатов в виде таблицы и в графическом виде (или в файл, если графического представления не предусмотрено). Разработать интерфейс, обеспечивающий: 1) возможность выбора одного из заданий в интерактивном режиме; 2) возможность для каждого задания двух вариантов ввода входных данных; 3) возможность для каждого задания двух вариантов вывода результатов. Часть первая. Вычислить сумму ряда с точностью Е=10-4, составить выражение для вычисления промежуточного члена ряда yn=f(yn-1). Условие повторения цикла . Выводить на печать промежуточные значения суммы и yn. Эталонное значение результата приведено в начале задания. Значение аргумента x вводить с клавиатуры, n = 0,1,2,… Задание 10. при х = 0.65 Часть вторая. Обработка матриц. (Порядок матриц вводить с клавиатуры. Элементы матриц формировать с помощью датчика случайных чисел или с клавиатуры.) Задание 25. Сформировать двумерный массив Y(N,2), содержащий в первом столбце случайные значения аргументов на интервале [2,7], а во втором столбце – значения функции . Изобразить значения графически и вывести массив на печать. Часть третья. Обработка текста. Задание 38. Посчитать количество двубуквенных сочетаний, состоящих из гласных. Структурная схема алгоритмаРисунок 1.Структурная схема главной программы. Рисунок 2. Подпрограмма вычисления суммы ряда. Рисунок 3. Структурная схема подпрограммы для вычисления значения функции. Рисунок 4. Структурная схема алгоритма поиска двубуквенных сочетаний гласных Рисунок 5. Структурная схема подпрограммы проверки буквы на то, является ли она гласной Текст программыТекстовый редактор MVS Code. Компилятор GNU G++ (Debian v9.3.0). #if defined(_WIN32) #define _CRT_SECURE_NO_WARNINGS #define CLEAR "cls" #elif defined(_WIN64) #define _CRT_SECURE_NO_WARNINGS #define CLEAR "cls" #elif defined(__unix__) #define CLEAR "clear" #endif #define SIZE 256 #include #include #include #include using namespace std; void FirstTask(); void SecondTask(); bool IsVowelEng(const char& c); bool IsVowelRus(const wchar_t& c); int Random(int min, int max); // Возвращает псевдослучайное число из диапазона [min, max) void ThirdTask(); int main(){ setlocale(LC_ALL, ""); char input = 1; while(input){ system(CLEAR); cout<<"Выберите номер задания\n" <<"1. log(x+1)\n" <<"2. Значения и график функции\n" <<"3. Посчитать количество двубуквенных сочетаний, состоящих из гласных\n\n" <<"0. Выход\n\n" <<"Ввод: "; cin>>input; system(CLEAR); switch(input){ case '0': return 0; case '1': FirstTask(); break; case '2': SecondTask(); break; case '3': ThirdTask(); break; default: cout<<"Ошибка: неверный номер задания\nВыберите из перечня\n\n"; main(); } cin.ignore(); cout< getchar(); } return 0; } void FirstTask(){ cout<<"Выбрано задание №1"< cout<<"log(x+1)\n\n"; bool flag = 0; double x; cout<<"Ввести значение х с клавиатуры или принять за 0.65 [0/1]: "; cin>>flag; if(!flag){ cout<<"Введите х: "; cin>>x; } else { x = 0.65; } double E = pow(10, -6); double y = 1; double sum = 0; int k = 1; cout< cout<<"x\ty"< while(abs(y) >= E){ y = pow(-1, k+1) * pow(x, k)/k; sum += y; cout< ++k; } //cout< cout<<"Сумма ряда: "< cout<<"При точности Е: "< cout<<"\nЗаписаить полученные значения в файл? (Да/Нет) [0/1]: "; cin>>flag; if(!flag){ FILE *output; output = fopen("output.txt", "a+"); if(output){ fputs("\n\nЗадание №1\nlog(x+1)\n\n", output); fprintf(output, "Сумма ряда: %lf\nПри значении х: %lf\nПри точности Е: %lf\n\n", sum, x, E); fclose(output); cout<<"Информация успешно записана в файл \"output.txt\""< } else { cout<<"Ошибка записи в файл"< } } return; } void SecondTask(){ cout<<"Выбрано задание №2"< cout<<"Значения и график функции\n\n"; bool flag = 0; size_t size; cout<<"Введите размер матрицы: "; cin>>size; float **matrix = new float *[size]; cout<<"Ввести матрицу вручную или сгенерировать случайно [0/1]: "; cin>>flag; cout< if(!flag){ for(size_t i = 0; i matrix[i] = new float [2]; cout<<"x["<> matrix[i][0]; } } else { srand(time(NULL)); for(size_t i = 0; i matrix[i] = new float [2]; matrix[i][0] = rand()%6 + 2 + (rand()%10)/10.0; cout<<"x["< } } cout< cout<<"\nЗаписаить полученные значения в файл? (Да/Нет) [0/1]: "; cin>>flag; FILE *output; output = fopen("output.txt", "a+"); if(!flag){ if(output){ fputs("\n\nЗадание №2\nЗначения и график функции\n\n", output); fputs("x |\ty\n", output); } else { cout<<"Ошибка записи в файл"< } } else{ fclose(output); } cout<<"Вычислим значение функции по формуле y = 2*x + \u221A(x^3)"< cout<<"x |\ty"< for(size_t i = 0; i cout<<"----|--------"< matrix[i][1] = 2*matrix[i][0] + sqrt(pow(matrix[i][0], 3)); cout< if(!flag){ if(output){ fputs("----|--------\n", output); fprintf(output, "%.1f | %f\n", matrix[i][0], matrix[i][1]); } } } if(!flag){ if(output){ fclose(output); cout<<"Информация успешно записана в файл \"output.txt\""< } else { cout<<"Ошибка записи в файл"< } } cout< cout<<'^'< for(size_t i = size; i>0; i--){ cout<<'|'< // т.к. в противном случае счётчике i перед выходом попытается принять отрицательное значение, чего не допускает тип size_t } for(size_t i = size - 1; i>0; --i){ cout<<"----"; } cout<<"->"< for (int i = 0; i delete []matrix[i]; } delete []matrix; return; } bool IsVowelEng(const char& c){ char vowels[] = {'a', 'e', 'i', 'o', 'u', 'y'}; for(size_t i = 0; i<(sizeof(vowels)/sizeof(char)); ++i){ if((c == vowels[i])||(c == static_cast return 1; } return 0; } bool IsVowelRus(const wchar_t& c){ wchar_t vowels[] = {L'у', L'е', L'ы', L'а', L'о', L'я', L'и', L'ю', L'э'}; for(size_t i = 0; i<(sizeof(vowels)/sizeof(wchar_t)); ++i){ if((c == vowels[i])||(c == static_cast return 1; } return 0; } // Возвращает псевдослучайное число из диапазона [min, max) int Random(int min, int max) { max++; return min + rand() % (max - min); } void ThirdTask(){ cout<<"Выбрано задание №3"< cout<<"Посчитать количество двубуквенных сочетаний, состоящих из гласных\n\n"; wchar_t string[SIZE] = {0}; unsigned string_length = 0; bool flag = 0; bool language = 0; unsigned vowel_pairs_counter = 0; printf("Ввести строку вручную или сгенерировать случайно [0/1]: "); cin >> flag; printf("На английском языке или русском [0/1]: "); cin >> language; cin.ignore(); cout< if(!flag){ printf("\nВведите строку: "); while(1) { scanf("%lc", &string[string_length]); // Посимвольно считываем строку в бесконечном цикле if ((int)string[string_length] == 10){ // Если встретили символ с кодом 10 (возврат каретки по таблице ASCII) string_length++; // К длине строки добавляется 0-байт break; // Выходим из цикла } string_length++; // Перезаписываем количество введённых символов } printf("Введена строка: "); for(size_t i = 0; i printf("%lc", string[i]); } } else { srand(time(NULL)); string_length = rand()%20+5; if(!language){ // Eng printf("Сгенерированная строка: "); for(size_t i = 0; i // Случайный символ по формуле rand()%[Количество символов в языке - 1] + Порядковый номер в таблице ASCII (+32 для добавления маленьких буковок) string[i] = static_cast printf("%lc", string[i]); } } else { // Rus printf("Сгенерированная строка: "); for(size_t i = 0; i // Случайный символ по формуле rand()%[Количество символов в языке - 1] + Порядковый номер в таблице KOI8-R (+32 для добавления маленьких буковок) string[i] = static_cast printf("%lc", string[i]); } } } printf("\n"); if(!language){ // Eng for(size_t i = 1; i if(IsVowelEng(string[i-1]) && IsVowelEng(string[i])){ ++vowel_pairs_counter; } } } else { // Rus for(size_t i = 1; i if(IsVowelRus(string[i-1]) && IsVowelRus(string[i])){ //printf("%lc", string[i-1]); //printf("%lc\n", string[i]); ++vowel_pairs_counter; } } } printf("Количество двубуквенных сочетаний из гласных: %u\n", vowel_pairs_counter); cout<<"\nЗаписаить полученные значения в файл? (Да/Нет) [0/1]: "; cin>>flag; if(!flag){ FILE *output; output = fopen("output.txt", "a+"); if(output){ fputs("\n\nЗадание №3\nПосчитать количество двубуквенных сочетаний, состоящих из гласных\n\n", output); fprintf(output, "Строка: "); for(size_t i = 0; i fprintf(output, "%lc", string[i]); } fprintf(output, "\nДвубуквенных сочетаний из гласных: %d", vowel_pairs_counter); fclose(output); cout<<"Информация успешно записана в файл \"output.txt\""< } else { cout<<"Ошибка записи в файл"< } } return; } Результаты работыРисунок 6. Главное меню с возможностью выбора задания. Рисунок 7. Вызов задания №1 с записью результата в файл. Рисунок 8. Результат вызова задания 2 с записью в файл Рисунок 9. Результат вызова задания 3 со случайной генерацией текста на русском языке. Рисунок 10. Содержимое файла "input.txt" после вызова заданий. ВыводРешение поставленной задачи было разделено на несколько частей. Первая — составление блок-схем для проработки общей структуры заданий. Вторая – написание соответствующего кода. Для упрощения реализации и улучшения читаемости используются предопределённые процессы. Для каждого задания вызывается своя функция, содержащая его реализацию. Для третьего задания (поиск двубуквенных сочетаний гласных) дополнительно были составлены функции на проверку принадлежности гласной английскому или русскому алфавиту. В последнем случае для корректной работы с кириллическими символами в языке С++ использовался символьный тип wchar_t, занимающий 2 байта и позволяющий работать с Unicode. Для возможности обрабатывать не только строчные, но и заглавные буквы (английского и русского алфавита) к текущему значению кода заглавной буквы прибавляется 32 и получается код её строчного представления. И наоборот. Пользователю предоставляется выбор случайной генерации входных данных, а также возможность занести полученные результаты в текстовый файл для дальнейшего сохранения. Решение поставленных задач позволило расширить навыки владения средствами языка С++, стандартной библиотеки, а также составить базу для решения схожих математических заданий. |