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. Если выражение х > у ложно, значением выражения будет х > у, которое в данном случае ложно.
5. Программа выведет следующую строку:
*#%*#%$#%*#%*#%$#%*#%*#%$#%*#%*#%
Несмотря на присутствующие в коде отступы, символ # выводится на каждой итерации цикла, т.к. этот оператор вывода не является частью составного оператора.
6. Программа выводит следующие данные:
fat hat cat Oh no! hat cat Oh no! cat Oh no!
7. Комментарии в строках 5-7 должны завершаться символами */ либо же символы /* можно заменить символами //. Выражение 'а' <= ch >= ' z' потребуется заменить следующим выражением:
ch >= 'а' && ch <= 'z'
806 приложение А
В качестве альтернативы можно воспользоваться более простым и переносимым подходом, включив файл ctype.h и вызвав функцию islower(). Кстати, выражение 'а' <= ch >= 'z' с точки зрения синтаксиса С допустимо; оно лишь затрудняет понимание его смысла. Поскольку операции отношения ассоциируются слева направо, это выражение интерпретируется как ('а' <= ch) >= ' z '. Выражение в скобках принимает значение 1 или 0 (истинно или ложно), и это значение проверяется на предмет того, больше оно или равно числовому коду ' z'. Ни 0, ни 1 не удовлетворяют этому условию, поэтому значение всего выражения всегда равно 0 (ложно). Во втором условном выражении символы || необходимо заменить символами &&. Кроме того, хотя выражение ! (ch < 'А') является допустимым и правильным по смыслу, выражение ! (ch < 'А') проще. За выражением 'Z' должны следовать две закрывающие скобки, а не одна. Здесь снова проще воспользоваться функцией isuppert). Оператору ос++; должна предшествовать конструкция else. В противном случае он будет инкрементировать каждый символ. Управляющее выражение в printf() должно быть заключено в двойные кавычки.
Читать дальше