- •А. Нейбауэр.
- •Глава 1. Основы программирования 11
- •Глава 3. Переменные и константы 39
- •Глава 6. Операторы 103
- •Глава 13. Как собрать все вместе 253
- •Благодарности
- •Введение
- •Что вам даст эта книга
- •Программные средства
- •Глава 1. Основы программирования
- •Компьютерная программа
- •Языки программирования
- •Компиляторы
- •Интерпретатор
- •Скорость
- •Переносимость
- •Структурирование
- •Библиотеки функций
- •Необходимые пояснения
- •Что такое объектно-ориентированное программирование
- •Что Си может и чего не может
- •Этапы программирования
- •План программы
- •Текст программы
- •Компиляция программы
- •Компоновка программы
- •Тестирование программы
- •Изучение основ программирования
- •Что нужно, чтобы писать программы
- •Структура программы
- •Прописные и строчные символы
- •Инструкция return
- •Использование комментариев
- •Понятие параметров
- •Директива #include
- •Проектирование программы
- •Глава 3. Переменные и константы
- •Символьные данные
- •Целочисленные величины
- •Вещественные числа
- •Почему надо использовать целые числа?
- •Константы и переменные
- •Имена констант и переменных
- •Определение констант
- •Почему используют константы?
- •Определение переменных
- •Присваивание значения
- •Определение строковой переменной
- •Типы данных и функции
- •Литералы
- •Проектирование программы
- •Функция puts()
- •Функция putchar()
- •Двойственность символьных переменных
- •Управляющие коды
- •Код «новая строка»
- •Код «табуляция»
- •Код «возврат каретки»
- •Код «возврат на шаг»
- •Код «перевод страницы»
- •Отображение специальных символов на экране монитора
- •Многогранная функция printf()
- •Вывод чисел
- •Перевод строки
- •Преобразование типов данных
- •Форматированный вывод
- •Выбор правильных средств вывода информации
- •Проектирование программы
- •Функция gets()
- •Функция getchar()
- •«Для продолжения нажмите Enter»
- •Оператор получения адреса &
- •Функция scanf()
- •Входной поток
- •Использование функции scanf()
- •Выбор соответствующих средств ввода данных
- •Будьте осторожны при использовании scanf()
- •Неинициализированные переменные
- •Используемые алгоритмы ввода
- •Глава 6. Операторы
- •Арифметические операторы
- •Деление нацело
- •Типыданныхи операторы
- •Выражения
- •Приоритет операторов и порядок вычислений
- •Используемые алгоритмы обработки данных
- •Счетчики
- •Операторы инкремента
- •Аккумуляторы
- •Операторы присваивания
- •Присваивание начального значения
- •Проектирование программы
- •Остерегайтесь логических ошибок
- •Ищите образцы
- •Диагностические проблемы
- •Глава 7. Для чего нужны функции
- •Как использовать функции
- •Переменные в функциях
- •Автоматические (локальные) переменные
- •Внешние (глобальные) переменные
- •Статические переменные
- •Передача параметров
- •Возвращаемые значения
- •Возврат значений типа float
- •Использование return() в функции main()
- •Использование макроопределений
- •Проектирование программы
- •Автоматические или внешние переменные?
- •Неправильный ввод
- •Глава 8. Позвольте компьютеру принимать решения
- •Условия
- •Составные инструкции
- •Конструкция if...Else
- •Дополненный Опросник
- •Логические операторы
- •Вложенные инструкции if
- •Конструкция switch/case/default
- •Проверка чисел с плавающей точкой и строк
- •Проектирование программы
- •Проверка правильности ввода
- •Глава 9. Циклы
- •Использование цикла for
- •Создание паузы в программе
- •Составные инструкции
- •Использование переменных
- •Вложенные циклы
- •Использование цикла do...While
- •Вложенные циклы do
- •Использование цикла while
- •Комбинирование циклов разных типов
- •Проектирование программы
- •Использование флагов
- •Использование инструкции break
- •Глава 10. Массивы и строки
- •Массивы
- •Определение массива
- •Ввод значений в массив
- •Работа с массивами
- •Просмотр массива
- •Поиск в массиве
- •Передача массива функции
- •Использование массивов
- •Сравнение двух строк
- •Определение длины строки
- •Присваивание строк
- •Слияние строк
- •Массивы строк
- •Проектирование программы
- •Глава 11. Структуры и указатели
- •Использование структур
- •Определение структуры
- •Определение структурных переменных
- •Присвоение начального значения
- •Использование структуры
- •Массивы структур
- •Структуры и функции
- •Указатели
- •Указатели и функции
- •Глава 12. Вывод на диск и принтер
- •Что такое файловая структура
- •Указатель на файл
- •Как открыть файл
- •Как избежать ошибок выполнения
- •Как закрыть файл
- •Функции ввода и вывода
- •Работа с символами
- •Посимвольное чтение из файла
- •Работа со строками
- •Чтение строк
- •Форматированный ввод и вывод
- •Чтение форматированных файлов
- •Работа со структурами
- •Чтение структур
- •Чтение в массив
- •Дополнение файла новыми данными
- •Текстовый и двоичный форматы
- •Двоичный формат
- •Печать данных
- •Проектирование программы
- •Глава 13. Как собрать все вместе
- •Прикладная программа
- •Глобальные определения
- •Функция main()
- •Добавление записей: функция addcd()
- •Удаление записи: функция delcd()
- •Редактирование данных: функция chcd()
- •Изменение номера ячейки: функция chloc()
- •Вывод записи на экран: функция locate()
- •Печать записей: функция plist()
- •Сортировка записей: функция sort()
- •Приложение I Ответы и решения Глава 1. Основы программирования.
- •Глава 3. Переменные и константы.
- •Глава 6. Операторы.
- •Глава 7. Для чего нужны функции.
- •Глава 8. Позвольте компьютеру принимать решения.
- •Глава 9. Циклы.
- •Глава 10. Массивы и строки.
- •Глава 11. Струтуры и указатели.
- •Глава 12. Вывод на диск и принтер.
- •Приложение II Прикладная программа
Глава 10. Массивы и строки.
1.Напишите программу, в которой массивы используются для хранения имен, адресов и номеров телефонов 20 человек.
main()
{
char names[20][20], street[20][20],
city[20][20];
char state[20][3], zip[20][6],
phone[20][13], lookfor[20];
int count;
for(count=0;count<20;count++)
{
puts("Введите имя");
gets(names[count]);
puts("Введите название улицы");
gets(street[count]);
puts("Введите город");
gets(city[count]);
puts("Введите штат");
gets(state[count]);
puts("Введите индекс");
gets(zip[count]);
puts("Введите номер телефона");
gets(phone[count]);
}
}
2.Внесите в программу из упражнения 1 изменения так, чтобы иметь возможность ввода имени и последующего просмотра массива в поисках номера телефона соответствующего человека.
main()
{
char names[20][20], street[20][20],
city[20][20];
char state[20][3], zip[20][6],
phone[20][13], lookfor[20];
int count;
for(count=0;count<20;count++)
{
puts("Введите имя: ");
gets(names[count]);
puts("Введите название улицы: ");
gets(street[count]);
puts("Введите город: ");
gets(city[count]);
puts("Введите штат: ");
gets(state[count]);
puts("Введите индекс: ");
gets(zip[count]);
puts("Введите номер телефона: ");
gets(phone[count]);
}
puts("Введите имя: ");
gets(lookfor);
for(count=0; count<20;count++)
{
if(strcmp(names[count],lookfor)==0)
printf("%s %s\n", names[count],
phone[count]);
}
}
3.Объясните, почему следующая программа написана неправильно:
main()
{
int temps(31);
int index, total;
for (index = 0; index < 31; index++)
{
printf("Введите значение
температуры #%d: ", index);
scanf("%d", &temps(index));
}
high = temps(0);
low = temps(0); index = 1;
while (index < 31)
{
if (temps(index) > high)
high = temps(index);
else
low = temps(index);
index++;
}
printf("Минимальное значение
температуры равно %d\n", low);
printf("Максимальное значение
температуры равно %d\n", high);
}
Индексы всех элементов массива temps заключены в круглые скобки, вместоквадратных. Переменные high и low не определены. Переменная total определена, но не используется в программе. Конструкция if...else написана с ошибкой: если рассматриваемое значение не превышает текущее значение переменной high, это не значит, что оно непременно меньше текущего значения переменной low.
Глава 11. Струтуры и указатели.
1.Напишите программу, в которой структура используется для составления инвентарной описи. Информация включает в себя название продукта, цену, количество, имя поставщика.
struct product
{
char name[20];
float cost;
int quantity;
char vendor[20];
} item;
main()
{
puts("Введите сведения о товаре\n\n");
printf("Введите наименование:");
gets(item.name);
printf("Введите цену:");
scanf("%f", &item.cost);
printf("Введите количество единиц:");
scanf("%d", &item.quantity);
printf("Введите имя поставщика:");
gets(item.vendor);
}
2.Внесите изменения в программу из упражнения 1 с тем, чтобы можно было вводить информацию в массив структур, состоящий из 20 элементов.
struct product
{
char name[20];
float cost;
int quantity;
char vendor[20];
} item[20];
main()
{
int count;
for(count=0;count<20;count++)
{
puts("\nВведите сведения о товаре\n\n");
printf("Введите наименование:");
gets(item[count].name);
printf("Введите цену:");
scanf("%f", &item[count].cost);
printf("Введите количество единиц:");
scanf("%d", &item[count].quantity);
printf("Введите имя поставщика:");
gets(item[count].vendor);
}
}
3.Внесите изменения в программу из упражнения 2 так, чтобы выводить на экран общую стоимость включенных в опись товаров.
struct product
{
char name[20];
float cost;
int quantity;
char vendor[20];
} item[20];
main()
{
float total;
int count;
total=0;
for(count=0;count<20;count++)
{
puts("\nВведите сведения о товаре\n\n");
printf("Введите наименование: ");
gets(item[count].name);
printf("Введите цену: ");
scanf("%f", &item[count].cost);
printf("Введите количество единиц: ");
scanf("%d", &item[count].quantity);
printf("Введите имя поставщика: ");
gets(item[count].vendor);
total = total + (item[count].cost *
item[count].quantity);
}
printf("Общая стоимость включенных в опись \
товаров составляет %8.2f", total);
}
4.Напишите программу, в которой две переменные типа float определяются в main() как локальные, а затем используются в функции, вычисляющей квадраты обоих чисел.
main()
{
float num1, num2;
puts("Введите первое число");
scanf("%f",&num1);
puts("Введите второе число");
scanf("%f",&num2);
doubleit(&num1, &num2);
}
doubleit(dcount1, dcount2)
float *dcount1, *dcount2;
{
float sq1, sq2;
sq1 = *dcount1 * *dcount1;
sq2 = *dcount2 * *dcount2;
printf("Квадрат %f равен %f\n",*dcount1, sq1);
printf("Квадрат %f равен %f\n",*dcount2, sq2);
}
Для того чтобы вернуть значения вызывающей функции, используйте следующую программу:
main()
{
float num1, num2;
puts("Введите первое число");
scanf("%f",&num1);
puts("Введите второе число");
scanf("%f",&num2);
doubleit(&num1, &num2);
printf("Квадрат первого числа равен %f\n", num1);
printf("Квадрат второго числа равен %f", num2);
}
doubleit(dcount1, dcount2)
float *dcount1, *dcount2;
{
float sq1, sq2;
*dcount1 = *dcount1 * *dcount1;
*dcount2 = *dcount2 * *dcount2;
}
5.Объясните, почему следующая программа написана неверно:
main()
{
struct CD
{
char description[40];
char category[12];
char name[20];
float cost;
int number;
} disc;
puts("Введите сведения о диске");
printf("Введите название: ");
gets(name);
printf("Введите описание: ");
gets(description);
printf("Введите категорию: ");
gets(category);
printf("Введите цену: ");
scanf("%f", &cost);
printf("Введите номер ячейки: ");
scanf("%d", &number);
puts("Введена следующая информация о диске: ");
printf("Название: %s\n", name);
printf("Описание: %s\n", description);
printf("Категория: %s\n", category);
printf("Цена: %6.2f\n", cost);
printf("Номер п/п: %d\n", number);
}
Ко всем переменным, используемым в инструкциях ввода и вывода, обращение происходит без использования имени структурной переменной.
К переменным следует обращаться как к disc.name, disc.description и так далее.