Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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() должно быть заключено в двойные кавычки.
Ниже показана скорректированная версия:
#include
#include int main(void)
{
char ch;
int lc = 0; /* счетчик строчных символов */
int uc = 0; /* счетчик прописных символов */
int ос = 0; /* счетчик других символов */
while ((ch = getchar()) != '#')
{
if (islower(ch)) lc + +;
else if (isupper (ch)) uc + +; else
oc + +;
}
printf("%d строчных, %d прописных, %d других", lc, uc, oc); return 0;
}
8. К сожалению, она бесконечно выводит одну и ту же строку:
Вам 65. Получите свои золотые часы.
Проблема в том, что строка
if (age = 65)
устанавливает переменную age в 65, что на каждой итерации цикла интерпретируется как истинное.
9. Результат выполнения программы с введенными значениями выглядит следующим образом:
q
Шаг 1 Шаг 2
Ответы на вопросы для самоконтроля 807
Шаг 3 c
Шаг 1 h
Шаг 1 Шаг 3 b
Шаг 1 Готово
Обратите внимание, что ввод b и # прекращает цикл, но ввод b обеспечивает вывод строки Шаг 1, а ввод # — нет.
10. Вот одно из возможных решений:
#include int main(void)
{
char ch;
while ((ch = getchar ()) != '#')
{
if (ch ! = '\n')
{
printf("Шаг 1\n"); if (ch == 'b') break;
else if (ch != 'c')
{
if (ch != 'h')
printf("Шаг 2\n"); printf("Шаг 3\n");
}
}
}
printf("Готово\n"); return 0;
}
Ответы на вопросы для самоконтроля из главы 8
1. Выражение putchar(getchar()) вынуждает программу прочитать следующий входной символ и вывести его; возвращаемое значение getchar() служит аргументом putcar(). Нет, выражение getchar(putchar()) не является допустимым, поскольку функция getchar() не принимает аргумент, а функции putcar() он необходим.
2. а. Отображает символ Н.
б. Если система использует кодировку ASCII, то этот оператор вызывает подачу звукового сигнала.
в. Перемещает курсор в начало следующей строки.
г. Вызывает затирание последнего выведенного символа и возврат курсора на один символ назад.
3. count essayct или по-другому count >essayct
808 Приложение А
4. Допустимых вариантов нет.
5. Это сигнал (специальное значение), возвращаемый функциями getchar() и scanf() для указания на то, что они обнаружили конец файла.
6. а. Вывод имеет следующий вид:
If you qu
Обратите внимание, что символ I отличается от символа i. Кроме того, символ i не выводится, т.к. выход из цикла происходит до обнаружения этого символа.
б. Если в системе применяется кодировка ASCII, то вывод будет таким:
HJacrthjacrt
При первом проходе значением переменной ch является символ Н. Операция ch++ приводит к использованию (выводу) этого значения, а затем к его инкрементированию (до I). После этого операция ++ch инкрементирует значение (до J) и применяет его (выводит). Затем читается следующий символ (а) и процесс повторяется. Важно отметить, что операции инкремента воздействуют на значение ch после присваивания значения этой переменной; они не вызывают какое-то перемещение во входной очереди.
7. Стандартная библиотека ввода-вывода С отображает различные формы файлов на унифицированные потоки, которые мшут обрабатываться одинаково.
8. Числовой ввод пропускает символы пробела и новой строки, а символьный ввод — нет. Предположим, что имеется следующий код:
int score; char grade;
printf("Введите количество баллов.\n"); scanf("%s", %score);
printf("Введите букву квалификации.\n"); grade = getchar();
Если в качестве количества баллов (score) ввести число 98 и нажать клавишу для передачи этого значения программе, то ей также будет передан символ новой строки, который станет следующим входным символом и прочитается в grade как значение рейтинга. Если числовой ввод предшествует символьному, то в программе должен быть предусмотрен код, предназначенный для отбрасывания символа новой строки перед выполнением символьного ввода.
Ответы на вопросы для самоконтроля из главы 9
1. Формальный параметр — это переменная, которая определена в вызываемой функции. Фактический аргумент — это значение, присутствующее в вызове функции; это значение присваивается формальному параметру. Фактический аргумент можно считать значением, которым инициализируется формальный параметр при вызове функции.
2. a. void donut (int n)
б. int gear (int tl, int 12)
в. int guess (void)
r. void stuff_it (double d, double *pd)
Ответы на вопросы для самоконтроля 809
3 a. char n_to_char (int n)
б. int digits (double x, int n)
в. double * which(double * p1, double * p2) г. int random (void)
4. int sum(int a, int b)
{
return a + b;
}
5. Необходимо заменить все вхождения типа int типом double: double sum(double a, double b)
{
return a + b;
}
6. В этой функции необходимо использовать указатели:
void alter(int * pa, int * pb)
{
int temp;
temp = *pa + *pb;
*pb = *pa - *pb;
*pa = temp;
}
или
void alter(int * pa, int * pb)
{
*pa += *pb;
*pb = *pa - 2 * *pb;
}
7. Да, ошибки присутствуют. Аргумент num должен быть объявлен в списке аргументов функции salami(), а не после фигурной скобки. Кроме того, вместо num++ должно быть count++.
8. Ниже показано одно возможное решение:
int largest(int а, intb, int с)
{
int max = а; if (b > max) max = b; if (с > max) max = c; return max;
}
9. Минимальная по объему кода программа приведена ниже. Функции showmenu() и getchoice() являются возможными решениями для пунктов а) и б).
#include
void showmenu(void); /* объявление используемых функций */
int getchoice(int, int); int main()
{
int res;
810 Приложение А
showmenu();
while ((res = getchoice(1,4) ) != 4)
{
printf("Меня устраивает вариант %d.\n", res); showmenu();
Читать дальшеИнтервал:
Закладка: