Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Фамилия, имя, отчество: Алексеев Сергей Петрович
Год рождения – 1978
Месяц рождения – 5-й
День рождения – 3-й
В следующей программе рассмотрим использование структуры в виде элементов массива pibm. Каждый элемент состоит из следующих компонентов: mem (память), sp (объем винчестера), model [20] (модель ПЭВМ):
/* Массивы записей */
#include < stdio.h >
struct computer { int mem, sp;
char model [20];
pibm [10];};
/* объявление записи типа computer;
объявление массива pibm типа computer */
main ()
{ int i, j, k, priz;
for (i=0; i<10; i++)
{ printf (“Введите сведения о ПЭВМ %d и признак (0-конец;
\n другая цифра- продолжение)\n”, i);
printf (“ модель ПЭВМ - ”);
scanf (“%S”, &pibm [i].model);
printf (“объем оперативной памяти -”);
scanf (“%d”, &pibm[i].mem);
printf (“ объем винчестера - ”);
scanf (“%d, &pibm[i].sp ”);
printf (“признак - ”);
scanf (“ %d ”, &priz);
k=i;
if (!priz) break; }
/* Здесь!priz – операция отрицания priz; break – выход из цикла for, если priz=0 */
for (i=0; i<10, i++);
{
printf (“\n О какой ПЭВМ Вы хотите получить сведения?\n (Введите номер от 0 до 9)\n”);
scanf (“%d ”,&j);
if (j>k)
{ printf (“Нет сведений об этой ПЭВМ \n”);
continue; }
printf (“ персональная ЭВМ %s\n ”, pibm[j].model);
printf (“объем оперативной памяти - % d Мб \n ”, pibm[j].mem);
printf (“объем винчестера - % d Мб \n ”, pibm[j].sp);
printf (“ признак – “);
scanf (“ %d ”, &priz);
if (!priz) break; }
/* Ввод сведений о ПЭВМ и занесение в массив pibm записей типа computer (первый
цикл for); вывод на экран сведений о ПЭВМ (второй цикл for) */
}
Результаты работы программы:
Введите сведения о ПЭВМ и признак (0-конец; другая цифра – продолжение)
модель ПЭВМ – АТ 486 SX
объем оперативной памяти – 32
объем винчестера – 4 Гбайта
признак – 1
Введите сведения о ПЭВМ и признак (0-конец; другая цифра – продолжение)
модель ПЭВМ – АТ 386 DX
объем оперативной памяти – 64
объем винчестера – 14 Гбайт
признак – 0
О какой ПЭВМ Вы хотите получить сведения? (Введитн номер от 0 до 9)
модель ПЭВМ – АТ 386 DX
объем оперативной памяти – 16 Мб
объем винчестера – 2,5 Гбайт
признак – 0
Тема 7: Препроцессорные средства.
1. Директива # include, # define, # undef.
Транслятор СИ имеет встроенное средство, расширяющее возможности языка и называемое препроцессором. Он рассматривает программу до компиляции (отсюда и термин препроцессор) и заменяет символические аббревиатуры в программе на соответствующие директивы, подключает указанные файлы. Для препроцессора строки программы, начинающиеся с символа #.
Его команда:
# include “имя файла”
уже использовалась в работе, связанной с процедурами, для подключения файлов.
Рассмотрим другую директиву препроцессора
# define <идентификатор> <подстановка>
# define FOOR TWO*TWO
# define PX printf(“x равен %d\n”,x)
#define FNT “x равен % d\n”
Эта директива вызывает замену в последующем тексте названного идентификатора на текст подстановки.
Если директива имеет вид:
# define идентификатор (идентификатор,…идентификатор)
то это определение макроподстановки с аргументами. Её использование рассматривается ниже на примерах.
Пример 1.
# include<stdio.h>
# define TWO 2
main ()
{ int x=TWO;
PX;
printf(FNT,X);
}
После выполнения программы на экран будет выведена следующая информация:
Х равен 2
Х равен 4
Рассмотрим подробно, что произошло при выполнении программы.
Оператор
int x=TWO; превращается в int x=2;
Т.е. слово TWO заменилось цифрой 2
Оператор
PX; превращается в printf(“x равно %d\n”,x);
Оператор
x=FOOR; превращается в x=TWO*TWO.
а далее в х=2*2;
Оператор
printf(FNT,X);превращается в printf(“x равен %d\n”,x);
Рассмотрим пример директивы # define с аргументами. Работать с такими директивами нужно внимательно, в противном случае можно получить неожиданные результаты.
Покажем это на примере:
Пример 2.
# include<stdio.h>
# define SQUARE(X) X*X
# define PR(X) printf(“X равен %d\n”,X)
main ()
{ int x=4;
int z;
z=SQUARE(x);
PR(z);
PR(SQUARE(z));
PR(SQUARE(x+2));
pr(100/SQUARE(2));
}
Всюду, где в программе SQUARE(x) оно заменяется на x*x.
Результат работы программы:
z равно 16
Z равно 4
SQUARE (x+2) равно 14
100/SQUARE (2) равно 100
Первые две строки предсказуемы. Заметим, что даже внутри кавычек в определении PR переменная замещается соответствующим аргументом.
Строка
PR(SQUARE (x));
замещается на следующую
printf(“SQUARE(x) равно %d\n”,SQUARE (x));
после первого этапа макрорасширения. Второе SQUARE (х) превращается в Х*Х, а первое остаётся без изменении, потому что теперь находится внутри кавычек в операторе программы и защищено от дальнейшего расширения. Окончательно строка программы содержит printf(“SQUARE (x) равно %d\n”,X*X); и выводит на экран.
SQUARE (х) равно 16
Теперь мы добрались до несколько специфических результатов.
Вспомним, что Х имеет значение 4. Это позволяет предположить, что SQUARE (Х+2) будет равно 6*6 или 36. Но напечатанный результат говорит, что получается 14. Причина этого несоответствия состоит в том, что препроцессор не делает вычислении, он только замещает сторону, таким образом, везде вместо Х будет подставлено Х+2. Значит Х*Х ставится Х+2*Х+2. Если Х равен 4, то 4+2*4+2=14
Если всё-таки требуется, чтобы SQUARE (х+2) было равно 36, то необходимо записать так:
# define SQUARE(X) (X)*(X)
Тогда SQUARE (Х+2) становится (Х+2)*(Х+2), и мы получим желаемый результат.
Рассмотрим следующий результат. Выражение 100/SQUARE (Х) превращается в 100/2*2, т.е. равно 100.
Эту путаницу можно исправить, определив SQUARE (Х) следующим образом
# define SQUARE (X) (X)*(X)
это даёт 100/(2*2)
Чтобы выполнить два последующих примера, нам необходимо определение
# define SQUARE (Х) (Х)*(Х)
Пример 3. В приведённой программе открывающая и закрывающая фигурные скобки заменены словами begin и end. Определены также другие названия для функции ввода-вывода. В результате получилось что-то среднее между программой на Паскале и СИ. Таким образом, пользователь, работающий с другим языком может строить привычные для себя конструкции.
# include <stdio.h>
# define write(valw) printf(“%d”,valw) /*выполняется замена строки write(valw) на строку printf(“%d”,valw)*/
# define read(valr) scanf (“%d”,$valr) /* выполняется замена строки read(valr) на строку scanf(“%d”,&valr)*/
# define begin { /* выполняется замена слова begin на скобку {*/
# define end } /* выполняется замена слова end на скобку }*/
main ()
{begin
int i;
read (i); /*вводится с клавиатуры значение переменной i */
write (i); /*выводится на экран значение i */
end
}
Директива #undef отменяет самое последнее определение поименованного макроопределения. Она имеет следующий вид:
#undef идентификатор
где идентификатор – идентификатор, ранее определённый в директиве #define. Например:
#undef ESCAPE
после выполнения этой процедуры идентификатор ESCAPE становится неопределённым.
2. Директивы #if, #ifdef, #ifndef, #else, #endif.
Директивы. рассматриваемые в этом разделе позволяют выполнить условную компиляцию. Условная компиляция- это выборная компиляция только тех частей программы, которые удовлетворяют некоторым условиям. Одна из целей условной компиляции - сделать программу более мобильной. Изменяя несколько ключевых определений в начале файла, вы можете устанавливать различные значения и включать различные файлы для разных систем; таким образом, ненужный код не хранится в памяти во время выполнения. Решение о включении той или иной части программы применяется на этапе компиляции, а не во время выполнения.
Директива #if похожа на обычный оператор if:
#if константное выражение.
Она проверяет, будет ли отличаться от нуля выражение, составленное и константное. Выражение истинно, если оно не равно нулю. Например:
#if sys==”IBM”
#include “ibm.h”
#endif
Как видно из примера, оно заканчивается директивой #endif.
Директива
#ifdef идентификатор
Устанавливает, определён ли в данный момент идентификатор, т.е. входил ли он в команду вида #define.
Директива
#ifndef идентификатор
проверяет, не определен ли в данный момент, указанный идентификатор.
Например:
#ifndef SIZE
#define SIZE 128
#endif
В результате переменная SIZE получает значение 128, если ранее она не была определена программистом. За любой из перечисленных выше директив может следовать произвольное количество строк.
Указанные директивы могут быть применены вместе с инструкцией #else/ Назначение этой инструкции такое же, как и в условном операторе. Рассмотрим пример.
#ifdef MAVIS
#include “horse.h”
#define STABLE 5
#else
#include “cow.h”
#define STABLE 15
#endif
Директива #ifdef сообщает, что если идентификатор MAVIS определен препроцессором, то выполняются все последующие директивы вплоть до #else. В противном случае будут выполнены директивы, стоящие после #else до директивы #endif.
Тема 8: файлы в С++.
Дата публикования: 2014-11-28; Прочитано: 259 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!