есть ли способ записать код покороче :?
Получилось слишком громоздко, можно ли сделать короче это задание?
"В одномерном массиве А(10) вычислить среднее арифметическое элементов, расположенных между минимальным и максимальным."
#include <stdio.h>
int main(){
int mas[10], result = 0, max, min, i, max_in=0, min_in=0, am, count = 0;
for (i = 0; i < 10; i++){
printf("Введите элемент mas[%d] = ",i);
scanf("%d", &mas[i]);
}
max=mas[0];
min = mas[0];
for(i = 0; i < 10; i++){
if(mas[i]>max){
max=mas[i];
max_in = i;
}else if(mas[i]<min){
min=mas[i];
min_in = i;
}
}
if(max_in<min_in){
count = (min_in - max_in) - 1;
if(count == 0){
printf("Кол-во = 0");
}else{
for(i = max_in + 1; i<min_in; i++){
result += mas[i];
}}
}else if(max_in>min_in){
count = (max_in - min_in) - 1;
if(count == 0){
printf("Кол-во = 0");
}else{
for(i = min_in + 1; i<max_in; i++){
result += mas[i];
}}
}
am = result/count;
printf("Результат = %d \n", am);
return 0;
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Ну, если действовать исключительно (не включая минимум и максимум) и рассматривая первые же минимум и максимум среди равных, то, например, так:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, max, min, imax = 0, imin = 0, d[10];
for(int i = 0; i < 10; i++)
{
printf("Введите элемент mas[%d] = ",i);
scanf("%d", &m);
if (i == 0)
max = min = d[0] = m;
else
{
d[i] = d[i-1] + m;
if (m > max) max = m, imax = i;
else if (m < min) min = m, imin = i;
}
}
if (imax < imin) { m = imin; imin = imax; imax = m; }
if (imax - 1 <= imin) printf("no elements\n");
else printf("%lf\n",((double)(d[imax-1] - d[imin]))/(imax-imin-1));
}
Надеюсь, числа не такие, чтоб вызвать переполнение при суммировании :)
Автор решения: NkL322
→ Ссылка
Не знаю, что по мнению преподавателя является "громоздким", поэтому постарался использовать парадигму функционального программирования для облегчения читаемости кода. Ну и в некоторых моментах специально ужал количество строк, вдруг имелся ввиду объём.
Мой вариант
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
int getMaxOrMin(int* arr, bool isMax) {
int maxOrMin = isMax ? INT_MIN : INT_MAX;
for (int i = 0; i < 10; i++) {
if (arr[i] > maxOrMin && isMax)
maxOrMin = arr[i];
else if (arr[i] < maxOrMin && !isMax)
maxOrMin = arr[i];
}
return maxOrMin;
}
int getIndex(int* arr, int num) {
for (int i = 0; i < 10; i++) {
if (arr[i] == num)
return i;
}
}
double getAvg(int* arr, int max_i, int min_i) {
int begin = max_i < min_i ? max_i : min_i, end = max_i > min_i ? max_i : min_i,
count = 0, sum = 0;
for (int i = begin + 1; i < end; i++, count++)
sum += arr[i];
return sum / count;
}
int main() {
int arr[10], max, min, max_i, min_i;
for (int i = 0; i < 10; i++) {
printf("Введите элемент arr[%d] = ", i);
scanf("%d", &arr[i]);
}
max = getMaxOrMin(arr, true);
min = getMaxOrMin(arr, false);
printf("Среднее арифметическое = %lf", getAvg(arr, getIndex(arr, max), getIndex(arr, min)));
return 0;
}