Переписать данную программу через указатели - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
int n = 0;
int *ms = NULL;
 
void Vvod()
{
    int i;
    printf("Размерность массива: ");
    scanf("%d", &n);
    
    ms = (int*)malloc(n*sizeof(int));

    for (i = 0; i < n; i++) 
    {
        printf("ms[%d]: ",i);
        scanf("%d", &i);
    }
}
 
void Sort()
{
    // сортировка
    int i=1,tmp; 
    
    while (i < n/*если мы не в конце*/)
        {
           if (i == 0) 
           {
             i = 1;
           }
        if (ms[i-1] <= ms[i]) 
         {
            ++i; // идём вперед
         } 
          else 
        {
            // меняем местами
            tmp = ms[i];
            ms[i] = ms[i-1];
            ms[i-1] = tmp;
            // идём назад
            --i;
        }
    }
}
 
void Vivod()
{
    int i;
 
    printf("Результат: ");
    for (i = 0; i < n; i++)
    {
        printf("%d ", &i);
    }
    printf("\n");
}
 
void main()
{   
    setlocale (LC_ALL,"Russian");
    Vvod();
    Sort();
    Vivod();
}

Решение задачи: «Переписать данную программу через указатели»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
unsigned fill(int* arr, unsigned n) {
    int* p = arr;
    for (; n-- && (scanf("%d", p) == 1); ++p) { ; }
    return p - arr;
}
 
void print(const int* arr, unsigned n) {
    while (n--) {
        printf("%d ", *arr++);
    }
    putchar('\n');
}
 
int* sort(int* arr, unsigned n) {
    int* begin = arr, tmp;
    int* end = begin + n;
 
    while (arr < end) {
        if ((begin == arr) || (*(arr - 1) <= *arr)) {
            ++arr;
        }
        else {
            tmp = *arr;
            *arr = *(arr - 1);
            *(arr - 1) = tmp;
            --arr;
        }
    }
    return begin;
}
 
int main() {
    int* arr;
    unsigned size;
 
    printf("set size array: ");
    if ((scanf("%u", &size) != 1) || ((arr = malloc(sizeof(int) * size)) == NULL)) {
        printf("O-o-o-ops ...");
        return 1;
    }
 
    printf("elements: ");
    size = fill(arr, size);
 
    print(sort(arr, size), size);
 
    return 0;
}

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

  1. Объединение кода в одну функцию с использованием указателей.
  2. Указатель p используется для перебора массива, инициализируется значением arr.
  3. В цикле for условие n-- && (scanf(%d, p) == 1) выполняется до тех пор, пока n больше нуля и scanf возвращает 1.
  4. Указатель p увеличивается на 1 после каждой итерации цикла.
  5. Функция fill возвращает разницу между p и arr, что дает размер заполненного массива.
  6. В функции print указатель arr увеличивается на 1 после каждой итерации цикла, что позволяет печатать каждый элемент массива.
  7. Функция sort использует два указателя arr и end, чтобы перебрать массив от начала до конца.
  8. Если текущий элемент больше или равен предыдущему, то указатель arr увеличивается на 1.
  9. Если текущий элемент меньше предыдущего, то элементы меняются местами, а указатель arr уменьшается на 1.
  10. Функция main запрашивает размер массива у пользователя, а затем вызывает функцию fill для заполнения массива.
  11. Массив затем сортируется с помощью функции sort, а затем печатается с помощью функции print.
  12. Если происходит ошибка при заполнении или сортировке массива, программа выводит сообщение об ошибке и завершает работу с кодом 1.
  13. Если программа успешно заполняет, сортирует и печатает массив, она завершается с кодом 0.

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


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

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

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