Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Сведения о гражданине ind1



Фамилия, имя, отчество: Алексеев Сергей Петрович

Год рождения – 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; Прочитано: 258 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.018 с)...