Читайте также:
|
|
1) (date1+5)->day=10;
2) (stud+3)->birthday.month=1;
// Используя доступ по указателю на структуру, присваиваем значение соответствующей переменной. Указатель можно использовать и так:
3) (*(date1+5)).day=10;
4) (*(stud+3)).birthday.month=1;
Инициализация структур. При определении структурных переменных можно инициализировать их поля. Эта возможность подобна инициализации массива и следует тем же правилами:
имя_шаблона имя_переменной_структуры = {значение1, значение2, …};
Компилятор присваивает значение1 первой переменной в структуре, значение2 – второй переменной структуры и т.д., и тут необходимо следовать некоторым правилам:
- присваиваемые значения должны совпадать по типу с соответствующими полями структуры;
- можно объявлять меньшее количество присваиваемых значений, чем количество полей. Компилятор присвоит нули остальными полями структуры;
- список инициализации последовательно присваивает значения полям структуры, вложенных структур и массивов.
Пример:
struct date
{ int day,month,year; }d[5] = { {1,3,1980}, {5,1,1990}, {1,1,1983} };
Копирование структур-переменных. Язык С(С++) позволяет оператору присваивания копировать значения одной структуры-переменной в другую переменную, при условии, что обе структуры-переменные относятся к одному и тому же типу. Таким образом, единственный оператор может скопировать несколько членов данных, которые включают массивы и вложенные структуры.
Однако следует учитывать, что оператор присваивания выполняет то, что называется поверхностной копией в применении к структурам-переменным. Поверхностная копия представляет собой копирование бит за битом значений полей переменной-источника в соответствующие поля переменной-цели. При этом может возникнуть проблема с такими членами данных, как указатели, поэтому использовать поверхностное копирование структур надо осторожно.
Пример 1: Создать массив структур о студентах группы. О каждом студенте записать: имя, фамилию, год рождения, оценки по пяти экзаменам. Определить средний балл за сессию и отсортировать список по сумме баллов.
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
struct student
{ char name[20];
char fam[30];
int year;
int mark[5];
int average;
};
struct student students[30];
struct student buffer;
int records;
int i, j;
int main()
{
records=0;
do
{
printf("Student №%d\n", records+1);
puts("Vvedite familiu: ");
fflush(stdin);
gets(students[records].fam);
puts("Vvedite imya: ");
fflush(stdin);
gets(students[records].name);
puts("Vvedite vozrast: ");
scanf("%d", &students[records].year);
for(i=0; i<5; i++)
{ printf("Vvedite ocenku po ekzamenu №%d ", i+1);
scanf("%d", &students[records].mark[i]);
}
records++;
puts("Prekratit' rabotu? (1/0)");
scanf("%d", &i);
} while(i);
for (i=0; i<records; i++)
{ students[i].average=0;
for (j=0; j<5; j++)
students[i].average+=students[i].mark[j];
}
for (i=0; i<records-1; i++)
for (j=i; j<records; j++)
if (students[i].average>students[j].average)
{ buffer=students[i];
students[i]=students[j];
students[j]=buffer;
}
for (i=0; i<records; i++)
{
printf("Student %s %s ", students[i].name, students[i].fam);
printf(" Vosrast %d ", students[i].year);
printf(" Sr. ball %d \n", students[i].average);
}
getch();
return 0;
}
Пример 2: Ввести массив структур. Рассортировать массив в алфавитном порядке фамилий, входящих в структуру, перемещая сами структуры.
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<string.h>
struct st
{ char name[80];
int age; не придирайся
};
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,k;
struct st m[100], t;
printf("Vvedite kol-vo studentov: ");
scanf("%d", &k);
for (i=0; i<k; i++)
{ puts("Vvedite imya studenta: ");
fflush(stdin);
gets(m[i].name);
puts("Vvedite vozrast: ");
scanf("%d", &m[i].age);
}
for (i=0; i<k-1; i++)
for (j=i+1; j<k; j++)
if (strcmp(m[i].name, m[j].name)>0)
{ t=m[i]; m[i]=m[j]; m[j]=t; }
printf("\n\nRezultat: ");
for (i=0; i<k; i++)
{
printf("\n\n");
puts(m[i].name);
printf("%d years ", m[i].age);
}
getch();
return 0;
}
Пример 3: Определить структурированный тип, набор функций (в виде меню) для работы с массивом структур. Структура «Склад»: наименование, единица измерения, цена единицы, количество, дата последнего прихода/расхода, тип накладной (приход или отгрузка).
В перечень обязательных функций входят:
- ввод элементов (полей) структуры с клавиатуры;
- вывод элементов (полей) структуры;
- поиск в массиве структуры с заданным значением поля;
- удаление заданного элемента;
- изменение (редактирование) заданного элемента.
Интерфейс пользователя осуществить в виде командного процессора:
1 - загрузить данные
2 - вывести на экран......
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <windows.h>
using namespace std;
struct sklad //объявляем шаблон структуры
{char name[30]; //Наименование
char ed[5]; //Единица измерения
float cena; //Цена
int kol; //Количество
int date; //Дата последнего завоза
int type; //тип накладной (приход или отгрузка)
};
struct sklad mas[30]; //объвляем глобальный массив структур
struct sklad tmp; //объявляем временую переменную структурного типа
int sch=0; //Счетчик полных записей
int er; //Переключатель
void enter_new();
int menu();
void out();
void del();
void change();
void find();
int main()
{
setlocale(LC_ALL,"Russian");
while(1)
{ switch(menu())
{ case 1:del();break;
case 2:enter_new();break;
case 3:change();break;
case 4:out();break;
case 5:find();break;
case 6: return 0;
default: cout<<"Не верный выбор/n";
}
}
}
void enter_new() // ф-ция ввода новой структуры
{
if(sch<30) //вводим новую запись только, если счетчик полных записей меньше максимального количества записей
{
cout<<"Запись номер"<<sch+1; //выводим номер записи
cout<<"\nВыберите тип накладной (1 - приход, 2 - отгрузка)\n";
cin>>mas[sch].type;
cout<<"\nВведите наименование\n";
cin>>mas[sch].name;
cout<<"Введите ед.измерения \n";
cin>>mas[sch].ed;
cout<<"Введите цену\n";
cin>>mas[sch].cena;
cout<<"Введите кол-во\n";
cin>>mas[sch].kol;
cout<<"Введите дату последнего поступления\n";
cin>>mas[sch].date;
sch++; //увеличиваем счетчик полных записей на единицу
}
else cout<<"Введено максимальное кол-во записей";
}
int menu()
{
int er;
cout<<"Введите:\n";
cout<<"1-для удаления записи\n";
cout<<"2-для ввода новой записи\n";
cout<<"3-для изменения записи\n";
cout<<"4-для вывода записи(ей)\n";
cout<<"5-для поиска \n";
cout<<"6-для выхода\n";
cin>>er;
return er;
}
void out() //ф-ция вывода записей
{
int sw; // переключатель для выбора выводить все записи или одну
int k; //номер структуры, кот. надо вывести
if (sch==0) //если счетсик количества структур равен 0, то выводим, что нет записей
cout<<"\nНет запичей: \n";
else
{
cout<<"\nВведите: \n";
cout<<"1-если хотите вывести какую-либо запсь\n";
cout<<"2-если хотите вывести все записи\n";
cin>>sw;
if(sw==1)
{
cout<<"Введите номер записи, которую нужно вывести\n";
cin>>k;
cout<<endl;
if (mas[k-1].type==1)
cout<<"Приход"<<endl;
else
cout<<"Отгрузка"<<endl;
cout<<"Наименование:"<<mas[k-1].name<<endl;
cout<<"Ед.измер.:"<<mas[k-1].ed<<endl;
cout<<"Цена:"<<mas[k-1].cena<<endl;
cout<<"Кол-во:"<<mas[k-1].kol<<endl;
cout<<"Дата:"<<mas[k-1].date<<endl;
cout<<"____________"<<endl;
}
if(sw==2)
{ for(int i=0;i<sch;i++) //выводим в цикле все записи
{if (mas[i].type==1)
cout<<"Приход"<<endl;
else
cout<<"Отгрузка"<<endl;
cout<<"Наименование:"<<mas[i].name<<endl;//выводим на экран значение name i-ой структуры из массива структур mas
cout<<"Ед.измер.:"<<mas[i].ed<<endl;
cout<<"Цена:"<<mas[i].cena<<endl;
cout<<"Кол-во:"<<mas[i].kol<<endl;
cout<<"Дата:"<<mas[i].date<<endl;
cout<<"____________"<<endl;
}
}
}
}
void del() //ф-ция удаления записи
{ int d; //номер записи, которую нужно удалить
cout<<"\nВведите номер записи, которую необходимо удалить\n";
cout<<"Если необходимо удалить все записи,нажмите '99'\n";
cin>>d;
if (d!=99)
{ for (int i=(d-1);i<sch;i++) //цикл для удаления заданной записи, начинаем цикл с удаляемой записи
mas[i]=mas[i+1]; //замещаем текущую запись следующей за ней
sch=sch-1; //уменяьшаем счетчик полных записей на 1
}
if (d==99)
{ for(int i=0;i<30;i++)//цикл по все записям от первой до 30-ой
mas[i]=tmp; //замещаем каждую структуру в массиве пустой структурой
sch=0; //счетчик структур обнуляем, т.к. все записи удалены
}
}
void change() //функция для изменения записи
{ int c; //номер записи, которую нужно изменить
int per;
cout<<"\nВведите номер записи\n";
cin>> c;
do
{cout<<"Введите: \n";
cout<<"1-для изменения типа накладной\n";
cout<<"2-для изменения наименования\n";
cout<<"3-для изменения ед.измерения\n";
cout<<"4-для изменения цены\n";
cout<<"5-для изменения количества\n";
cout<<"6-для изменения даты\n";
cout<<"7-для прекращения\n";
cin>>per;
switch (per)
{ case 1: cout<<"\nВведите новый тип накладной (1 - приход, 2 - отгрузка)\n";
cin>>mas[c-1].type;
break;
case 2:
cout<<"\nВведите новое наименование\n";
cin>>mas[c-1].name;
break;
case 3:
cout<<"Введите новые ед.измерения \n";
cin>>mas[c-1].ed;
break;
case 4:
cout<<"Введите новую цену\n";
cin>>mas[c-1].cena;
break;
case 5:
cout<<"Введите новое кол-во\n";
cin>>mas[c-1].kol;
break;
case 6:
cout<<"Введите новую дату последнего поступления\n";
cin>>mas[c-1].date;
break;
case 7: return;
}
}while(1);
}
void find() //ф-ция поиска записей
{
int sw; // переключатель
if (sch==0)
cout<<"\nНет запичей: \n";
else
{
cout<<"\nВведите: \n";
cout<<"1-все накладные прихода\n";
cout<<"2-все накладные отгрузки\n";
cin>>sw;
for(int i=0;i<sch;i++) //в цикле просматриваем все структуры из массива структур
if (mas[i].type==sw)
{
if (mas[i].type==1)
cout<<"Приход"<<endl;
else
cout<<"Отгрузка"<<endl;
cout<<"Наименование:"<<mas[i].name<<endl;
cout<<"Ед.измер.:"<<mas[i].ed<<endl;
cout<<"Цена:"<<mas[i].cena<<endl;
cout<<"Кол-во:"<<mas[i].kol<<endl;
cout<<"Дата:"<<mas[i].date<<endl;
cout<<"____________"<<endl;
}
}
}
Дата добавления: 2015-04-20; просмотров: 20 | Поможем написать вашу работу | Нарушение авторских прав |