Описание переменных и констант

Задание VI. Обработка последовательной файловой структуры на языке C.

Задание

Разработать последовательную структуру данных для представления простейшей базы данных на файлах в СП Си в соответствии с заданным заданием. Составить программу генерации внешнего нетекстового файла заданной структуры, содержащего представительный набор записей (15-20). Распечатать содержимое сгенерированного файла в виде таблицы и выполнить над ним заданное действие для 2-3 значений параметров запроса p и распечатать результат.

Задание №6

Содержимое и состав файла (варианты 1-11)

Сведения о составе комплектующего ПЭВМ в студенческой группе: фамилия владельца, число и тип процессоров, объём памяти, тип видеоконтроллера (встроенный, внешний, AGP, PCI) и объём видеопамяти, тип (SCSI/IDE, ATA/SATA), число и ёмкость винчестеров, число интегрированных контроллеров и внешних (периферийных) устройств, операционная система.

Действия

Распечатать сведения обо всех компьютерах-серверах и рабочих станциях.

Общий метод решения

Составить три таблицы с содержимым, удовлетворяющим заданию. Написать программу, которая работает с одной из данных таблиц (по очереди), запрашивает ввод данных с клавиатуры (в данном варианте - это количество процессоров и объём памяти) и выводит результат: сведения обо всех компьютерах-серверах и рабочих станциях в виде таблицы.

Общие сведения о программе

Программа была составлена на языке программирования Си в системе программирования GCC. Программа предназначена для работы в операционной системе Digital UNIX на ЭВМ DigitalAlpha с процессором DEC 21064. Точность работы программы зависит от разрядности ЭВМ. Для создания выполнимого файла необходимо наличие компилятора языка Си и библиотек, содержащих функции языковой среды.

Исходный текст записан в файле /users/stud/128095/temerloh/DDD/OP, расположенном на AXP3. Для получения выполняемого файла необходимо произвести его компиляцию при помощи команд cc или gcc. Далее надо выполнить полученный файл, задав его имя в качестве команды.

Функциональное назначение

Программа предназначена для нахождения всех компьютерах-серверах и рабочих станциях по таблице с данными.

Конструкторы при создании серверов создаются специальные решения, отличные от создания обычных компьютеров:

1) память обеспечивает повышенную устойчивость к сбоям;

2) при необходимости вводится дублирование процессоров (например, это важно для непрерывности выполнения сервером задачи долговременного расчёта — в случае отказа одного процессора вычисления не обрываются, а продолжаются, пусть и на меньшей скорости).

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

Логическая структура работы

Работа состоит из двух программ:

Первая генерирует и форматирует исходные данные, помещённые в текстовые файлы.

Вторая работает с файлом, имеющим бинарные данные, и выводит результат, соответствующий заданию варианта.

Описание переменных и констант

Описания переменных и констант приведены в таблице 1.

Таблица 1

Имя Тип Назначение
s Struct Создаём свой собственный тип данных
fam char Отвечает за фамилию владельца ПО
CPU_type[10] char Отвечает за тип CPU
Int_CPU int Отвечает за количество CPU
Vol_mem int Отвечает за объём памяти ПК
Type_Vid[7] char Отвечает за тип видеоконтроллера
Bus_Video[7] char Отвечает за тип SCSI/IDE, ATA/SATA
Video_Memory int Отвечает за объём видеопамяти
Type_HD[7] char Отвечает за тип HD
NUM_HD int Отвечает за номер HD
Vol_HD int Отвечает за ёмкость HD
Int_Con int Отвечает за число интегрированных контроллеров
Ext_Dev int Отвечает за число внешних (периферийных) устройств
Op_system[7] char Отвечает за операционную систему
r int Отвечает за кол-во процессоров (условие 6 варианта)
q int Отвечает за объём памяти (условие 6 варианта)
argc int Отвечает за количество аргументов при вызове программы
*argv char Отвечает за аргументы при вызове программы

Текст программы 1

#include<stdio.h>

#include<string.h>

int main(int argc, char *argv[])

{

FILE *fi,*fo;// входной, выходной файл

if(argc==1)//нет аргументов

{ if((fi=fopen("CPU.txt","r"))==NULL)

{printf("Cannot input 1"); return 1;}

if((fo=fopen("Base.dat","wb"))==NULL)

{printf("Cannot output"); return 1;}

}

else

if(argc==2) // 3) RUN .EXE IN.TXT - NOT WORKS

{ puts(argv[1]); printf("%s\n",argv[1]);// SEE OUT2.DAT

if((fi=fopen(argv[1],"r"))==NULL)

{printf("Cannot input 2"); //getch();

return 1;}

if((fo=fopen("Base.dat","wb"))==NULL)

{printf("Cannot output"); //getch();

return 1;}

}

else

{ if((fi=fopen(argv[1],"r"))==NULL)

{printf("Cannot input 3"); //

return 1;}

if((fo=fopen(argv[2],"wb"))==NULL)

{printf("Cannot output");

return 1;}

}

struct S

{char fam[20];

char CPU_type[10];

int Int_CPU;

int Vol_mem;

char Type_Vid[7];

char Bus_Video[7];

int Video_Memory;

char Type_HD[7];

int NUM_HD;

int Vol_HD;

int Int_Con;

int Ext_Dev;

char Op_system[7];

} s,s1;

int l=sizeof(S),n=0;

// printf("l=%d\n",l);

while(!feof(fi))

{// printf("l=%d\n",l);

fscanf(fi,"%s %s %d %d %s %s %d %s %d %d %d %d %s",s.fam,&s.CPU_type,&s.Int_CPU,&s.Vol_mem,&s.Type_Vid,&s.Bus_Video,&s.Video_Memory,&s.Type_HD,&s.NUM_HD,&s.Vol_HD,&s.Int_Con,&s.Ext_Dev,&s.Op_system);

// printf("%c %d %f",s.fam,&s.g_r,&s.rost);

fwrite(&s,l,1,fo); n++;//1-сколько переносим,fo-куда

// printf("n=%d\n",n);

}

fclose(fi); fclose(fo);

if(argc<3)

{ if((fi=fopen("Base.dat","rb"))==NULL)

{printf("Cannot input"); //getch();

return 1;}

if((fo=fopen("out.txt","w"))==NULL)

{printf("Cannot output"); //getch();

return 1;}

}

else if(argc==3)

{ if((fi=fopen(argv[2],"rb"))==NULL)

{printf("Cannot input"); //getch();

return 1;}

if((fo=fopen("out.txt","w"))==NULL)

{printf("Cannot output"); //getch();

return 1;}

} else

{ if((fi=fopen(argv[2],"rb"))==NULL)

{printf("Cannot input"); //getch();

return 1;}

if((fo=fopen(argv[3],"w"))==NULL)

{printf("Cannot output"); //getch();

return 1;}

}

printf("==========================================================Sod basy============================================================\n");

printf("|familya |CPU_type | Int_CPU| Vol_mem| Type_Vid| Bus_Video| Video_memory| Type_HD| Num_HD| Vol_HD| Int_Con| Ext_dev|Op_system|\n");

printf("==============================================================================================================================\n");

fprintf(fo, "==========================================================Sod basy============================================================\n");

fprintf(fo, "|familya |CPU_type | Int_CPU| Vol_mem| Type_Vid| Bus_Video| Video_memory| Type_HD| Num_HD| Vol_HD| Int_Con| Ext_dev|Op_system|\n");

fprintf(fo, "==============================================================================================================================\n");

while(!feof(fi))

{// printf("l=%d\n",l);

s1=s;

fread(&s,l,1,fi);

if(strcmp(s.fam,s1.fam))

{

fprintf(fo, "|%8s|%9s|%5d |%7d | %7s | %7s | %8d | %6s |%5d | %5d | %3d | %3d | %7s |\n", s.fam,s.CPU_type,s.Int_CPU,s.Vol_mem,s.Type_Vid,s.Bus_Video,s.Video_Memory,s.Type_HD,s.NUM_HD,s.Vol_HD,s.Int_Con,s.Ext_Dev,s.Op_system);

printf("|%8s|%9s|%5d |%7d | %7s | %7s | %8d | %6s |%5d | %5d | %3d | %3d | %7s |\n",s.fam,s.CPU_type,s.Int_CPU,s.Vol_mem,s.Type_Vid,s.Bus_Video,s.Video_Memory,s.Type_HD,s.NUM_HD,s.Vol_HD,s.Int_Con,s.Ext_Dev,s.Op_system); n++;

}

}

printf("==============================================================================================================================\n");

fprintf(fo, "==============================================================================================================================\n");

return 0;

}

Текст программы 2

#include<stdio.h>

#include<string.h>

int main(int argc, char *argv[])

