2014-01-10 3 views
1

Мне нужно прочитать 10 целых чисел, рассчитать 90% каждого значения, напечатать их в инвертированном порядке и, наконец, распечатать среднее значение различных значений, которые я получил.Вычисление процентов элементов массива

Но он не работает, он печатает только нули. Другое дело, что после того, как я ввел 10 значений, для начала печати все еще требуется другой ввод. Я новичок в C, так что я, вероятно, сделал глупую ошибку ...

#include <stdio.h> 

int main() 
{ 
    int n = 10;   //number of numbers 
    float array[10]; 

    for(int i = 0 ; i < n ; i++) {     
     scanf("%d \n", &array[i]) ; //read the keyboard input and memorize it in the array 
    } 

    for(int i = 9; i > -1 ; i--) { 
     array[i] = array[i]*90.0/100.0;  //calculate the 90% of every value 
     printf("%f \n", array[i]);   //prints the values in opposite order 
    } 

    float s = 0;       
    for(int i = 0 ; i < 10 ; i++){ 
     s = s+array[i];     //add up all the values 
    } 

    float m =s/n;       //calculate the mid value 
    printf("%f \n",m);      //prints it 
    system("PAUSE"); 

    return 0; 
} 
+5

90/100 является целочисленной арифметики, что приводит к 0. Использование 90,0/100,0 – OldProgrammer

+3

Это _is not_ C++ код. Вы имели в виду использовать тег 'C'? Если вы хотите ответить на C++, то идиоматический путь будет гораздо более кратким. Кроме того, вы преодолеваете границы своего массива. – Chad

+3

@OldProgrammer: не должно быть проблемой, поскольку слева направо оценка выражения (float * 90/100 остается float) ... – mb84

ответ

0

Это может быть ваша проблема:

scanf("%d \n", &array[i]) ; //read the keyboard input and memorize it in the array 

The array элементов типа float, и вы сказали scanf, чтобы прочитать целое число. Неопределенное поведение там. Попробуйте следующее:

scanf("%f \n", &array[i]) ; //read the keyboard input and memorize it in the array 
+0

это было действительно !!! Спасибо! – ninilo1

+0

@ ninilo1: Я не думаю, что это был ваш единственный, но получайте удовольствие, найдя остальных. 8v) –

0

Примечание: этот ответ написан для кода исходного вопроса.


Использование компилятора с приличными диагностическими сообщениями поможет вам в изучении C++. Диагностика, созданная clang для вашей программы, выделяет несколько проблем, включая основную проблему, которая дает вам проблемы.

main.cpp:3:2: error: C++ requires a type specifier for all declarations 
main() 
^~~~ 

Это происходит потому, что объявления функций должны включать тип возврата. Для main это должно быть int, поэтому вы должны написать int main().

main.cpp:12:19: warning: format specifies type 'int *' but the argument has type 'float *' [-Wformat] 
    scanf("%d \n", &array[i]) ; //read the keyboard input and memorize it in the array 
      ~~  ^~~~~~~~~ 
      %f 

Ваш массив представляет собой массив из поплавков, пока вы говорите scanf читать целые числа ("% d" означает int, "% F" означает float). Это приведет к неопределенному поведению и, вероятно, послужит причиной странного поведения, которое вы описываете (печать нулей вместо ожидаемых значений).

Поскольку ваше назначение включает в себя массив целых чисел, вы, вероятно, должны изменить свой массив, чтобы использовать int вместо float. Если вы сделаете это изменение, вам нужно будет изменить строку формата printf, чтобы указать int s вместо float.

Также вы путаетесь с размером массива. Вы объявили массив для хранения 9 значений, когда вы действительно хотите десять. Предположительно, что вас смущает то, что индекс для доступа к n-му элементу равен n-1, поэтому для доступа к десятому элементу вы пишете array[9]. Это применяется при обращении к элементам, а не при объявлении массива. Чтобы объявить массив из десяти элементов, вы скажете int array[10];. В вашем случае у вас есть переменная n, которая используется для итерации по массиву; Это правильно, и хорошая практика, чтобы использовать то же переменный в обоих цикле и при объявлении массива, как следующее demonstrages фрагмента кода:

const int n = 10; 
int array[n]; 
for (int i=0; i<n; ++i) 

Поскольку ваш код пытается прочитать десятую значения в массив из девяти элементов, программа снова демонстрирует неопределенное поведение.


main.cpp:28:6: error: use of undeclared identifier 'system' 
    system("PAUSE"); 
    ^

Вы не включили правильный заголовок функции system(). Вы должны #include <stdlib.h> (или в то, что считается хорошей практикой для C++ вы должны #include <cstdlib> и явно претендовать system в std::system("PAUSE").


После устранения этих проблем ваша программа, кажется, работает хорошо. Первая проблема

+0

Спасибо большое! Знаете ли вы хороший бесплатный компилятор? – ninilo1

+0

@ ninilo1 clang доступен бесплатно и хорошо работает на Linux, BSD и OS X. Он еще не очень хорошо поддерживает Windows. Вы можете попробовать его в Интернете на таких сайтах, как http://rextester.com/runcode (выберите «C++ (clang)»). VC++, к сожалению, не обладает такой полезной диагностикой и очень разрешает неправильный код. Если вы хотите установить компилятор с хорошей диагностикой в ​​Windows, вам следует, вероятно, перейти с последней доступной версией gcc. – bames53

+0

ОК, еще раз спасибо – ninilo1

0

OP, в СУИ -matched спецификатор формата в зсапЕ() хорошо адрес на @ bames53 и @fred Larson

float array[10]; 
... 
// bad scanf("%d \n", &array[i]) 
scanf("%f", &array[i]); 

Ответ на 2-й проблемы ФП в следующем:.

«Другое дело, что после того как я введен в 10 значений она по-прежнему требует другого входа, чтобы начать печать.»

Относительно scanf("%d \n",...: ' ' и '\n' делать то же самое, и, вероятно, на самом деле не то, что вы хотите. Они требуют, чтобы вы вводили данные без пробелов после номера до того, как возвращается scanf(). Предлагайте:

scanf("%f", &array[i]); 
// or 
char buf[100]; 
fgets(buf, sizeof buf, stdin); 
sscanf(buf, "%f", &array[i]); 
Смежные вопросы