Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБРАБ_C++.DOC
Скачиваний:
7
Добавлен:
09.12.2018
Размер:
865.28 Кб
Скачать

Пример на использование структур

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <iostream.h>

struct Spisok {

char Fio[20];

char Grup[10];

int Ot[3];

float S_Bal;

} *sved;

void Vvod(int nom,struct Spisok *sved)

{ cout << "\n Vvedi svedenia " << (nom+1);

cout << "\n FIO - "; gets(sved->Fio);

cout << " Nomer Gr - "; cin >> sved->Grup;

float s=0;

for(int i=0;i<3;i++) {

cout << "\n Otcenki - "; cin >> sved->Ot[i];

s+=sved->Ot[i];

}

sved->S_Bal=s/3.;

return; }

void main(void)

{ struct Spisok Stud[50]; int i,N; char Bukva;

clrscr();

cout << "\n Vvedi kol-vo < 50 "; cin >> N;

for(i=0;i<N;i++) Vvod(i,&Stud[i]);

cout << "\n Spisok Students";

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

printf("\n %20s %10s %4.2f",Stud[i].Fio,Stud[i].Grup,Stud[i].S_Bal);

cout << "\n Poisk FIO (bukva) "; cin >> Bukva;

cout << "\n Sveden Students";

int kod_p=0;

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

if(Stud[i].Fio[0]==Bukva){ kod_p=1;

printf("\n %20s %10s %4.2f",Stud[i].Fio,Stud[i].Grup,Stud[i].S_Bal); }

if(kod_p==0) cout << " Takix HET!";

cout << "\n Poisk zapisi";

Vvod(-1,sved);

kod_p=0;

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

if(memcmp(sved,&Stud[i],sizeof(sved))==0) { kod_p=1;

printf("\n Poisk \n %20s %10s",Stud[i].Fio,Stud[i].Grup); }

if(kod_p==0) cout << " Takix HET!";

getch();

}

Язык Си допускает использовать в структурах особый тип полей - битовых. Поле битов - это группа соседних (двоичных) разрядов ( бит), расположенных в области памяти переменной целого типа.

Целесообразно использование полей бит тогда, когда для хранения информации в структуре данных достаточно несколько бит.

Синтаксис описания битового поля :

тип[имя]:ширина;

Элементами структуры могут быть одна или несколько структурных переменных. Рассмотрим примеры программ работы со структурами.

ПРИМЕР 1

/* Программа демонстрирует передачу в функцию sum */

/* элементов avans и zarp структуры st */

#include <conio.h>

#include <stdio.h>

#define k 2

#define PE printf("\n ..СУММА АВАНСА ЗА %d МЕСЯЦА......",k);

#define PE1 printf("\n===================================");

#define PE2 printf("\n");

struct fund{

char *mes_avans;

float avans;

char *mes_zarp;

float zarp;

};

main()

{

static struct fund st={"АВГУСТ",

600000,

"ОКТЯБРЬ",

900000

};

float sum(),res;

res=sum(st.avans,st.zarp);

printf(" \n Oбщая сумма равна %8.2f руб.",res);

PE2;PE1;getch();

}

float sum(x,y)

float x,y;

{

clrscr();PE;PE1;PE2;

return(x+y);

}

ПРИМЕР 2

/* Программа демонстрирует передачу в функцию пользователя sum * /

/* АДРЕСА структуры str */

/* адрес структуры str передается с помощью операции указатель */

/* у функции sum - один параметр, который описан как указатель * /

/* на структуру с шаблоном spis. При обращении к функции sum */

/* происходит присвоение значения адреса структурной переменной */

/* str, и с помощью указателя t можно обращаться к элементам */

/* структуры типа spis, например : t->vans и t->za */

#include <stdio.h>

#include <conio.h>

struct spis{

char *s_vans;

float vans;

char *s_za;

float za;

};

main()

{

static struct spis str={"сентябрь",

600,

"октябрь",

1000

};

float sum(),res;

res=sum(&str);

printf(" общее количество экземпляров=%8.0f штук",res);

getch();

}

float sum(t)

struct spis *t;

{ clrscr();

return(t->vans+t->za);

}

ПРИМЕР 3

/* Программа демонстрирует передачу в функцию sum */

/* АДРЕСА МАССИВА структур */

/* стартовый адрес массива структур st помещается в переменную */

/* типа указатель m. Теперь в функции sum известен начальный */

/* адрес массива структур. Зная этот адрес , можно обратиться */

/* к элементам самой первой структуры, используя операцию -> */

/* Это элементы m->avans и m->zarp. Для того, чтобы получить адрес */

/* следующей структуры, надо увеличить переменную-указатель на 1, */

/* что и делается при вычислении третьего выражения в цикле for */

#include <stdio.h>

#include <conio.h>

struct fund{

char *mes_avans;

float avans;

char *mes_zarp;

float zarp;

};

main()

{

static struct fund st[2]={{"сентябрь",

500000,

"октябрь",

700000

},

{"ноябрь",

600000,

"декабрь",

800000

}

};

float sum();

printf(" общая сумма= %8.3f ",sum(st));

getch();

}

float sum(m)

struct fund *m;

{

float res;

int i; clrscr();

for(i=0,res=0;i<2;i++,m++)

res+=m->avans+m->zarp;

return(res);

}

ПРИМЕР 4.

Вести сведения о студентах учебной группы, каждый элемент массива студенческой группы содержит:

а) фамилию и имя;

в) итоги сдачи экзамена по программированию.

Программа выводит информацию остуденте по его порядковому номеру в списке группы(индекс массива, содержащего введенную информацию)

Текст С-программы может иметь вид:

#include <stdio.h>

#include <conio.h>

struct student

{

char fio[10]; // поле для ФИО студента

int est1; // поле для оценки

} gruppa[25]; // массив для списка группы

void main(void)

{

int i,j,k,priznak;

clrscr();

printf("\n Формирование списка до 25 человек");

/*------Формирование списка----------*/

for (i=1;i<=25;i++)

{

printf("\n Введите сведения о студенте %d и\

\n признак режима работы программы (0-окончить ввод )\

\n",i);

printf("\n Фамилия и инициалы: ");

fflush(stdin); // функция очистки буфера ввода

gets(gruppa[i].fio);

printf("\n Введите оценкy по программированию: ");

fflush(stdin);

scanf("%d",&gruppa[i].est1);

k=i; // запоминаем текущий номер введенной

// информации

printf(" \n Признак? ");

scanf("%d",&priznak);

k=i;

if(!priznak)break;

}

/*---------Просмотр списка------------*/

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

{

printf("\n Сведения о каком студенте?\n");

scanf("%d",&j);

if(j>k)

{

printf("\n НЕТ СВЕДЕНИЙ! ");

continue; // в случае отсутствия информации

} // переход на следующий шаг цикла

printf(" \n СТУДЕНТ: %s \n",gruppa[j].fio);

printf(" \n ВЕСЕННЯЯ СЕССИЯ, ОЦЕНКА\

по ПРОГРАММИРОВАНИЮ: %d",gruppa[j].est1);

printf("\n Признак? ");

scanf("%d",&priznak);

if(!priznak)break;

}

puts("\n РАБОТА ПРОГРАММЫ ЗАВЕРШЕНА! Press any key...");

getch();

}

Варианты индивидуальных заданий

В программах предусмотреть ввод исходной информации о четырех студентах

- фамилия и инициалы;

- год рождения;

- год поступления в БГУИР;

- оценки за первый семестр:

- физика;

- высшая математика;

- информатика;

1. Распечатать список студентов, упорядоченный по алфавиту.

2. Распечатать список студентов. упорядоченный по году рождения.

3. Распечатать список студентов-отличников. упорядоченный по году поступления.

4. Распечатать анкетные данные студентов. сдавших сессию на 4 и 5.

5. Распечатать список студентов. фамилии которых начинаются с буквы Б и их оценки по всем предметам.

6. Распечатать анкетные данные отличников.

7. Распечатать список студентов, фамилии которых начинаются с буквы А и их даты рождения.

8. Распечатать анкетные данные студентов, имеющих оценку 3 в сессию.

9. Распечатать список студентов и их оценки. Фамилии студентов начинаются с букв В и Г.

10. Распечатать фамилии и даты рождения студентов, не имеющих оценок 3.

11. Вычислить общий средний балл всех студентов и распечатать список студентов со средними баллами выше общего среднего балла.

12. Вычислить общий средний балл всех студентов и распечатать список студентов, имеющих средний балл ,равный общему среднему баллу.

13. Распечатать анкетные данные студентов, имеющих оценку 2.

14. Распечатать анкетные данные студентов, имеющих оценку 5 по информатике.

15. Распечатать анкетные данные студентов, имеющих оценку 4 по физике и оценку 5 по высшей математике.

16. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна 2-м, то удаляются все числа, которые делятся на 2.

17. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L четная, то удаляются 2 первых и 2 последних символа.

18. Выяснить, имеются ли среди символов S1...Sn некоторой строки все буквы, входящие в слово DOS.

19. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L нечетная, то удаляется символ, стоящий посередине строки.

20. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов каждого второго символа ! на $.

21. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов всех пробелов на символ $.

22. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >10, то удаляются все цифры.

23. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна числу 3, то удаляются все числа, делящиеся на число 3.

24. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна числу 5, то подсчитывается количество скобок всех видов.

25. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L кратна числу 4, то первая часть строки меняется местами со второй.

26. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L=10, то удаляются все A..Z.

27. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >15, то удаляются все a..z.

28. В строке символов поменять местами символы на четных и нечетных позициях.

29. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >6-и, то выделяется подстрока { } скобках.

30. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >5-и, то выделяется подстрока до первого пробела.