Переписать данную программу через указатели - 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.