Сделать блок-схему - 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;
}

Объяснение кода листинга программы

В этом коде реализована функция поиска абсолютного значения в заданном диапазоне в двумерном массиве. Вот список ключевых моментов:

  1. Ввод массива: Массив представлен двумерным массивом целых чисел размером 5x5. Для заполнения массива используется функция FillingArray, которая случайным образом заполняет массив числами в заданном диапазоне от 0 до 100.
  2. Ввод границ диапазона: С помощью функции scanf пользователь вводит границы диапазона поиска (левую и правую границы). Ввод происходит в цикле while, который продолжается до тех пор, пока пользователь не введет корректные границы (от LEFTBORDER до RIGHTBORER, не выходят за пределы массива).
  3. Поиск элементов в диапазоне: Для поиска элементов в заданном диапазоне используется функция FindAbs. Она проходит по всем элементам массива и проверяет, находятся ли они в заданном диапазоне. Если да, то добавляются в список результатов в порядке возрастания.
  4. Вывод результатов: Результаты поиска выводятся на экран с помощью функции PrintArray. Выводится строка, ряд и значение найденного элемента.
  5. Управление памятью: В функции FindAbs используется динамическое выделение памяти для хранения найденных элементов. Для этого используется оператор malloc, а для освобождения памяти - оператор free.
  6. Обработка ошибок: В коде предусмотрена обработка ошибок, возникающих при выделении памяти с помощью функции malloc. В случае ошибки выводится сообщение об ошибке и программа завершается.
  7. Завершение программы: Программа завершается с помощью функции system(pause), которая приостанавливает выполнение программы до тех пор, пока пользователь не нажмет любую клавишу. Затем программа завершается с помощью функции return 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы