Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: задача на работу с одномерным массивом (C++)  (Прочитано 26423 раз)
0 Пользователей и 1 Гость смотрят эту тему.
li
Гость
« : 17-10-2008 17:58 » 

добрый вечер,знающие программисты:)
возникли трудности с одномерными массивами(а что будет с двумерными я вообще молчу..)
в общем,мне необходима ваша помощь
задача:найти сумму элементов массива,равных среднему арифметическому всех элементов массива
мое решение,которое,увы,не подает признаков жизни:

Код:
#include <stdio.h>
void main()
{
int N,S,i,t;
float A[5];
printf("vvedite razmer massiva\n");
scanf("%d",&N);
printf("vvedite elementi\n");

i=1;
while(i<=N)
{
scanf("%f,&A"); // что происходит здесь?
i=i+1; // зачем здесь надо увеличивать счётчик?
}

S=0;
i=1;
while(i<=N)
{
S=S+A; // что происходит здесь?
i=i+1; // зачем здесь надо увеличивать счётчик?
}

S=S/N;
i=1;
t=0;

while(i<=N)
{
if(A==S) // что такое А?
{
t=t+A;
}
i=i+1; // зачем здесь надо увеличивать счётчик?
}
printf("vivod=%f",S);
}

очень надеюсь на вашу помощь,наведите на правильный путь,скажите какие ошибки,буду очень благодарна
« Последнее редактирование: 17-10-2008 18:47 от Джон » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 17-10-2008 18:44 » 

Только честно - код откуда брала?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 17-10-2008 19:34 » 

добрый вечер,знающие программисты:)
возникли трудности с одномерными массивами(а что будет с двумерными я вообще молчу..)
в общем,мне необходима ваша помощь
задача:найти сумму элементов массива,равных среднему арифметическому всех элементов массива
мое решение,которое,увы,не подает признаков жизни:

Код:
#include <stdio.h>
void main()
{
int N,S,i,t;
float A[5];
printf("vvedite razmer massiva\n");
scanf("%d",&N);
printf("vvedite elementi\n");

i=1;
while(i<=N)
{
scanf("%f,&A"); // что происходит здесь?
i=i+1; // зачем здесь надо увеличивать счётчик?
}

S=0;
i=1;
while(i<=N)
{
S=S+A; // что происходит здесь?
i=i+1; // зачем здесь надо увеличивать счётчик?
}

S=S/N;
i=1;
t=0;

while(i<=N)
{
if(A==S) // что такое А?
{
t=t+A;
}
i=i+1; // зачем здесь надо увеличивать счётчик?
}
printf("vivod=%f",S);
}

очень надеюсь на вашу помощь,наведите на правильный путь,скажите какие ошибки,буду очень благодарна
Как совет,-написать свой код, предварительно сделав алгоритм и расписав его по шагам, чтобы быть в ответе за каждую строчку, конструкцию, символ и понимать почему именно так, а не иначе.

Потратишь на это возможно пол дня, день, два- но это будет огромным плюсом для дальнейших задач, т.к. с примитивов закладываются основы
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 17-10-2008 20:45 » 

Цитата: li
scanf("%f,&A");
Я такие перлы наблюдал у непрофильных студентов младших курсов.

У меня тогда сложилось впечатление, что они пытались писать код по некоему воспоминанию или подобию тому, что им давалось. И это несмотря на пояснения про синтаксис, его строгость, попытки тренировать на распознавание отдельных синтаксических конструкций в коде.

В таких случаях ощущается провал на уровне базовой подготовки.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 18-10-2008 04:41 » 

Коменты-вопросы в код это я вставил, когда его форматировал. Он был как всегда - "в столбик". Ошибки типа неправильно расставленных фигурных скобок я правда сам исправил - это синтаксис, может она код в браузере набирала, а вот возле программныех  я поставил коменты с вопросами. Я думаю, если  li сама ответит на эти вопросы, то всё станет ясно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
li
Гость
« Ответ #5 : 18-10-2008 16:39 » 

код я написала сама,после расписанной блок схемы,как кто то здесь упомянул
блок схему сама писала,и код сама,наверно поэтому такой бред получился,я знаю что мой уровень "понимая" равен нулю,поэтому и попросила помощи
scanf("%f,&A"); // что происходит здесь?-это означает ввод данных,раз вы спросили,значит тут что то не так?)
i=i+1; // зачем здесь надо увеличивать счётчик?-как?)а как же ходить по каждому эелменту массива?чтоб перейти на след.элемент нам надо передвинуть счетчик
S=S+A; // что происходит здесь?-к сумме(которая первоначально равна нулю) прибавляем по каждому элементу массива
нам же найти надо среднее арифметическое
if(A==S) // что такое А?-а вот тут я напутала кажется...и правда,что такое А:(
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-10-2008 19:01 » 