{

FILE *fi,*fo;// ,

if(argc==1)

{ if((fi=fopen("Base.dat","rb"))==NULL)

{printf("Cannot input"); //getch();

return 1;}

if((fo=fopen("out.txt","w"))==NULL)

{printf("Cannot output"); //getch();

return 1;}

}

else if(argc==2)

{ if((fi=fopen(argv[1],"rb"))==NULL)

{printf("Cannot input"); //getch();

return 1;}

if((fo=fopen("out.txt","w"))==NULL)

{printf("Cannot output"); //getch();

return 1;}

} else

{ if((fi=fopen(argv[1],"rb"))==NULL)

{printf("Cannot input"); //getch();

return 1;}

if((fo=fopen(argv[2],"w"))==NULL)

{printf("Cannot output"); //getch();

return 1;}

}

struct S

{char fam[20];

char CPU_type[10];

int Int_CPU;

int Vol_mem;

char Type_Vid[7];

char Bus_Video[7];

int Video_Memory;

char Type_HD[7];

int NUM_HD;

int Vol_HD;

int Int_Con;

int Ext_Dev;

char Op_system[7];

} s,s1;

int l=sizeof(S),n=0;

int r=1, q=1; while(r)

{printf("input kol-vo Processorov(r=1-4, for end r=0):r=");

scanf("%d",&r);

printf("Memory(q=512-4096, for end q=0):q=");

scanf("%d",&q);

if(r,q)

{

fprintf(fo,"Query %d(for Int_CPU>=%d for Vol_mem>=%d):\n",++n,r,q);

printf("=====================================================Sod basy=================================================================\n");

printf("|familya |CPU type |Int_CPU |Vol_mem |Type_Vid |Bus_Video |Video_memory |Type_HD |Num_HD |Vol_HD |Int_Con |Ext_dev |Op_system|\n");

printf("==============================================================================================================================\n");

fprintf(fo, "=====================================================Sod basy=================================================================\n");

fprintf(fo, "|familya |CPU type |Int_CPU |Vol_mem |Type_Vid |Bus_Video |Video_memory |Type_HD |Num_HD |Vol_HD |Int_Con |Ext_dev |Op_system|\n");

fprintf(fo, "==============================================================================================================================\n");

}

rewind(fi);

while(!feof(fi))

{

s1=s;

fread(&s,l,1,fi);

if(strcmp(s.fam,s1.fam)) if((r&&s.Int_CPU>=r) && (q&&s.Vol_mem>=q))

{

fprintf(fo, "|%8s|%9s|%5d |%7d | %7s | %7s | %8d | %6s |%5d | %5d | %3d | %3d | %7s |\n", s.fam,s.CPU_type,s.Int_CPU,s.Vol_mem,s.Type_Vid,s.Bus_Video,s.Video_Memory,s.Type_HD,s.NUM_HD,s.Vol_HD,s.Int_Con,s.Ext_Dev,s.Op_system);

printf("|%8s|%9s|%5d |%7d | %7s | %7s | %8d | %6s |%5d | %5d | %3d | %3d | %7s |\n",s.fam,s.CPU_type,s.Int_CPU,s.Vol_mem,s.Type_Vid,s.Bus_Video,s.Video_Memory,s.Type_HD,s.NUM_HD,s.Vol_HD,s.Int_Con,s.Ext_Dev,s.Op_system);

}

}//while

if(r) {

printf("==============================================================================================================================\n");

fprintf(fo, "==============================================================================================================================\n");

}

}//while(r)

return 0;

}//main

Входные данные

Три таблицы, имеющие небольшие различия.

Первая сохранена под именем CPU.txt (пример первой таблицы):

Noskov Pent4 3.00 512 ext AGP 128 IDE 1 120 5 7 XP
Ivanov C2D 2.83 1024 ext PCI-E 512 SATA 3 700 5 7 XP
Petrov C2E 1.50 2048 b PCI-E 512 SATA 2 500 3 5 Ubuntu
Pronin C2E 2.00 2048 ext PCI-E 1024 SATA 5 1000 8 7 VISTA
Pavlow Athlon 3.20 4096 ext AGP 512 IDE 3 750 6 5 XP
Korsikov Celeron 1.50 512 ext AGP 128 IDE 1 120 3 4 XP
Savelyev C2E 3.20 4096 ext PCI-E 1024 SATA 4 950 7 6 XP
Sidorov Phenom 2.83 512 b AGP 256 IDE 2 350 4 4 VISTA
Potapov Celeron 3.00 512 ext AGP 128 IDE 1 120 1 4 XP

Вторая сохранена под именем CPU2.txt, третья- CPU3.txt

Выходные данные

Выходные данные находятся в файлах out.txt, out2.txt и out3.txt, содержащие данные о количество запросов условия: количество процессоров и объём памяти, а также таблицы с данными, удовлетворяющие этим условиям.

Дневник отладки

При распечатке протокола были допущены следующие недочёты: на вызов команды cat out2.txt терминал выдал сообщение об ошибке: No such file or directory. Ошибка была устранена.

Из-за ограниченности возможностей принтера и большого объёма таблицы, при распечатке протокола часть таблицы не поместилась, но это не повлияло особым образом на результат работы.

Распечатка протокола выполнения работы:

Наши рекомендации