- •Лабораторная работа №2 Структуры. Указатели.
- •1. Программирование алгоритмов с использованием структур
- •Краткие теоретические сведения
- •Пример на использование структур
- •2. Указатели Теоретические сведения
- •Указатели и операции над адресами
- •Операции над указателями (адресная арифметика)
- •Указатели на указатели
- •Таким образом, указатели на указатели – это имена многомерных массивов.
- •Массивы указателей
- •Динамическое размещение данных
- •Пример использования структуры и указателя
- •Варианты индивидуальных заданий Задание 1.
- •Задание 2.
Лабораторная работа №2 Структуры. Указатели.
1. Программирование алгоритмов с использованием структур
Краткие теоретические сведения
Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием:
struct имя_структуры {
описание элементов;
};
Для выделения памяти под структуру надо определить структурную переменную:
struct имя_структуры имя_переменной;
При определении структур можно задавать начальные значения элементам структур. Для ввода значений элементов структур можно использовать оператор cin>> потокового ввода.
Над структурами допускаются следующие операции:
1) Взятие адреса структуры. Адрес структуры может быть получен путем применения операции указатель (&) к структурной переменной.
2) Доступ к элементу структуры можно выполнить с помощью операций: точка (.) - прямой доступ или стрелка ( -> ) - доступ по указателю.
Структурная переменная может использоваться так же, как и переменные типов float,int,char и т.д.
Например:
struct gr /* имя структуры */
{ char fio[10]; /* элемент структуры */
int est[25]: /* элемент структуры */
int nomer; /* элемент структуры */
} gruppa1; /* имя структурной переменной */
struct gr gruppa2; /* объявление структурной переменной */
Если описатель структуры записан до размещения всех функций в исходном файле, то он будет доступен каждой из функций в этом файле. При определении структурной переменной можно инициалиировать (станавливать значения полям структуры). Например
struct date { int day,month,year;};
d[5]={ { 1,3,1980},
{ 5,1,1990},
{ 1,1,2002}
};
Элементами структуры могут быть одна или несколько структурных переменных.
Пример на использование структур
#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();
}
ПРИМЕР.
/* Программа демонстрирует передачу в функцию пользователя 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);
}
ПРИМЕР.
Вести сведения о студентах учебной группы, каждый элемент массива студенческой группы содержит:
а) фамилию и имя;
в) итоги сдачи экзамена по программированию.
Программа выводит информацию остуденте по его порядковому номеру в списке группы(индекс массива, содержащего введенную информацию)
Текст С-программы может иметь вид:
#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();
}