Описание переменных и констант
Задание 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. Ошибка была устранена.
Из-за ограниченности возможностей принтера и большого объёма таблицы, при распечатке протокола часть таблицы не поместилась, но это не повлияло особым образом на результат работы.
Распечатка протокола выполнения работы: