2016-12-05 1 views
-1

Я преподаю себя C с книгой К. Н. КингаТупик на роль конкретного оператора в программе с Массивы и гнездовой For Loops

Я шел через примеры, обеспечивающих автором, и добавлять мой собственные заметки в Visual Studio.

Я получаю «общую картину» петель, содержащихся в программе ниже, но некоторые детали теряются на мне.

Я надеялся, что вы могли бы просветить меня на роли заявления, которое было обведено красным внизу на фотографиях? Что он делает?

Picture 1 - полная программа:

Изображение 2 - с двумя нижними петлями сколов, показывает ожидаемый результат штраф:

В контексте того, что первая петля-х скобки, утверждение в красном кажется ненужным. Но когда я удаляю его, я получаю программу, которая не работает по назначению. Поэтому он должен быть привязан к одной из двух петель под ним. Я почесываю голову, что она на самом деле делает.

Автор ссылается на цель в BOLD-FACED TEXT ниже, но он не на 100% явно говорит о том, что происходит. Это странно, потому что оператор в красном обращается к массиву, содержащему начальный баланс, но в цикле он содержится в сделках с метками процентной ставки в верхней строке печати.

Автор говорит, говорит:

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

Любая помощь была бы высоко оценена!

Я включил текст из книги, и исходный код ниже

Computing Интерес

Наша программа печатает таблицу, показывающую значение $ 100 инвестированного в различные процентные ставки в течение определенного периода года. Пользователь вводит процентную ставку и количество лет, в которые будут вложены деньги. В таблице будет отображаться стоимость денег с интервалом в один год - с этой процентной ставкой и следующими четырьмя более высокими ставками - при условии, что проценты усугубляются один раз в год. Вот что сеанс связи с программой выглядит следующим образом:

Введите процентную ставку: 6 Введите количество лет: 5

Очевидно, что мы можем использовать для Заявления для печати первой строки.

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

Конечно, этот процесс можно повторить для третьего и последующих строк.

В результате мы получим два аргумента «Заявления», один из которых вложен внутри другого: -Круглый цикл будет отсчитываться от 1 до количества лет, запрошенных пользователем. Внутренний цикл увеличит процентную ставку с самого низкого значения до его наибольшее значение

Обратите внимание на использование NUM_RATES для управления двумя циклами For. Если позже мы изменим размер массива с именем value, петли будут автоматически настраиваться.


#include <stdio.h> 
#define NUM_RATES (sizeof(value)/sizeof(value[0]))  /* NUM_RATES is a macro that finds the length of the array 
                based on the SIZE OF THE  ARRAY in bytes (size of(value)) DIVIDED BY the SIZE OF EACH ELEMENT (sizeof(value[0]) ) */ 
#define INITIAL_BALANCE 100.00 



main() 
{ 
int low_rate;       /*User input --- the lowest interest rate*/ 
int num_years;      /*User input --- the number of years*/ 
int i; 
int year; 
float value[5];      /*Remember that the number in the brackets represents the number of elements --- 1 for each of the 5 year timeline in this case */ 

printf("Enter interest rate: "); 
scanf_s("%d", &low_rate); 
printf("Enter number of years: "); 
scanf_s("%d", &num_years); 


printf("\nYears");     /*This statement prints out the label for the "YEAR" column on the left side of the chart */ 



/*This loop prints out the LABELS FOR THE INTEREST RATE ROW AT THE TOP. Right next to the "Year" */ 

    for (i = 0; i < NUM_RATES; i++) { /* NUM_RATES is 5 here 
             Remember that NUM_RATES, seen above, is a macro for (sizeof(value)/sizeof(value[0])) 
             This macro measures the LENGTH of the array by dividing the array size in bytes by the element size in bytes 
             The macro format makes it easy for the loops to adjust if we need to CHANGE THE SIZE OF THE ARRAY */ 

    printf("%6d", low_rate + i);   /* Prints out the low rate + i according to the loop above */ 


    value[i] = INITIAL_BALANCE; 
} 



printf("\n");      /* This statement starts a new line for the loop below */ 



/* This loop prints the numbers IN THE YEARS COLUMN. Counts from 1 to the number of years entered by the user */ 

    for (year = 1; year <= num_years; year++) { 
     printf("%3d ", year); 



     /* This NESTED loop increments the interest rate FROM ITS LOWEST VALUE TO ITS HIGHEST VALUE AND MULTIPLIES IT BY $100. Occurs right after the year column entry printed */ 
     for (i = 0 ; i < NUM_RATES ; i++) { 
      value[i] = value[i] + (((low_rate + i)/100.0) * value[i]); 
      printf("%7.2f", value[i]); 
     } 
      printf("\n");    /*This statement causes the value to be placed on the next line*/ 
    } 

    return 0; 

} 
+0

Добро пожаловать в переполнение стека :-) Ваш вопрос не в тему. Пожалуйста, посмотрите на [ask] – JimHawkins

+0

Я не думаю, что это совсем не тема, Джим. Можете ли вы объяснить, почему вы так думаете? Это вопрос С и конкретный вопрос. – potomac88

+0

в строке 39, поля (float) массива 'value' инициализируются. 'value' используется во вложенном цикле (строка 57). – JimHawkins

ответ

0

линия в вопросе:

value[i] = INITIAL_BALANCE; 

установит значение для каждого элемента в массиве значений к постоянному значению (т.е. 100,00). В противном случае значения в неинициализированном массиве могут быть 0 или случайными/мусором значение, в зависимости от компилятора.

См. this sample с обновленным выходом. Обратите внимание на дополнительные ключевые слова INT перед объявлением функции для основной(), а также формальных аргументы ARGC и ARGC. Книга KN King's C должна объяснить это, хотя вы можете найти много ресурсов в Интернете, например The GNU C Programming Tutorial.

+0

Просто записка. Два стандартных прототипа для 'main' - это' int main (void) 'и' int main (int argc, char ** argv) '(конечно, имена переменных' argc' и 'argv' могут быть любыми, что вам нравится, и 'argv' также правильно написан в эквивалентной форме' char * argv [] 'Другие архаические обозначения, такие как' void main() ', зависят от компилятора. Ваша форма 'main()' в силу типов по умолчанию 'int main()', которая прекрасна, минус явный 'void', но может быть довольно запутанной для новых программистов на C. Не используйте 'printf (" \ n ");' для 'putchar ('\ n');', не нужно для varadic 'printf' для одного символа. –

+0

Спасибо за конструктивную обратную связь. Первоначально я не обновлял подпись функции, потому что я просто взял образец из OP, но я обновил образец и добавил объяснение. Хороший вопрос об использовании putchar() - обновленный образец использует его. –