Указатель с массивом - C (СИ)
Формулировка задачи:
Здравствуйте. Дан массив целых чисел, состоящий из N элементов (N=10). Поменять местами последний элемент с элементом, который ближе всего находится к среднему значению. Подскажите,пожалуйста, как можно поправить код, чтобы избавиться от переменной c?
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
int main()
{
int a[N],*p,c;
time_t t;
clrscr();
srand(time(&t));
for(p=a;p<&a[N];p++)
{
*p=0+rand()%50;
printf("%d ",*p);
}
printf("\n");
for(p=a;p<&a[N];p++)
{
if(p==&a[4])
{
c=*p;
*p=a[9];
a[9]=c;
}
}
for(p=a;p<&a[N];p++)
{
printf("%d ",*p);
}
getch();
return 0;
}Решение задачи: «Указатель с массивом»
textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
int main()
{
int a[N];
int* p;
int avg = 0;
srand(time(NULL));
for(p = a; p < a + N; p++)
{
*p = rand() % 50;
avg += *p;
printf("%d ", *p);
}
avg /= N;
printf("\nAvarage=%d\n", avg);
p = a;
for(int i = 1; i < N; i++)
{
if(abs(avg - *p) > abs(avg - a[i]))
p = a + i;
}
/* swap most close to avg and last in a[]*/
printf("Swapping %d and %d\n", *p, a[N-1]);
if(p != &a[N-1])
{
a[N-1] = a[N-1] + *p;
*p = a[N-1] - *p;
a[N-1] = a[N-1] - *p;
}
for(p = a; p < a + N; p++)
printf("%d ", *p);
return 0;
}
Объяснение кода листинга программы
- Объявлены массив
aтипа int и указательpна этот массив. - Инициализирован массив
aслучайными числами от 0 до 49. - Инициализирован указатель
pна первый элемент массиваa. - Инициализирован переменная
avgдля хранения среднего значения массива. - Установлен начальный индекс для цикла for, который будет перебирать элементы массива от
pдоa + N. - В каждой итерации цикла, значение текущего элемента массива присваивается указателю
p. - Значение текущего элемента массива добавляется к переменной
avg. - Значение текущего элемента массива выводится на экран через printf.
- После завершения цикла, переменная
avgделится на размер массиваNдля получения среднего значения. - Выводится среднее значение массива на экран через printf.
- Указатель
pобновляется, чтобы указывать на последний элемент массива. - Начинается цикл for, который будет перебирать элементы массива от
pдоa + N-1. - В каждой итерации цикла, проверяется, является ли разница между текущим значением
avgи значением элемента массива ближе кavg, чем разница междуavgи последним элементом массива. - Если условие выполняется, указатель
pобновляется, чтобы указывать на элемент массива, ближайший кavg. - Если условие не выполняется, выполняется обмен значениями между последним элементом массива и элементом, на который указывает указатель
p. - Завершается цикл for.
- Выводится сообщение о том, какие элементы были обменены.
- Выводится массив
aот начала до конца. - Программа возвращает 0, что означает успешное завершение.