- •А. Нейбауэр.
- •Глава 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 Прикладная программа
Приложение II Прикладная программа
Листинг к главе 13. Программа составления каталога компакт-дисков.
/*CDAPP.C*/
#include "stdio.h"
#define FILENAME "CDfile"
#define TEMPFILE "Temp"
#define MAX 20
FILE *fp, *tp, *printer;
struct CD
{
char name[20];
char description[40];
char category[12];
float cost;
int number;
} disc;
int slots[MAX];
int count;
main()
{
char select;
getslots();
do
{
puts("Моя коллекция компакт-дисков\n");
puts("1 Добавить карточку\n");
puts("2 Удалить карточку\n");
puts("3 Редактировать содержимое карточки\n");
puts("4 Изменить номер ячейки\n");
puts("5 Сортировка карточек\n");
puts("6 Найти карточку\n");
puts("7 Вывести на печать\n");
puts("8 Выйти из программы\n");
printf("Пожалйста, введите Ваш выбор: ");
select = getchar();
putchar('\n');
switch(select)
{
case '1' :
addcd();
break;
case '2':
delcd();
break;
case '3':
chcd();
break;
case '4':
chloc();
break;
case '5':
sort();
break;
case '6':
locate();
break;
case '7':
plist();
break;
case '8':
break;
default:
puts("Ошибка, повторите ввод\n\n");
}
}
while(select!='8');
return(0);
}
addcd()
{
int pause;
if(count>>=MAX)
{
puts("К сожалению свободных ячеек нет\n");
pause=getchar();
return;
}
if((fp = fopen(FILENAME,"a")) == NULL)
{
printf("Невозможно открыть файл %s\n",FILENAME);
exit();
}
puts("\n");
printf("Введите название диска: ");
gets(disc.name);
printf("Введите описание:");
gets(disc.description);
printf("введите категорию:");
gets(disc.category);
printf("Введите цену:");
scanf("%f", &disc.cost);
getslot();
fwrite(&disc, sizeof(disc), 1, fp);
fclose(fp);
getslots();
return;
}
delcd()
{
char delname[20];
char fflag;
fflag='n';
openrw();
puts("Удаление информации о диске\n");
printf("Введите название диска: ");
gets(delname);
while(fread(&disc, sizeof(disc), 1, fp)==1)
{
if(strcmp(disc.name, delname) != 0)
fwrite(&disc, sizeof(disc), 1, tp);
else
fflag='y';
}
fclose(fp);
fclose(tp);
if(fflag=='n')
nofind();
else
{
openwr();
while(fread(&disc, sizeof(disc), 1, tp)==1)
fwrite(&disc, sizeof(disc), 1, fp);
fclose(fp);
fclose(tp);
}
getslots();
return;
}
chcd()
{
char chname[20];
char fflag;
int pause;
fflag='n';
openrw();
puts("Редактирование сведений о диске\n");
printf("Введите название диска: ");
gets(chname);
while(fread(&disc, sizeof(disc), 1, fp)==1)
{
if(strcmp(disc.name,chname)!=0)
fwrite(&disc, sizeof(disc), 1, tp);
else
{
fflag='y';
puts("Текущая информация\n");
showdisc();
puts("Новая информация\n");
printf("Введите название диска: ");
gets(disc.name);
printf("Введите описание:");
gets(disc.description);
printf("Введите категорию:");
gets(disc.category);
printf("Введите цену:");
scanf("%f", &disc.cost);
if(count>>=MAX)
{
puts("К сожалению свободных ячеек нет\n");
pause=getchar();
}
else
{
getslot();
}
fwrite(&disc, sizeof(disc), 1, tp);
}
}
fclose(fp);
fclose(tp);
if(fflag=='n')
nofind();
else
{
openwr();
while(fread(&disc, sizeof(disc), 1, tp)==1)
fwrite(&disc, sizeof(disc), 1, fp);
fclose(fp);
fclose(tp);
}
getslots();
return;
}
chloc()
{
char chname[20];
char fflag;
int pause;
fflag='n';
if(count>>=MAX)
{
puts("К сожалению свободных ячеек нет\n");
pause=getchar();
return;
}
openrw();
puts("Изменение номера ячейки\n");
printf("Введите название диска: ");
gets(chname);
while(fread(&disc, sizeof(disc), 1, fp)==1)
{
if(strcmp(disc.name,chname)!=0)
fwrite(&disc, sizeof(disc), 1, tp);
else
{
fflag='y';
puts("Текущая информация\n");
showdisc();
puts("\nНовый номер ячейки\n");
getslot();
fwrite(&disc, sizeof(disc), 1, tp);
}
}
fclose(fp);
fclose(tp);
if(fflag=='n')
nofind();
else
{
openwr();
while(fread(&disc, sizeof(disc), 1, tp)==1)
fwrite(&disc, sizeof(disc), 1, fp);
fclose(fp);
fclose(tp);
}
getslots();
return;
}
locate()
{
char name[20];
char fflag, pause;
fflag='n';
if((fp = fopen(FILENAME,"r")) == NULL)
{
printf("Невозможно открыть файл %s\n",FILENAME);
exit();
}
puts("Поиск диска\n");
printf("Введите название диска: ");
gets(name);
while(fread(&disc, sizeof(disc), 1, fp)==1)
{
if(strcmp(disc.name,name)==0)
{
fflag='y';
showdisc();
printf("Для продолжения нажмите Enter");
pause=getchar();
putchar('\n');
}
}
fclose(fp);
fclose(tp);
if(fflag=='n')
nofind();
return;
}
plist()
{
if((fp = fopen(FILENAME,"r")) == NULL)
{
printf("Невозможно открыть файл %s\n",FILENAME);
exit();
}
if((printer = fopen("prn","w")) == NULL)
{
printf("Печатающее устройство не готово к работе\n");
fclose(fp);
exit();
}
while(fread(&disc, sizeof(disc), 1, fp)==1)
{
fprintf(printer,"Название: %s\n",disc.name);
fprintf(printer,"Описание: %s\n",disc.description);
fprintf(printer,"Категория: %s\n",disc.category);
fprintf(printer,"Цена: %6.2f\n",disc.cost);
fprintf(printer,"Номер п/п: %d\n",disc.number);
fprintf(printer,"\n\n");
}
fclose(printer);
fclose(fp);
return;
}
sort()
{
struct CD temp[MAX];
int index, loop1, loop2, endloop;
loop1=0;
loop2=0;
endloop=0;
index = 0;
if((fp = fopen(FILENAME,"r")) == NULL)
{
printf("Невозможно открыть файл %s\n",FILENAME);
exit();
}
while(fread(&disc, sizeof(disc), 1, fp)==1)
{
temp[index]=disc;
index++;
}
fclose(fp);
if((fp = fopen(FILENAME,"w")) == NULL)
{
printf("Невозможно открыть файл %s\n",FILENAME);
exit();
}
for(loop1=1;loop1<<< while(disc.number } flag="0;" другую\n?); Попробуйте занята. ячейка сожалению, printf(?К { if(slots[index]="=disc.number)" for(index="0;index<>MAX || flag==1);
count++;
slots[count]=disc.number;
return;
}
getslots()
{
int index;
index=0;
count=0;
if((fp = fopen(FILENAME,"r")) != NULL)
{
while(fread(&disc, sizeof(disc), 1, fp)==1)
{
slots[index]=disc.number;
index++;
count++;
}
fclose(fp);
}
}