Цитата: li
scanf("%f,&A"); // что происходит здесь?-это означает ввод данных,раз вы спросили,значит тут что то не так?)
Вот-вот. Воспоминание вида: "Для ввода данных надо писать примерно вот эту штуку со странными значками."

А что такое функция, что такое функция scanf, какие у неё параметры, по какому принципу она работает - это всё находится за пределами знания.

Джон, и знаешь, в чём-то они правы. Зачем вникать во все эти тонкости, если всего-то надо ввести вещественное число с клавиатуры?!. Поэтому, IMHO, язык C - это не для начинающих. Начинать надо либо с ассемблера, либо с Pascal.   Поскольку C до самостоятельного написания студентом первой интерактивной программы требует основательной подготовки из-за функций printf и scanf, тянущих за собой понятие функции, указателя, операции взятия адреса...

Может просто подсказать, как это записать правильно?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 18-10-2008 20:42 » 

Может просто подсказать, как это записать правильно?
Я вот тоже склоняюсь к этому варианту, хотя не особый сторонник халявы. Потому что, судя по коду, была попытка записать более-менее правильный (разве что, пожалуй, не вполне оптимальный - но совсем чуть-чуть) алгоритм. Вот только она не удалась в связи со scanf и неумением работать с массивами. О чём автор сабжа честно поведал с самого начала Улыбаюсь
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 18-10-2008 20:49 » 

li, явные ошибки:
1. уже названная неправильная работа со scanf
2. доступ к элементу массива A выглядит как A[ i], где i - порядковый номер элемента (начиная с нуля - у тебя везде с 1)
3. в соответствии с п.2, в последнем цикле сравнивать надо, видимо, S и A[ i]
4. переменные S и t точно должны быть типа float, а то у тебя там не совсем нужный результат может оказаться.
5. если враг введёт в твою программу размер массива, превышающий размер созданного тобой, будет плохо Улыбаюсь узнай, что такое динамические массивы, или хотя бы сделай проверку, не позволяющую в случае слишком большого значения продолжать выполнять код, который уже неизбежно приведёт к проблемам.

Ну и ещё совет: это не ошибка, но оператор цикла for, имхо, был бы здесь куда уместнее while.
« Последнее редактирование: 18-10-2008 20:57 от Вад » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 18-10-2008 22:49 » 

Согласен, начинать надо ну если не с васика то хотя бы с паскаля. Учитывая, что ошибки в основном связаны с непониманием сишных структур и синтаксиса, а так же, что в принципе все написано правильно, думаю можно в этом случае сделать исключение:

li, вот рабочий код. Я оставил всё как у тебя, только исправил ошибки чтобы это работало и убрал один цикл - подсчитывать сумму можно в цикле ввода данных. Сравни со своим кодом, если что-то будет непонятно - спрашивай. Обрати внимание на работу с элементами массива А и объявление вспомогательных переменных, их тип. Чтобы это действительно пошло на пользу сделай "работу над ошибками" - выпиши в этой теме все ошибки в своём коде, которые ты найдёшь, и объясни их (по мере возможности конечно). Мы их потом проанализируем.

Код:
void main()
{
float S,t;
int i = 0;
int N = 0;

printf("vvedite razmer massiva\n");
scanf("%d",&N);

float *A = new float[N];
printf("vvedite elementy\n");

i=0;
S=0.0f;
while(i<N)
{
scanf("%f", &A[i]);
S=S+A[i];
i=i+1;
}

S=S/(float)N;
i=0;
t=0.0f;

while(i<N)
{
if(A[i]==S)
{
t=t+A[i];
}
i=i+1;
}
printf("vivod=%f",t);

delete [] A;
}


vvedite razmer massiva
6

vvedite elementy
1
1
2
2
3
3

vivod=4.0000


зы Это база, если ты не разберёшься с ней основательно в дальнейшем тебе будет очень трудно, я даже думаю невозможно заниматься С или С++. Если не секрет, какой профиль и насколько глубоко вас собираются внедрять в программирование?

зы зы ответы на вопросы по коду будут после "работы над ошибками" Ага
« Последнее редактирование: 18-10-2008 22:56 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 19-10-2008 06:56 » 

Кстати, в заголовке темы указан C++. Может тогда ввод/вывод на cin и cout переписать? Там проще, чем scanf и printf.

li, вам на занятиях не показывали выражения вида
Код: (C++)
float f;
cout << "Введи число: ";
cin >> f;
?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
li
Гость
« Ответ #11 : 19-10-2008 12:23 » 

