Академический Документы
Профессиональный Документы
Культура Документы
ЛАБОРАТОРНАЯ РАБОТА № 5
Выполнила
Проверил
г. Таганрог
Содержание
Введение....................................................................................................................................................3
1. Теоретическая часть..............................................................................................................................4
1.1. Общие сведения о структурном типе данных..............................................................................4
1.2. Доступ к членам структуры............................................................................................................6
1.3. Присваивание структур..................................................................................................................7
1.4. Массивы структур...........................................................................................................................7
1.5. Передача членов структур функциям............................................................................................8
1.6. Передача целых структур функциям.............................................................................................9
1.7. Указатели на структуры................................................................................................................10
1.8. Массивы и структуры внутри структур........................................................................................11
2. Практическая часть..............................................................................................................................12
2.1 Разработка блок-схемы.................................................................................................................13
2.2 Листинг кода..................................................................................................................................13
2.3 Отладка...........................................................................................................................................24
Заключение..............................................................................................................................................26
2
Введение
Сегодня программирование является одним из базовых элементов
информатики и вычислительной техники.
3
1. Теоретическая часть
В языке программирования Си кроме стандартных форматов данных,
таких как простые переменные, указатели, массивы и пр., можно задавать
более сложные форматы данных, которые объединяются понятием
структуры. Обработка данных структурного типа сегодня занимает важное
место в профессиональном программировании.
struct тег {
тип имя-члена;
тип имя-члена;
} переменные-структуры;
struct addr {
4
char name[30];
char street[40];
char city[20];
struct {
char street[40];
} addr_ihfo;
5
1.2. Доступ к членам структуры
Доступ к отдельным членам структуры осуществляется с помощью
оператора «точка». В общем виде использование оператора точка для
доступа к члену структуры имеет вид:
имя-объекта.имя-члена
Например, в выражении:
addr_info.zip = 347900;
gets(addr_info.name);
putchar(addr_info.name[t]);
int main(void) {
struct {
int a; int b;
} x, y;
x.a = 10;
struct fred {
char x;
int у;
float z;
char s [10] ;
} mike;
8
передать адреса членов структуры mike, нужно использовать следующее
выражения:
#include
/ * Определение типа структуры. */
struct struct__type {
int a, b; char ch;
};
void fl(struct struct_type parm);
int main(void) {
struct struct_type arg;
arg.a = 1000,
f1(arg);
9
return 0; }
void fl(struct struct_type parm) {
printf("%d", parm.a); }
При объявлении параметров, являющихся структурами объявление
типа структуры должно быть глобальным, чтобы структурный тип можно
было использовать во всей программе. Например, если бы struct_type был бы
объявлен внутри main (), то этот тип не был бы виден в f1().
10
Для того чтобы получить адрес переменной-структуры, необходимо
перед ее именем поместить оператор &. Следующий пример демонстрирует
такую передачу:
struct bal {
р = Sperson;
Например:
р- >balance
struct X {
float b; } у;
11
Здесь целый элемент с индексами 3. 7 из массива а, находящегося в
структуре у, обозначается таким образом: У-а[3] [7].
struct emp {
struct addr address; /* аижеикая структурй */
float wage; } worker;
Здесь структура была определена как имеющая два члена. Первым
является структура типа addr, в которой находится адрес работника. Второй
член — это wage, где находятся данные по его зарплате. В следующем
фрагменте программы элементу zip из .аddress присваивается значение
347900. worker.address.zip = 347900.
2. Практическая часть
1) Написать программу, которая записывает с клавиатуры в файл
структуру согласно варианту 9 задания. В качестве разделителя полей
структуры использовать символ табуляции. В программе реализовать: а)
дополнение существующего массива структур новыми структурами;
#include<openssl/sha.h>
#include <stdio.h>
#include<string.h>
13
#include<stdlib.h>
#include <sys/types.h>
#include<wchar.h>
#include <ncurses.h>
FILE* AUTOS;
ssize_t* INDEXES;
int INDEXES_SIZE;
struct SFile{
int len;
};
typedef struct {
int region;
int number;
wchar_t series[3];
}reg_number;
14
typedef struct {
unsigned char B;
unsigned char G;
unsigned char R;
} color;
struct Auto {
ssize_t struct_size;
ssize_t count;
ssize_t auto_gender_size;
reg_number auto_reg;
int dors_count;
char auto_type;
int price;
char* auto_gender;
};
printf("\n");
}
15
int file_hash(FILE* F, unsigned char hash[32])
SHA256_CTX sha_contex;
SHA256_Init(&sha_contex);
char buff[32];
SHA256_Final(hash, &sha_contex);
return 1;
char string[256];
16
printf("Введите марку автомобиля [до 256 символов]:\n");
new_auto->auto_gender = (char*)malloc(len);
new_auto->auto_gender[len - 1] = '\0';
printf("'%s'\n", new_auto->auto_gender);
reg_number* rn = &new_auto->auto_reg;
series:
scanf("%s", string);
mbstowcs(rn->series,string,3);
17
for(int i = 0; i < 3; i++)
switch(rn->series[i])
case L'А': case L'Б': case L'В': case L'Г': case L'Д': case L'Е': case
L'Ё': case L'Ж': case L'З': case L'И': case L'Й': case L'К': case L'Л': case
L'М': case L'Н': case L'О': case L'П': case L'Р': case L'С': case L'Т': case
L'У': case L'Ф': case L'Х': case L'Ц': case L'Ч': case L'Ш': case L'Щ': case
L'Э': case L'Ю': case L'Я':
continue;
default:
goto series;
num:
scanf("%d", &rn->number);
goto num;
scanf("%d", &rn->region);
scanf("%d", &new_auto->dors_count);
18
select_type:
scanf("%hhd", &new_auto->type);
if(new_auto->type > 4)
goto select_type;
printf("Цена: ");
scanf("%d", &new_auto->price);
new_auto->auto_gender_size = strlen(new_auto->auto_gender);
printf("\n");
return new_auto;
19
printf("Цвет: R %d G %d B %d\n", new_auto->color.R, new_auto-
>color.G, new_auto->color.B);
printf("Регистрационный номер:\n");
FILE* Autos;
20
if(!meta)
struct SFile m;
meta = &m;
if(!Autos)
if(!Autos)
return NULL;
else
meta->len = 0;
meta->label[0] = 'C';
meta->label[1] = 'T';
meta->label[2] = 'F';
meta->label[3] = '\0';
21
goto ret;
if(strcmp("CTF", meta->label))
return NULL;
if(meta->len > 0)
file_hash(Autos, this_hash);
p_hash(this_hash);
p_hash(meta->hash);
if(meta->hash[i] != this_hash[i])
return NULL;
}
22
}
printf("КэШ свалидировался!\n");
ret:
fclose(Autos);
fseek(file, 0, SEEK_SET);
file_hash(file, hash);
fseek(file, 0, SEEK_SET);
{
23
struct SFile meta;
fseek(file, 0, SEEK_SET);
fseek(file, 0, SEEK_END);
return 0;
meta.len += 1;
printf("Add a car\n");
fseek(file, 0, SEEK_SET);
fseek(file, 0, SEEK_SET);
update_file_hash(file);
return 1;
fseek(F, 0, SEEK_SET);
indexes[i] = ftell(F);
return NULL;
*size = meta.len;
return indexes;
a->auto_gender = (char*)malloc(a->auto_gender_size);
25
void print_autos(ssize_t* indexes, int count, FILE* f)
use_auto.auto_gender = NULL;
printf("====-------====\n");
print_auto_info(&use_auto);
printf("--------------\n");
void end_buffer()
int c;
do{
c = getchar();
int ret;
26
struct Auto autos[2];
free(autos[0].auto_gender);
free(autos[1].auto_gender);
return ret;
int ret;
(autos[0].color.G - autos[1].color.G) +
(autos[0].color.B - autos[1].color.B);
free(autos[0].auto_gender);
free(autos[1].auto_gender);
return ret;
int ret;
reg_number r1 = autos[0].auto_reg;
reg_number r2 = autos[1].auto_reg;
free(autos[0].auto_gender);
free(autos[1].auto_gender);
return ret;
int ret;
free(autos[0].auto_gender);
free(autos[1].auto_gender);
return ret;
28
int cmp_price(ssize_t* i1, ssize_t* i2)
int ret;
free(autos[0].auto_gender);
free(autos[1].auto_gender);
return ret;
int type;
color col;
int f;
wchar_t buf[20];
int region;
switch(opti)
case 1:
if(strstr(filter, s_auto.auto_gender))
print_auto_info(&s_auto);
break;
case 2:
30
print_auto_info(&s_auto);
break;
case 3:
if(type == s_auto.type)
print_auto_info(&s_auto);
break;
case 4:
print_auto_info(&s_auto);
printf("\n");
break;
case 5:
if(type == s_auto.price)
print_auto_info(&s_auto);
break;
free(s_auto.auto_gender);
31
}
int main()
setlocale(LC_ALL, "ru_RU.utf8");
if(AUTOS)
printf("ОТКРЫЛИ ФАААЙЛЛ!\n");
else
return -1;
int n_autos_count = 0;
ssize_t* indexes;
int opti;
int run = 1;
char ch = 0;
char opt;
while(run)
32
printf("Выберите опцию: \n [1] Добавить автомобиль\n [2] Вывести
список авто \n [3] Вывести сортированный список авто\n [4] Поиск по
ключу\n [5] Выйти\n");
scanf("%d", &opti);
end_buffer();
switch(opti)
case 1:
add_auto:
end_buffer();
n_auto = get_new_auto();
ctf_file_add(&n_auto, 1, AUTOS);
free(n_auto->auto_gender);
free(n_auto);
meta.len += 1;
opti = 0;
break;
case 2:
if(indexes)
opti = 0;
break;
case 3:
scanf("%d", &opti);
switch(opti)
case 1:
printf("MArk Sort\n");
sort(cmp_name);
break;
case 2:
sort(cmp_reg_number);
break;
case 3:
sort(cmp_type);
break;
case 4:
sort(cmp_color);
break;
case 5:
sort(cmp_price);
break;
opti = 0;
break;
34
case 4:
if(string[i] == '\0' )
goto end;
string += i;
break;
field_search(opti, string);
opti = 0;
end:
break;
35
case 5:
fclose(AUTOS);
return 0;
fclose(AUTOS);
return 0;
2.3. Отладка
36
Рисунок 3 – Добавление нового авто
37
Рисунок 4 – Меню поиска и поиск
38
Рисунок 6 – Вывод всех объектов.
39
Рисунок 8 – Вывод всех строк из файла после сортировки по имени.
40
Заключение
В ходе лабораторной работы получены базовые сведения о средах и
средствах разработки языка программирования Си, структурах программ,
типах данных, массивах и работе с ними, строках, массивах символов,
файлах данных, простейших арифметических операциях, циклах, операциях
ввода/вывода, функциях, которые составляют основные структурные
компоненты языка для написания программ на языке Си.
41