Задание №6 к курсовому проекту.

Обработка последовательной файловой структуры

Задание на 2011 год

Задание

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

Действие по выборке данных из файла оформить в виде отдельной программы с параметрами запроса, вводимыми изстандартного входного текстового файла, или получаемых из командной строки Unix. Второй способ задания параметров обязателен для работ, оцениваемых на хорошо и отлично. Параметры задаются с помощью ключей -f (распечатка файла) или -p (параметры конкретного варианта задания). Получение параметров из командной строки производится с помощью стандартных библиотечных функций argc и argv.

Структуры данных и константы, совместно используемые программами, следует вынести в отдельный заголовочный файл.

В процессе отладки и тестирования рекомендуется использовать команды обработки текстовых файлов ОС Unix и переадресацию ввода-вывода. Сгенерированные и отформатированные тестовые данные необходимо заранее поместить в текстовые файлы и распечатывать при протоколировании. Рекомендуется подобрать реальные и правдоподобные тестовые данные. Число наборов тестовых данных должно быть не менее трех. Имя файла с бинарными данными является обязательным параметром второй программы.

Отчет должен содержать оценку пространственной и временной сложности использованного алгоритма. В состав отчета также рекомендуется включить графическую иллюстрацию структуры файла и запроса на выборку.

Варианты заданий

Содержимое и структура файла

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

12-21. Информация об успеваемости студентов данной группы по всем предметам: фамилия, инициалы, пол, номер группы, отметки по экзаменам и зачетам.

22-31. Сведения о вступительных экзаменах абитуриентов: фамилия, инициалы, пол, номер школы. наличие медали. оценки в баллах и зачет/незачет по сочинению.

32-39. Информация о пассажирах аэропорта: фамилия, инициалы, количество вещей, общий вес вещей, пункт назначения, время вылета. наличие пересадок, сведения о детях.

40-47. Ообщая информация о выпускниках школы студента: фамилия, инициалы, пол, номер класса, буква класса, в какому ВУЗ-е учится, где работает, в каком полку служит и т. п.

По усмотрению преподавателя задачи могу быть сформулированы, в соответствии с номером группы, для сотрудников фирмы (1), преподавателей кафедры (2), больных в больнице (3), жильцов дома (4), рейтинговых таблиц спортсменов (5), хит-парадов(6), осужденных в местах заключения (7), залогадателей ломбарда (8), клиентов службы знакомств (9), покойников на кладбище (10), покупателей интернет-магазина (11), абонентов телефонных компаний (12), владельцев автомобилей (13) и т. д.

Действия (Звездочкой обозначены более сложные задания).

  1. Найти всех владельцев двухпрофессорынх компьютеров, имеющих е более p внешних устройств.
  2. *Напечатать список однофамильцев, имеющих однотипные компьютеры.
  3. *Распечатать типичные конфигурации компьютеров в группе (более p владельцев).
  4. Отпечатать список студентов, компьютеры которых нуждаются в апгрейде (более p устройств).
  5. *Для всех студентов, имеющих более одного компьютера, распечатать сведения о самом мощном из них.
  6. Распечатать сведения обо всех компьютерах-серверах и рабочих станциях.
  7. Составить аннотированный список неукомплектованных компьютеров (некомплект - p устройств).
  8. Составить список мультимедийных компьютеров и бездисковых рабочих станций.
  9. Составить список плохо сконфигурированных компьютеров.
  10. Составить список компьютеров с фирменными комплектующими.
  11. Перечислить все компьютеры студентов группы, платформа которых отлична от Wintel.
  12. Выяснить, сколько студенток группы p получают стипендию.
  13. Выяснить, сколько студенток группы p имеют ровно одну пятерку.
  14. Выяснить, сколько студентов группы p имеют больше двух троек.
  15. Напечатать список потенциальных стипендиатов — студентов, у кторых одна тройка, а все остальные оценки четверки и пятерки или все пятерки и одна четверка.
  16. Найти фамилии лучших стеднток курса (не имеющих отметок ниже четырех и по сумме баллов не уступающих другим студентам своей группы).
  17. Выяснить, в какой группе студентки имеют максимальный средний балл.
  18. *Выяснить в какой группе разность между максимальным и минимальным средним баллом студентов максимальна.
  19. *Выяснить, в какой группе учится максимальное число студентов с минимальным на курсе средним баллом.
  20. *Выяснить, в какой группе учится максимальное число студенток с максимальным на курсе средним баллом.
  21. *Напечатать список p лучших студентов курса (с наивысшими средними баллами).
  22. Найти абитуриентов-медалистов, не набравших проходной балл p.
  23. Найти абитуриентов-медалистов, получивших неудовлетворительную оценку по математике.
  24. Найти абитуриентов, имеющих заданную сумму баллов p.
  25. Найти абитуриентов, имеющих сумму баллов от p1 до p2.
  26. Найти абитуриентов-немедалистов. суммарный балл которых выше среднего.
  27. Найти абитуриенток, получивших по двум предметам одинаковые оценки.
  28. Найти абитуриенток, имеющих по всем предметам разные оценки.
  29. Найти абитуриентов, получивших максимальную оценку по одному предмету, но не набравших проходного балла p.
  30. Найти абитуриенток. получивших одинаковые оценки по всем предметам, но не набравшим проходного балла p.
  31. *Найти абитуриентов. имеющих полупроходной балл, при наличии p мест на факультете.
  32. Найти пассажиров, вес багажа которых отличается от максимального веса менее чем на p кг.
  33. *Найти пассажира, средний вес вещей багажа которого отличается не более чем на p кг от среднего веса вещей пассажиров для каждого рейса.
  34. Найти пассажиров, имеющих более p вещей.
  35. Найти пассажиров, число вещей которых превосходит среднее число вещей не менее, чем на piner/
  36. *Определить, имеются ли два пассажира, багаж которых совпадает по числу вещей и различается по весу не более чем на p кг.
  37. Выяснить, имеется ли пассажир. багаж которого состит из p1 вещей весом не мене p2 кг.
  38. *Дать сведения о пассажирах, число вещей которых ен меньше, чем в любом другом багаже, а вес вещей не больше, чем в любом другом багаже с этим же число вещей.
  39. Выяснить, имеется ли пассажир, багаж которого превышает багаж каждого из остальных пассажиров и по числу вещей и по весу.
  40. *Выяснить, имеются ли в школе однофамильцы.
  41. *Выяснить, имеются ли однофамильцы в каких-либо параллельных классах.
  42. *Выяснить, имеются ли однофамильцы в каком-нибудь классе.
  43. *Выяснить, в каком классе учится максимальноке число учениц.
  44. Выяснить, на сколько учеников в p-х классах школы больше, чем в десятых.
  45. *Найти среднее число учениц в классах школы.
  46. *Найти классы. в которых число учеников больше числа учениц.
  47. Найти классы, выпускники которых либо поступили в вузы, либо призваны на военную службу.

Пример

Тип данных: имя и фамилия, возраст. Задание: вывести имя и фамилию всех людей, которые младше среднего возраста. Проект состоит из трех файлов: person.h, persons_dump.c, young_persons.c

person.h:

#ifndef __person_h__
#define __person_h__

typedef struct {
  char name[50];
  int age;
} person;

#endif

persons_dump.c:

#include 
#include 
#include 

#include "person.h"

void usage()
{
  printf("Usage: program filename\n"); 
}

int readperson(person *p)
{
  return scanf("%\t%d\n", p->name, &p->age) == 2;
}

int main(int argc, char* argv[])
{
  if (argc != 2) {
    usage();
    return 1;
  }
  person p;
  FILE *out = fopen(argv[1], "w");
  if (!out) {
    perror("Can't open file");
    return 2;
  } 
  while (readperson(&p))
    fwrite(&p, sizeof(p), 1, out);
  return 0;
}

young_persons.c:

#include 
#include 

#include "person.h"

/*
Программа загружает данные из бинарного файла
и выводит имена и фамилии людей,
возраст которых меньше среднего.
*/

void usage()
{
  printf("Usage: program filename\n");
}

int main(int argc, char* argv[])
{
  if (argc != 2) {
    usage();
    return 1;
  }
  person p;
  FILE *in = fopen(argv[1], "r");
  if (!in) {
    perror("Can't open file");
    return 2;
  }
  int age_sum = 0;
  int n = 0;
  while (fread(&p, sizeof(p), 1, in) == 1) {
    age_sum += p.age;
    ++n;
  }
  fseek(in, 0, SEEK_SET);
  if (n == 0) {
    printf("No people, average age is not defined\n");
    return 3;
  }
  double avg = (double)age_sum / n;
  while (fread(&p, sizeof(p), 1, in) == 1)
    if (p.age < avg)
      printf("%s\n", p.name);
  return 0;
}