Автор Тема: Visual C++, нахождение ср. значения в массиве и номер ближайшего элемента  (Прочитано 9388 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kvotl

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Помогите.   :-[
Суть в следующем. У меня стоит задача написать программу нахождения среднего значения в массиве из 10 чисел. И номер ближайшего элемента массива к среднему числу. Среднее нашёл. Как поступить дальше? Можно попытаться найти разность среднего и элементов массива и упорядочить полученные результаты по модулю методом пузырька. Но как дальше? И как работать с модулями? Или есть более простой способ? Подскажите, пожалуйста. Вот то, что уже есть. Знаю, что не много и возможно неправильно, но как смог   :(
ЗЫ. Работаю Visual C++ 2008

// задача.cpp: нахождение среднего значения массива и ближайщего к нему значения эллемента массива
//

#include "stdafx.h"

#include <math.h>
#include <stdio.h>
#include <clocale>

int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "rus");

const int size = 10;
float a[size] = {0};

float s = 0; //Среднее значение
float sum1 = 0;//Сумма

int menu = 0; //Пункт меню
int menu1 = 0;//Подтверждение выполнения первого пункта
int menu2 = 0;//Подтверждение выполнения второго пункта
int menu3 = 0;//Подтверждение выполнения третьего пункта

do
{
printf("\n\nПрограмма для вычисления среднего значения элементов массива и нахождения к нему ближайшего элемента массива.\n\n");
printf("1. Ввести 10 значений\n");
printf("2. Вычислить среднее значение\n");
printf("3. Найти номер элемента ближайшего к среднему\n");
printf("4. Вывод среднего значения всех элементов массива и номер элемента ближайшего к среднему\n");
printf("------------------------------------\n");
printf("0. Выход\n\n\n");

scanf("%d", &menu);

switch(menu)
{

case 1:
printf("Введите %d значений\n", size);
for (int i = 0; i < size; i = i + 1)
{
printf("Введите элемент №%d: ", i + 1);
scanf("%f", &a[i]);
}
menu1 = 1;
menu2 = 0;
menu3 = 0;
break;

case 2:
if (1 == menu1)
{
int sum = 0;
for (int i = 0; i < size; i = i + 1)
{
sum = sum + a[i];
}
sum1 = sum;
s = sum1 / 10;
printf("Среднее значение равно %f.\n", s);
menu2 = 1;
menu3 = 0;
}
else
{
printf("Сначала нужно произвести ввод данных.\nПожалуйста, выберите пункт меню 1.\n");
}
break;

case 3:
break;

case 4:
break;

case 0:
printf("Выход");
break;
default:
printf("Неверный пункт меню.\n");
printf("Выбирите пункт меню: 1, 2, 3, 4, 5.\n");
}
}
while(menu != 0);
getchar();
getchar();
return 0;
}

Я на ранней стадии изучения языка. И мне нужно что-нибудь попроще, чтобы я сам мог это догнать исходя из тех знаний, что у меня есть.
Заранее, спасибо.
« Последнее редактирование: 01 Ноября 2010, 09:00:23 от Asix »

Оффлайн testtest

  • Старожил
  • ****
  • Сообщений: 376
    • Просмотр профиля
проще всего пройти по всем элементам и найти, где минимальное различие между элементом и средним.
case 3:
  float delta = fabs( s - a[0] );
  int m = 0;
  for ( unsigned int i = 1; i < size; ++i ) {
    if ( fabs( s - a[i] ) < delta ) {
      delta = fabs( s - a[i] );
      m = i;
    }
  }
  printf( "Номер \"наиболее среднего\" элемента: ", m );
  break;
« Последнее редактирование: 01 Ноября 2010, 09:00:14 от Asix »

Оффлайн kvotl

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Увы, но прога не запустилась. С вставлением данного фрагмента кода, компилятор выдаёт 6 ошибок.

Цитировать
1>c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(87) : error C2360: пропуск инициализации 'm' из-за метки 'case'
1>        c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(75): см. объявление 'm'
1>c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(87) : error C2360: пропуск инициализации 'delta' из-за метки 'case'
1>        c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(74): см. объявление 'delta'
1>c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(90) : error C2360: пропуск инициализации 'm' из-за метки 'case'
1>        c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(75): см. объявление 'm'
1>c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(90) : error C2360: пропуск инициализации 'delta' из-за метки 'case'
1>        c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(74): см. объявление 'delta'
1>c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(93) : error C2361: пропуск инициализации 'm' из-за метки 'default'
1>        c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(75): см. объявление 'm'
1>c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(93) : error C2361: пропуск инициализации 'delta' из-за метки 'default'
1>        c:\users\user\documents\visual studio 2008\projects\лаба №2\лаба №2.cpp(74): см. объявление 'delta'
Пытался исправить сам, исходя из описания ошибок, не получилось.
« Последнее редактирование: 01 Ноября 2010, 09:00:32 от Asix »

Оффлайн kvotl

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
От этого избавился выносом переменных в начало кода.
Строчку  printf( "Номер \"наиболее среднего\" элемента: %d\n ", m ) поправил.
Теперь запускается, но среднее значение не находит. Пишет, что Номер "наиболее среднего" элемента: 0
« Последнее редактирование: 01 Ноября 2010, 09:00:40 от Asix »

Оффлайн testtest

  • Старожил
  • ****
  • Сообщений: 376
    • Просмотр профиля
а ты среднее сначала находишь, или нет? строки
delta = fabs( s - a[0] );
m = 0;
оставил? или перенес всё в начало кода?
« Последнее редактирование: 01 Ноября 2010, 09:00:48 от Asix »

Оффлайн kvotl

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Всё это перенёс в начало. У меня среднее значение округлялось. Добавил float в строчку s = float(sum1) / 10; и после этого всё заработало нормально. Номер ближайшего к среднему тоже стал находиться нормально. В чём прикол, я не знаю. Препод тоже объяснить не смог.

case 2:
if (1 == menu1)
{
int sum = 0;
for (int i = 0; i < size; i = i + 1)
{
sum = sum + a[i];
}
sum1 = sum;
s = float(sum1) / 10;
printf("Среднее значение равно %f\n", s);
menu2 = 1;
menu3 = 0;
}
else
{
printf("Сначала нужно произвести ввод данных.\nПожалуйста, выберите пункт меню 1.\n");
}
break;

Спасибо за помощь.

Оффлайн testtest

  • Старожил
  • ****
  • Сообщений: 376
    • Просмотр профиля
тогда не
\( $s = float(sum1) / 10;$ \)
а
\( $s = sum1 / 10.0f;$ \)

это приведение типов.
скорее всего, ты набирал в качестве элементов массива целые числа.

 

Нахождение конечной суммы ряда в Фортране

Автор ScoRpiON

Ответов: 3
Просмотров: 4352
Последний ответ 22 Декабря 2011, 18:14:50
от Selyd
Pascal. Вычислить значения  du/dx, пользуясь конечно-разностным соотношением

Автор Shurara

Ответов: 0
Просмотров: 6263
Последний ответ 09 Февраля 2011, 17:54:21
от Shurara
Вычислить значения медиан треугольника, прога, помогите плиз

Автор siyu1989

Ответов: 3
Просмотров: 5113
Последний ответ 19 Января 2012, 03:12:20
от sp
Программка на С++, определить значения массиво по правилу

Автор gilyth

Ответов: 5
Просмотров: 4774
Последний ответ 15 Марта 2011, 00:53:25
от Данила
visual basic, программа для вычисления силы тока, сопротивления, напряжения

Автор Иришка!!!

Ответов: 0
Просмотров: 5988
Последний ответ 10 Февраля 2011, 14:36:16
от Иришка!!!