PDA

Показать полную графическую версию : [решено] Программа подсчета ненулевых значений


Dante_Deathcore
19-12-2014, 13:46
Помогите написать программу подсчета ненулевых значений из десяти вводимых с клавиатуры чисел. Ввод необходимо организовать с помощью оператора цикла for.

Iska
19-12-2014, 14:03
Dante_Deathcore, изучите Правила Форума (http://forum.oszone.net/announcement-21-187.html), п.6.

Dante_Deathcore
19-12-2014, 15:06
Но я, к сожалению, черновую работу не сохранил. Придется поверить на слово, а не считать меня лентяем.

Iska
19-12-2014, 15:11
Ну, я-то лично верю ;). Напишите по памяти.

Grabber2006
19-12-2014, 15:45
#include "stdafx.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
int nSum = 0;
std::cout << "Vvedite 10 tselyh chisel:\n";
for (int i = 0; i < 10; i++)
{
int nValue = 0;
std::cin >> nValue;
if (nValue != 0) nSum = nSum + nValue;
}
std::cout << "Summa chisel ravna: " << nSum << "\n";
return 0;
}

Drongo
19-12-2014, 16:28
Помню, когда начинал учить программирование, после изучения 2-й главы циклы, в состоянии был написать "мысленно" код считывания 10 значений с циклом. Там ведь знаний-то никаких специальных не требуется:

1. Как считываются данные
2. Оформить п. 1 циклом из 10 проходов.
3. Перед суммированием проверить что введённое число не равно нулю.
4. Вывести результат.

Человек, написавший даже в черновом варианте, в состоянии описать реализацию простейшего кода в 10 строк хотя бы словами(псевдокод).

Dante_Deathcore
19-12-2014, 17:20
Начал с указания типа - int.
Знаю, что работа идет с массивами. Его размер - 10. Потом шла "просьба о вводе (cout) и сам ввод (cin)" собственно. Каждый раз учитывается шаг/счетчик - i++ .
И дальше я, к сожалению, не знаю, что и как, хотя "чисто логически" понимаю. . Знаю, что введенную с клавиатуры переменную необходимо сравнивать с 0 (n>0). Это с оператором if идет (тут тоже нужен счет - фиксировать i (количество ненулевых) - i<=10).
Прошу, помогите.

Iska
19-12-2014, 17:44
Прошу, помогите. »
Сообщение #5 пропустили? Если не сумма, а количество — так там просто поменять.

Dante_Deathcore
19-12-2014, 17:45
Сообщение #5 пропустили? »
Оно не верно. То есть - не соответствует условию (шапка темы).

Grabber2006
19-12-2014, 17:52
#include "stdafx.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
int nSum = 0;
std::cout << "Vvedite 10 tselyh chisel:\n";
for (int i = 0; i < 10; i++)
{
int nValue = 0;
std::cin >> nValue;
if (nValue != 0) nSum = nSum + 1;
}
std::cout << "Chislo nenulevyh chisel: " << nSum << "\n";
return 0;
}
:)

Dante_Deathcore
20-12-2014, 06:50
Вот, я сделал while (для программного продукта 2010 года). В подобный вид можете с for, а то чего-то....торможу(

#include <iostream>
using namespace std;
int main ()
{
int kol=0, x, i=1;
const int n=10;
while (i<=n)
{
cout<<"enter number"; cin>>x;
if (x!=0)
{
kol++;
}
i++;
}
cout<<"Result "<<kol<<endl;
system("pause");
return 0;
}

Drongo
20-12-2014, 16:00
Вот так будет.#include <iostream>
using namespace std;
int main ()
{
int kol = 0, x;

for(int i = 1; i <= 10; i++){
cout << "enter number " << i << ": ";
cin >> x;
if (x != 0)
kol++;
}

cout << "Result " << kol << endl;
system("pause");

return 0;
}
Разницы между while и for нет, за исключением что при while нужно заранее объявить все переменные: счётчик, пороговое значение

int a = 10; // пороговое значение
count = 0; // счётчик

while(count < a){
cout << "Num: " << count << endl;
count++;
}
А в for объявление стартовой переменной, пороговое значение и инкремент счётчика выполняется в одном теле

for(int i = 0; i < 10; i++)
cout << "Num: " << i << endl;

Dante_Deathcore
21-12-2014, 09:51
Последний вопрос... что значит это:
+ i + »

Iska
21-12-2014, 12:44
Последний вопрос... что значит это: »
Вставку в строку вывода значения переменной «i». Рассматривайте выражение в целом:
… "enter number " + i + ": " … »

Drongo
21-12-2014, 16:19
Да. Обычный проверочный тестовый вывод значений в цикле. Но там немного ошибка, нужно так.
cout << "enter number " << i << ": "; »

Сказалось что в момент написания примера работал с текстовыми строками в другом проекте и параллельно писал сообщение сюда. :)
Тм можно складывать их так
String str1 = "test1";
String str2 = "test2";
String str3 = str1 + str2;

Dante_Deathcore
21-12-2014, 16:44
Вот, посоветовался, подумал, подсказали.
Вот решение. Заберет кто, если столкнулся с подобной задачей.

#include <iostream>
using namespace std;
int main()

{
int sum, i, k;
int a[10];
cout<<"Enter 10 numbers \n";
k=0;
for (i=1; i<=10; i++)
{
cin>>a[i];
if (a[i]!=0) k++;
}
cout<<"Result: "<<k<<"\n";
system("pause");
}

Drongo
22-12-2014, 01:32
В данном контексте подобная реализация с массивами сомнительна.

1. Зачем создавать массив если следом за ним идёт цикл сохранения в массив и сразу же считывание этого значения?
2. Сохранять в массив нужно тогда когда вы предполагаете дальнейшее использование значений. В данной программе идёт проверка после ввода, и если условие удовлетворяется, инкрементируется счётчик. Всё. Введённое число в дальнейших расчётах не участвует. Не вижу необходимости в использовании массива... Выводите вы k, а не значения a[i] и на этом программа завершается.
3. Грубо говоря, в память у вас будет использоваться в холостую.

Iska
22-12-2014, 01:46
Drongo, запросто — требование «сверху». С другой стороны — в С++ нумерация элементов массива разве отличается от С? Не с нуля?

lxa85
22-12-2014, 03:22
С одной стороны я поддерживаю Iska, т.к. использование массивов скроей всего действительно требование "сверху" в рамках изучения программирования (все знают, что там любят такие задачки).
С другой стороны, в задании, как его приводит Dante_Deathcore, нет строго указания на массивы, в отличии от ручного ввода данных, и здесь я вынужден согласиться с Drongo.
Сисадмин же во мне говорит "делай бекап и не порть данные, пригодятся".
Программист, ссылаясь на ТЗ, говорит – порть смело, память лишней не бывает!
Забавно :)

Drongo
22-12-2014, 12:40
С другой стороны — в С++ нумерация элементов массива разве отличается от С? Не с нуля? »Кстати да, с нуля, иногда могут "игнорировать" нулевой элемент если хочется красивости и симметричности 1-й элемент = 1 счёчику обхода. Но тогда объявляют массив с размером n + 1, т.е. 10 уже никак не получится обойти если начать с единицы, т.е. i будет равна 10, а 10-й элемент массива имеет порядковый номер 9 (счёт же идёт с нуля...). Короче тут выход за границы диапазона. Ошибка.




© OSzone.net 2001-2012