Переписать данную программу через указатели - 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; }
Объяснение кода листинга программы
- Объединение кода в одну функцию с использованием указателей.
- Указатель
p
используется для перебора массива, инициализируется значениемarr
. - В цикле
for
условиеn-- && (scanf(
%d, p) == 1)
выполняется до тех пор, покаn
больше нуля иscanf
возвращает 1. - Указатель
p
увеличивается на 1 после каждой итерации цикла. - Функция
fill
возвращает разницу междуp
иarr
, что дает размер заполненного массива. - В функции
print
указательarr
увеличивается на 1 после каждой итерации цикла, что позволяет печатать каждый элемент массива. - Функция
sort
использует два указателяarr
иend
, чтобы перебрать массив от начала до конца. - Если текущий элемент больше или равен предыдущему, то указатель
arr
увеличивается на 1. - Если текущий элемент меньше предыдущего, то элементы меняются местами, а указатель
arr
уменьшается на 1. - Функция
main
запрашивает размер массива у пользователя, а затем вызывает функциюfill
для заполнения массива. - Массив затем сортируется с помощью функции
sort
, а затем печатается с помощью функцииprint
. - Если происходит ошибка при заполнении или сортировке массива, программа выводит сообщение об ошибке и завершает работу с кодом 1.
- Если программа успешно заполняет, сортирует и печатает массив, она завершается с кодом 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д