Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие ОАиП.doc
Скачиваний:
11
Добавлен:
25.04.2019
Размер:
2.63 Mб
Скачать

Примеры программ

Пример . Среди абитуриентов, сдавших вступительные экзамены в институт, определить количество абитуриентов, проживающих в городе Минске и сдавших экзамены со средним баллом не ниже 8, распечатать их фамилии в алфавитном порядке.

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#include<string.h>

#define n 3

int main()

{ struct str

{ char *gr; // город

char fm[15]; //фамилия

int oc[3];

} s[n];

int i,j,k=0;

char c;

clrscr();

printf("\nВведите информацию в массив структур");

for(i=0;i<n;i++) // цикл ввода структур в массив

{ printf("\n введите город :");

fflush(stdin);

s[i].gr=(char *)malloc(10); //отводим память для ввода города

gets(s[i].gr); //ввод города

if (!*s[i].gr) break; // выход по пустой строке

printf("\n введите фамилию :");

gets(s[i].fm); //ввод фамилии

printf("\n введите оценки (ф м л) :");

scanf("%d%d%d",s[i].oc,s[i].oc+1,s[i].oc+2);

}

i--; // последняя стр-ра s[i] - пустая или i==n

for(c='А';c<='Я';c++)

for(j=0;j<=i;j++)

if(!strcmp(s[j].gr,"Минск") && s[j].fm[0]==c)

if((s[j].oc[0]+s[j].oc[1]+s[j].oc[2])/3>=8)

{ printf("\n%s",s[j].fm);

k++; // подсчет числа абитуриентов удовл. условию задачи

}

printf("\n Итого абитуриентов = %d",k);

return 0;

}

Пример . вложенных структур

#include <stdio.h>

#define DL 30 // max число символов в строке char

struct name

{ char fm[DL]; // фамилия

char im; // имя

char ot; // отчество

};

struct inform

{ name nm; // переменная типа на структура name

char prof[DL]; // профессия

int god; // год рождения

float okl; // оклад

};

int main()

{ static inform mas[4]=

{ "Иванов",'И','И',"конструктор",1989,15000.50,

"Петров",'П','П',"оператор",1987,12350.50};

inform *him; // указатель на структуру inform

printf("адрес mas[0]: %u mas[1]: %u \n",&mas[0],&mas[1]);

him=mas; // him содержит адрес mas[0]

printf("адрес mas[0]: %u mas[1]: %u \n",him,him+1);

printf("him->okl = %.2f (*him).okl = %.2f \n",him->okl,(*him).okl);

him++; // him содержит адрес следующей стр-ры mas[1]

(++him)->okl++; // him->okl==12351.5

printf("him->okl = %.2f (*him).okl = %.2f \n",him->okl,(*him).okl);

him--;

printf("him->nm.fm = %.20s (*him).nm.fm = %.20s \n",

(him)->nm.fm,(*--him).nm.fm);

// в этом случае выполняется переход к mas[0]-----------┘

// затем вывод -------------------------------┘

return 0;

}

Пример . Нахождение площади прямоугольной фигуры по двум точкам с координатами (x1,y1) и (x2,y2).

#include <stdio.h>

#include <conio.h>

struct rect analiz(struct rect); // здесь наличие слова struct обязательно

void swap(int n,struct rect *);

struct point

{ int x; // структура point описывает координаты

int y; // (x и y) точки на плоскости

};

struct rect

{ point p1; // структура rect описывает координаты

point p2; // 2 угловых точек (прямоуг-ка, квадрата)

};

int main()

{ rect pt;

int s;

do

{ clrscr();

puts("введите координаты левого нижнего угла фигуры");

scanf("%d%d",&pt.p1.x,&pt.p1.y);

puts("введите координаты правого верхнего угла фигуры");

scanf("%d%d",&pt.p2.x,&pt.p2.y);

pt=analiz(pt); // анализ и коррекция координат угловых точек

} while(pt.p1.x>pt.p2.x && pt.p1.y>pt.p2.y);

s=(pt.p2.x-pt.p1.x)*(pt.p2.y-pt.p1.y); // вычисление площади фигуры

printf("площадь фигуры S= %d",s);

return 0;

getch();

}

rect analiz(rect ptt)

{ void (*f)(int,rect *)={swap}; // указатель на функцию swap

rect *ptr;

ptr=&ptt; // ptr содержит адрес стр-ры ptt

if (ptt.p1.x>ptt.p2.x) (*f)(1,ptr); // x1>x2 выполняем в (*f) x1<->x2

if (ptt.p1.y>ptt.p2.y) (*f)(2,ptr); // y1>y2 выполняем в (*f) y1<->y2

return ptt;

}

void swap(int n,rect *ptr) // замена одноименных координат 2 точек

{ int i; // из функции не требуется возврата т.к.

switch (n) // замена выполняется по адресу стр-ры ptt

{ case 1 : i=ptr->p1.x; ptr->p1.x=ptr->p2.x; ptr->p2.x=i; break;

case 2 : i=ptr->p1.y; ptr->p1.y=ptr->p2.y; ptr->p2.y=i; break;

}

}