dimka,я программированием занимаюсь от силы полтора месяца,вы слишком строго судите меня
да,я понимаю,что плохо во всем этом разбираюсь и что женщинам вообще не место в программировании,но я ведь попыталась написать,а вы сразу категорично ко мне отнеслись.
в институте преподают чисто-вот ребята,это scanf,он служит для ввода данных,а это у нас float,который поясняет что перед нами вещественное число,а не целое
если бы мне было все равно я бы не сидела дома не пыхтела над дурацкой неработающй программой

Джон,спасибо что поняли меня,я сейчас попробую все это дело ввести,если не получится,дам знать
преподаватель сказала,что в моем первоначальном коде(который наверху) какое то действие принимает нулевой вид
какой не сказала
сижу голову ломаю

dimka,нет не показывали
Си у нас еще на стадии "зародыша"
мне трудно его осваивать(

Вад
после А стояло,я не знаю кто его убрал)
а почему t  и  S должны быть вещественные а не целые?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 19-10-2008 12:31 » 

li, t и S должны быть вещественные, поскольку у тебя в массиве вещественные числа. Соответственно, если использовать для подсчёта среднего арифметического целое число, то вещественное будет неявно приведено к нему (хотя компилятор должен предупредить), и деление тоже будет производиться нацело, без дробной части. В результате ты очень сильно потеряешь в точности среднего арифметического. Когда будешь считать сумму избранных элементов, произойдёт то же самое, да ещё и в счёт попадут совсем не те элементы - у тебя же среднее неточно сосчитано.
Записан
li
Гость
« Ответ #13 : 19-10-2008 12:34 » 

а,вроде поняла
а если бы в массиве были целые,то и высчитавала бы я целое?
моя проблема scanf,как тут все уже заметили
я не понимаю,как туда нужно вводить переменные когда они вещественные и наоборот:(
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 19-10-2008 13:12 » 

Цитата: li
вы слишком строго судите меня
А мне казалось, что твоего преподавателя Улыбаюсь

Цитата: li
женщинам вообще не место в программировании
С такими комплексами далеко не уедешь.

Цитата: li
dimka,нет не показывали
Жалко. Так было бы проще.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 19-10-2008 13:16 » 

Цитата: li
я не понимаю,как туда нужно вводить переменные когда они вещественные и наоборот:(
Наоборот - что? Не вещественные - целые либо не вводить - выводить?

scanf только для ввода, для вывода printf.
Для указания, что нужно ввести/вывести значение типа float, служит обозначение %f.
Для указания, что нужно ввести/вывести значение типа int, служит обозначение %i.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
li
Гость
« Ответ #16 : 19-10-2008 14:21 » 

dimka, во первых,про женщин я сказала потому что в 90% случаев программисты-мужчины,вам компьютер понятен с самого начала,что в нем и как,к комплексам это не имеет ни малейшего отношения
а второе,я говорю,что если все числа массива вещественные то и сумму брать как вещественное число?
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 19-10-2008 14:53 » 

Только сейчас начинаю понимать, как же мне повезло с преподавателем по С++, который нас по 2-3 занятия лабораторных заставлял защищать эти "грёбаные"(как я тогда думал) лабы до совершенства.

li, из всей Вашей программы, самое сложное, на мой взгляд, это написать ввод/вывод для Вас, т.к. остальное это всего лишь логика работы и правильно сделанный алгоритм. Думаю намного удобнее на первых порах использовать:

Код:
#include <iostream.h>
void main()
{
  int i=0;
  cout<<"Введите значение i:"; // Выводим в выходной поток сообщение
  cin>>i; // Вводим значение(целочисленное) переменной и нажимаем Enter
  cout<<"\nВы ввели i="<<i; // Выводим сообщение и значение введённой переменной
}
Дело в том, что далее у нас на основе cin/cout началась работа с файлами, двусторонние потоки и т.д. А Ваши функции, как не использовал, так и не довелось использовать Улыбаюсь Но при желании, всегда можно почитать Подбельского(наша библия по С++ на первый год обучения) и во всём разобраться.
« Последнее редактирование: 19-10-2008 14:54 от FallenSoul » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 19-10-2008 14:57 » 

li, насчёт женщин-программистов я бы не был таким категоричным. А то, если в эту тему зглянут наши девушки, то... Ага

если все числа массива вещественные то и сумму брать как вещественное число?

Ну, а как ты сама думаешь? Попробуй просто ради эксперимента создать вещественную переменную со значением 2.2345, а потом присвоить её к другой целочисленной переменной, потом значение целочисленной переменной вывести на экран.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 19-10-2008 17:27 » 

Цитата: FallenSoul
можно почитать Подбельского
Кстати, да. li, очень рекомендую. К тому же книги этих авторов (Подбельский, Фомин) рекомендованы министерством образования - т.е. прошли соответствующую проверку в качестве именно учебников.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
li
Гость
« Ответ #20 : 21-10-2008 18:15 » new

dimka, спасибо за совет по литературе,обязательно найду и прочитаю
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines