Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Ответы на вопросы для самоконтроля из главы 6
1. 2, 7, 70, 64, 8, 2
2. Он должен вывести следующее:
36 18 9 4 2 1
Если бы переменная value имела тип double, то результат проверки условия оставался бы истинным даже при значениях value, меньших 1. Выполнение цикла продолжалось бы до тех пор, пока потеря значимости при вычислениях с плавающей запятой не привела бы к получению значения 0. Кроме того, в этом случае выбор спецификатора %3d был бы неправильным.
3. а. х > 5
б. scanf ("%lf",&x) ! = 1
в. х == 5
4. a. scanf ("%d", &х) == 1
б. х ! = 5
в. х >= 2 0
5. Строка 4: должна содержать list [10].
Строка 6: запятые необходимо заменить точками с запятой.
Строка 6: диапазоном для i должен быть 0-9, а не 1-10.
802 Приложение А
Строка 9: запятые необходимо заменить точками с запятой.
Строка 9: операцию >= необходимо заменить операцией <=, иначе цикл будет выполняться порядочное время.
Строка 11: между строками 11 и 12 должна присутствовать дополнительная закрывающая фигурная скобка. Одна скобка закрывает блочный оператор и еще одна — программу. Между этими скобками необходимо поместить строку return 0;.
Вот скорректированная версия:
6. Ниже показан один из возможных вариантов:
#include int main(void)
{
int col, row;
for (row = 1; row <= 4; row++)
{
for (col = 1; col <= 8; col++) printf("$"); printf ("\n");
}
return 0;
}
7. а. Программа выведет следующую строку:
Hi! Hi! Hi! Bye! Bye! Bye! Bye! Bye!
б. Программа выведет следующую строку:
ACGM
Поскольку код добавляет значение int к значению char, компилятор может выдать предупреждение о возможности потери значащих цифр.
8. Эти программы выведут следующие данные:
а. Go west, youn
б. Нр ! xf tu-! zpvo
в. Go west, young r. $0 west, youn
Ответы на вопросы для самоконтроля 803
9. Должен быть получен следующий вывод:
10. a. mint.
б. 10 элементов.
в. Значения типа double.
г. Правильной является строка scanf ("%lf", &mint [2] ); mint [2] — это значение типа double, a &mint [2] — его местоположение.
11. Поскольку первый элемент имеет индекс 0, переменная цикла должна изменяться в диапазоне от 0 до SIZE - 1, а не от 1 до SIZE. Однако внесение этого изменения приводит к присваиванию первому элементу значения 0, а не 2. Таким образом, цикл необходимо переписать в следующем виде:
for (index = 0; index < SIZE; index++) by_twos[index] = 2 * (index + 1);
Аналогично должны быть изменены пределы во втором цикле. Кроме того, имя массива должно сопровождаться индексом массива:
for( index = 0; index < SIZE; index++) printf("%d ", by_twos[index]);
Один из опасных аспектов неправильного указания пределов в цикле связан с тем, что программа может работать, но поскольку она помещает данные не в те ячейки памяти, куда должна, она может перестать работать в какой-то момент в будущем, формируя своего рода “мину замедленного действия”.
12. Определение должно объявить возвращаемый тип как long и содержать оператор return, который возвращает значение long.
13. Приведение типа num к long гарантирует выполнение вычислений с типом long, а не int. В системе с 16-битным int умножение двух значений типа int порождает результат, который перед возвратом значения усекается до типа int, что может приводить к потере данных.
long square(int num)
{
return ((long) num) * num;
}
804 Приложение А
14. Вывод программы имеет следующий вид:
1: Hi ! к = 1
к is 1 in the loop Now к is 3
к = 3
к is 3 in the loop Now к is 5 к = 5
к is 5 in the loop Now к is 7 к = 7
Ответы на вопросы для самоконтроля из главы 7
1. Истинным является выражение б).
2. a. number >= 90 && number < 100
б. ch != 'q' &&ch ! = 'k'
в. (number >= 1 && number <= 9) && number != 5
г. Один из возможных вариантов является ! (number >= 1 && number <= 9), но выражение number < 1 || number > 9 проще для понимания.
3. Строка 5: эта строка должна иметь вид scanf ("%d %d", &weight, Sheight) He забудьте использовать символы & в scanf(). Кроме того, этой строке должен предшествовать оператор, приглашающий ввести данные.
Строка 9: в дан ном случае подразумевается выражение (height < 72 && height > 64). Однако первая часть выражения излишня, поскольку, чтобы программа достигла строки else if, значение height должно быть меньше 72. Поэтому вполне достаточно использовать выражение (height > 64). Но строка 6 уже гарантирует выполнение этого условия, поэтому никакая дополнительная проверка вообще не требуется и выражение if else следует заменить выражением else.
Строка 11: это условие избыточно. Второе подвыражение (weight не меньше или равно 300) означает то же, что и первое. В данном случае требуется использовать простое выражение (weight > 300). Однако в этой строке присутствует значительно более серьезная ошибка. Строка 11 связана не с тем оператором if! Очевидно, что эта конструкция else предназначалась для оператора if из строки 6. Однако в соответствии с правилом связывания с ближайшим предшествующим оператором if она будет связана с оператором if строки 9. Поэтому строка 11 выполняется тогда, когда значение weight меньше 100, а значение height меньше или равно 64. В результате по достижении этого оператора значение weight никак не может превышать 300.
Строки 7-9: эти строки должны быть заключены в фигурные скобки. Тогда строка 11 станет альтернативой строке 6, а не строке 9. Или же если заменить выражение if else в строке 9 выражением else, то никакие фигурные скобки не понадобятся.
Строка 13: ее необходимо упростить до if (height > 48). В действительности эту строку можно вообще удалить, т.к. строка 12 уже делает нужную проверку.
Ответы на вопросы для самоконтроля 805
Строка 15: эта конструкция else связана с последним оператором if, указанным в строке 13. Чтобы связать это выражение с оператором if в строке 11, строки 13 и 14 потребуется поместить в фигурные скобки. Или, как было предложено ранее, можно просто избавиться от строки 13.
Вот скорректированная версия:
#include int main(void)
{
int weight.height; /* вес в фунтах, рост в дюймах */
printf("Введите свой вес в фунтах "); printf ("и свой рост в дюймах.\n" ); scanf("%d %d", &weight, sheight); if (weight < 100 && height > 64) if (height >= 72)
printf("Ваш вес слишком мал для вашего роста.\n" ); else
printf("Ваш вес мал для вашего роста.\n" ); else if (weight > 300 && height < 48)
printf ("Ваш рост мал для вашего веса.\n");
else
printf("У вас идеальный вес.\n"); return 0;
}
4. а. 1. Утверждение истинно, и численно это равно 1.
б. 0. 3 не меньше 2.
в. 1. Если первое выражение ложно, то второе истинно, и наоборот. Чтобы все выражение было истинным, достаточно истинности только одного из его подвыражений.
г. 6, поскольку значением 6 > 2 является 1.
д. 10, т.к. проверяемое условие истинно.
е. 0. Если выражение х > у истинно, то значением выражения будет у > х, которое в этом случае ложно, или равно 0. Если выражение х > у ложно, значением выражения будет х > у, которое в данном случае ложно.
Читать дальшеИнтервал:
Закладка: