11 (1106248)
Текст из файла
Курс «Алгоритмы и алгоритмические языки»1 семестр 2013/2014Лекция 111Приоритеты операцийОперацииАссоциативность( ) [ ] -> .Слева направо! ~ ++ -- + - sizeof (type) * &Справа налево* / %Слева направо+ -Слева направо<< >>Слева направо< <= > >=Слева направо== !=Слева направо&Слева направо^Слева направо|Слева направо&&Слева направо||Слева направо?:Справа налево= += -= *= /= %= &= ^= |= <<= >>=Справа налево,Слева направо2ОбъединенияОбъединение – это объект, который можетсодержать значения различных типов (но неодновременно – только одно в каждый момент)struct constant{int ctype;union{int i;float f;char *s;} u;} sc;switch (sc.ctype){case CI:printf("%d",sc.u.i);break;case CF:printf("%f",sc.u.f);break;case CS: puts(sc.u.s);}Размер объединения достаточно велик, чтобысодержать максимальный по размеру элементМожно выполнять те же операции, что и соструктурами3Анонимные объединения и структуры (С11)Для вложенных структур и объединений разрешеноопускать тег для повышения читаемостиstruct constant{int ctype;union{int i;float f;char *s;};} sc;switch (sc.ctype){case CI:printf("%d",sc.i);break;case CF:printf("%f",sc.f);break;case CS: puts(sc.s);}Поля анонимной структуры считаютсяпринадлежащими родительской структуре(если родительская также анонимна – то следующейродительской структуре и т.п.)4Битовые поляДля экономии памяти можно точно задать размерполя в битах (например, набор флагов)struct tree_base {unsigned code : 16;unsigned side_effects_flag : 1;unsigned constant_flag : 1;<...>unsigned lang_flag_0 : 1;unsigned lang_flag_1 : 1;<...>unsigned spare : 12;}Адрес битового поля брать запрещеноМожно объявить анонимные поля (для выравнивания)Можно объявить битовое поле ширины 0 (для перехода5на следующий байт)ПеречисленияПеречисления – целочисленные типы данных,определяемые программистом.Определение перечисления:enum имя_типа { имена значений };enum colors {red, orange, yellow, green,azure, blue, violet};Значения перечисления нумеруются с 0, но можноприсваивать свои значенияenum {red, orange = 23, yellow = 23,green, cyan = 75, blue = 75, violet};Доступны операции над целочисленными типами иобъявление указателей на переменныеперечислимых типовПроверка корректности присваиваемых значений6не производитсяПрограмма: вычисление площадей фигурФигура определяется общей структурой, в которойобъединены различные конкретные структуры дляопределенных фигур и поле тега фигурыИспользуется перечисление для задания возможныхтипов фигурИспользуется адресная арифметика для обходамассива считанных фигурДля обработки фигуры используется операторвыбора по тегу фигуры7Программа: типы данныхenum figure_tag {CIRCLE,RECTANGLE,TRIANGLE,LAST_FIGURE};struct point {double x, y;};struct fcircle {struct point center;double radius;};struct frectangle {struct point ll, ur;};8Программа: типы данныхstruct ftriangle {struct point a, b, c;};struct figure {enum figure_tag tag;union {struct fcircle fc;struct frectangle fr;struct ftriangle ft;} u;};struct farea {double min, max;int initialized : 1;};9Программа: основная функцияint main (void) {enum { MAXFIG = 128 };struct figure figs[MAXFIG + 1];struct farea areas[LAST_FIGURE];int i = 0;while (i < MAXFIG)if (!read_figure (&figs[i]))break;elsei++;if (i == 0)return 1;<...
Обработка данных и вывод ...>}10Программа: основная функцияint main (void) {enum { MAXFIG = 128 };struct figure figs[MAXFIG + 1];struct farea areas[LAST_FIGURE];int i = 0;<... Считывание данных ...>figs[i].tag = LAST_FIGURE;for (i = CIRCLE; i < LAST_FIGURE; i++) {areas[i].initialized = 0;calculate_minmax_areas (i, figs, &areas[i]);output_minmax_areas (i, &areas[i]);}return 0;}11Программа: подсчет площадиstatic void calculate_minmax_areas (enum figure_tag tag,struct figure *f, struct farea *fa) {for (; f->tag != LAST_FIGURE; f++)if (f->tag == tag) {double a = calculate_area (f);if (!fa->initialized) {fa->min = fa->max = a;fa->initialized = 1;} else {if (a < fa->min)fa->min = a;if (a > fa->max)fa->max = a;}}}12Программа: подсчет площадиstatic double calculate_area (struct figure *f) {double a = 0.0;switch (f->tag) {case CIRCLE: a = f->u.fc.radius * f->u.fc.radius *M_PI; break;case RECTANGLE: a = fabs ((f->u.fr.ll.x –f->u.fr.ur.x) * (f->u.fr.ll.y - f->u.fr.ur.y));break;case TRIANGLE: <...>default: assert (0);}return a;}13Программа: подсчет площадиstatic double calculate_area (struct figure *f) {double a = 0.0;switch (f->tag) {<...>case TRIANGLE: {double x1, y1, x2, y2;x1 = f->u.ft.b.x - f->u.ft.a.x;y1 = f->u.ft.b.y - f->u.ft.a.y;x2 = f->u.ft.c.x - f->u.ft.a.x;y2 = f->u.ft.c.y - f->u.ft.a.y;a = fabs (x1 * y2 - x2 * y1) / 2;break;}<...>}return a;}14Программа: вводstatic int read_figure (struct figure *f) {char name;if (scanf (" %c", &name) != 1)return 0;switch (toupper (name)) {case 'C': f->tag = CIRCLE; break;case 'R': f->tag = RECTANGLE; break;case 'T': f->tag = TRIANGLE; break;default: return 0;}<...>return 1;}15Программа: вводstatic int read_figure (struct figure *f) {<...>switch (f->tag) {case CIRCLE: if (scanf ("%lf%lf%lf", &f->u.fc.center.x,&f->u.fc.center.y, &f->u.fc.radius) != 3)return 0;break;case RECTANGLE: if (scanf ("%lf%lf%lf%lf",&f->u.fr.ll.x, &f->u.fr.ll.y, &f->u.fr.ur.x,&f->u.fr.ur.y) != 4)return 0;break;case TRIANGLE: if (scanf ("%lf%lf%lf%lf%lf%lf",&f->u.ft.a.x, &f->u.ft.a.y, &f->u.ft.b.x,&f->u.ft.b.y, &f->u.ft.c.x, &f->u.ft.c.y) != 6)return 0;break;16}Программа: вывод и заголовочные файлы#include <stdio.h>#include <ctype.h>#include <math.h>#include <assert.h>static void output_minmax_areas (enum figure_tag ft,struct farea *fa) {static char *fnames[LAST_FIGURE] = {"CIRCLE","RECTANGLE", "TRIANGLE"};if (!fa->initialized)printf ("No figures of type %s were met\n",fnames[ft]);else {printf ("Minimal area of %s(s): %.5f\n", fnames[ft],fa->min);printf ("Maximal area of %s(s): %.5f\n", fnames[ft],fa->max);}17}.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.