Сделать блок-схему - C (СИ)
Формулировка задачи:
Найти в заданном массиве все элементы, удовлетворяющие следующему условию: абсолютное значение элемента находится в диапазоне [K,L]. Значения параметров K, L вводит пользователь. Для найденных элементов вывести их индекс в массиве и значение.
Решение задачи: «Сделать блок-схему»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWSLENGHT 5 /* строк в массиве */ #define COLUMNSLENGHT 5 /* рядов в массиве */ #define LEFTBORDER 0 /* случайное значение ОТ */ #define RIGHTBORER 100 /* случайное значени ДО */ typedef struct stcElement { // списочная структура возврата резлультата int row_position; int column_postion; struct stcElement* next; } tdStcElement; typedef tdStcElement *ptrStcElement; /* печать массива */ void PrintArray(const int array[][COLUMNSLENGHT]); /* за полнение массива */ void FillingArray(int array[][COLUMNSLENGHT]); /* поиск вхождения абсалютного значения в отрезок */ ptrStcElement FindAbs(const int array[], const int left, const int right); int main(int argc, const char *argv[], const char *env[]) { int array[ROWSLENGHT][COLUMNSLENGHT]; int left, right; ptrStcElement ptrStcElement_; system("chcp 1251 > nul"); FillingArray(array); puts("Сгенерированный массив:"); PrintArray(array); // справиваю 2 числа и проверяю удоволетворяют ли они условиям printf("Введите границы димпазона поиска числа через пробел: "); while(1) if(scanf(" %d %d", &left, &right) != 2 || left > right || left < LEFTBORDER || left > RIGHTBORER || right > RIGHTBORER){ printf("Некорректный ввод! Границы должны быть в пределах %d и %d.\n\ \rПопробуйте еще раз: ", LEFTBORDER, RIGHTBORER); fflush(stdin); continue; }else break; // если указатель пуст то мы не нашли элементов if(!(ptrStcElement_ = FindAbs(array, left, right))) puts("Элементов в указанном диапазоне не найдено!"); else { ptrStcElement temp; printf("Следующие элементы входят в указанный диапазаон:\n%8s%8s%8s\n", "Строка", "Ряд", "Значение"); do{ if(ptrStcElement_->next) // для условия цикла нужна знать temp = ptrStcElement_->next; // есть ли указатель на след. эл-т else temp = NULL; printf("%8d%8d%8d\n", ptrStcElement_->row_position + 1, ptrStcElement_->column_postion + 1, array[ptrStcElement_->row_position][ptrStcElement_->column_postion]); free(ptrStcElement_); }while(ptrStcElement_ = temp); // пока следующий элемент есть } system("pause"); return 0; } void PrintArray(const int array[][COLUMNSLENGHT]) { register int i, j; for(i = 0; i < ROWSLENGHT; i++) { for(j = 0; j < COLUMNSLENGHT; j++) printf("%8d ", array[i][j]); putchar('\n'); } } void FillingArray(int array[][COLUMNSLENGHT]) { register int i, j; srand((unsigned)time(NULL)); for(i = 0; i < ROWSLENGHT; i++) for(j = 0; j < COLUMNSLENGHT; j++) array[i][j] = rand()%(RIGHTBORER - LEFTBORDER + 1) + LEFTBORDER; } ptrStcElement FindAbs(const int array[], const int left, const int right) { int i, absValue; ptrStcElement ptrStcElement_ = NULL, temp, ptrReturn = NULL; for(i = 0; i < ROWSLENGHT * COLUMNSLENGHT; i++){ absValue = abs(array[i]); // Если значение входит в диапазон if(left < absValue && absValue < right){ // Если это не первое значение if(ptrStcElement_) { if(!(temp = (ptrStcElement)malloc(sizeof(tdStcElement)))){ fprintf(stderr, "Ошибка при выделении памяти.\n"); system("pause"); exit(-1); } // сдвигаемся на один элемент ptrStcElement_->next = temp; ptrStcElement_ = temp; } else { // Если первое, то сохраняем голову списка if(!(ptrStcElement_ = (ptrStcElement)malloc(sizeof(tdStcElement)))){ fprintf(stderr, "Ошибка при выделении памяти.\n"); system("pause"); exit(-1); } ptrReturn = ptrStcElement_; } // ptrStcElement_ != NULL // в созданный участок пишем данные об элементе ptrStcElement_->row_position = i / COLUMNSLENGHT; ptrStcElement_->column_postion = i % COLUMNSLENGHT; ptrStcElement_->next = NULL; } // left < absValue && absValue < right } // i < ROWSLENGHT * COLUMNSLENGHT return ptrReturn; }
Объяснение кода листинга программы
В этом коде реализована функция поиска абсолютного значения в заданном диапазоне в двумерном массиве. Вот список ключевых моментов:
- Ввод массива:
Массив представлен двумерным массивом целых чисел размером 5x5. Для заполнения массива используется функция
FillingArray
, которая случайным образом заполняет массив числами в заданном диапазоне от 0 до 100. - Ввод границ диапазона:
С помощью функции
scanf
пользователь вводит границы диапазона поиска (левую и правую границы). Ввод происходит в цикле while, который продолжается до тех пор, пока пользователь не введет корректные границы (от LEFTBORDER до RIGHTBORER, не выходят за пределы массива). - Поиск элементов в диапазоне:
Для поиска элементов в заданном диапазоне используется функция
FindAbs
. Она проходит по всем элементам массива и проверяет, находятся ли они в заданном диапазоне. Если да, то добавляются в список результатов в порядке возрастания. - Вывод результатов:
Результаты поиска выводятся на экран с помощью функции
PrintArray
. Выводится строка, ряд и значение найденного элемента. - Управление памятью:
В функции
FindAbs
используется динамическое выделение памяти для хранения найденных элементов. Для этого используется операторmalloc
, а для освобождения памяти - операторfree
. - Обработка ошибок:
В коде предусмотрена обработка ошибок, возникающих при выделении памяти с помощью функции
malloc
. В случае ошибки выводится сообщение об ошибке и программа завершается. - Завершение программы:
Программа завершается с помощью функции
system(
pause)
, которая приостанавливает выполнение программы до тех пор, пока пользователь не нажмет любую клавишу. Затем программа завершается с помощью функцииreturn 0
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д