Переписать данную программу через указатели - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д