Программирование на языке высокого уровня
1. Задание
Дан файл, состоящий сведения о владельцах
автомобилей. Структура записи файла:
· Фамилия и инициалы владельца
· Марка автомобиля
· Номер автомобиля
Написать программу, которая печатает
ü Фамилию владельца автомобиля с
заданным номером
ü Фамилии владельцев и номера
автомобиля данной марки (в алфавитном порядке)
ü Количество автомобилей каждой марки
2. Описание применения
.1 Запуск программы
Запуск программы (файл proga.cpp)
можно выполнить из среды TurboC
3.0 (или Dev-Cpp)
либо из командной строки MSDOS,
введя proga.exe
2.2 Входные данные
Входные данные программы находятся в созданном
файле. Число строк в файле - произвольное. Каждая строка содержит информацию о
владельцах(до 17 символов), марку автомобилей (до 7 символов), номера
автомобилей(6 символов). Пример строки файла:
A.S. Nissan P990CC
Пример входного файла приведен в приложении 2.
По запросу программы с клавиатуры необходимо ввести номер пункта меню (см.
раздел 2.3).
2.3 Выходные данные
Программа выводит на экран меню, представленное
на рисунке 1 :
Рис.1
Привыборепункта2наэкранвыводитсясообщение:
Vveditenomermashini
После ввода номера машины например P990CC
выводится результат представленный на рисунке 2 :
Рис. 2
Примеры выходных данных для остальных пунктов
меню см. в приложении 3.
2.4 Сообщения программы
Ниже приводится перечень возможных сообщений
программы:
. faila
BAZA net
. Vibirete
nomer punkta
menu
. marki
«…» net
. Dlya
vihoda v
menu najmite
lubyu knopky
. vvedite
nomer mashini
. Nomer
vveden ne
pravelno
. vvedite
marku mashini
. Vvidite
nomer ot
1 do 5
3. Описание программы
.1 Метод решения задачи
Задачу можно разбить на четыре отдельные
подзадачи:
Вывод на экран содержимого файла BAZA.txt
Поиск по номерам
Поиск владельца и номера по марке
Количество автомобилей каждой марки
Чтобы пользователь мог выбирать, какие подзадачи
решать и в каком порядке, программа выводит на экран меню (см. Рис. 1).
3.2 Структура программы
Рис.3. Функциональная структура программы
Программа состоит из шести функций: главной
функции main и пяти
подпрограмм:
SORT -
сортировка файла по времени отправления
PUN1 - функция
вывода файла по десять строк- функция вывода информации о владельце и марке-
функция вывода информации о владельце и номере- функция вывода информации о
количестве каждой марки машин
3.3 Описание функций
.3.1 main
- главная функция
Заголовок функции:
intmain
()
Значение функции:
- в если входной файл не найден;
- в случае успешного завершения
Рабочие данные:
f - указатель на
структуру с информацией о входном файле;
n - номер пункта
меню.
Рис.4. Блок-схема функции main()
3.3.2 PUN1-
функция вывода файла по десять строк
Заголовокфункции:
voidPUN1
(TAB *pz,
intl);
Рис.5. Блок-схема
функцииPUN1
(TAB *tab, intl)
3.3.3 PUN2 - функция вывода
информации о владельце и марке
Заголовок функции:(TAB
*tab, intl)
Рабочие данные:
i,j,p,u-счетчики
Рис.6. Блок-схема
функции
PUN2 (TAB *tab, intl)
3.3.4 PUN3
- функция вывода информации о владельце и номере
Заголовок функции:
voidPUN3(TAB
*tab, intl)
Рабочие данные:
i, j,
z, t-счетчик
mar[]-введенная
марка машины
Рис.7. Блок-схема функции PUN3
(TAB *tab,
intl)
3.3.5 PUN4 - функция вывода
информации о количестве каждой марки машин
Заголовок функции:
voidPUN4(TAB
*tab, intl)
Рабочие данные:
w-количество машин
z,j
- счетчики
Рис.8. Блок-схема функции PUN5(TAB
*tab, intl)
3.3.6 SORT
- сортировка файла
Заголовок функции:
void SORT (TAB *pz, int l)
Рис.9. Блок-схема функции SORT (TAB *pz, int l)
4. Отладка программы
.1 Проектирование тестов
.1.1 Тесты черного ящика
Для проектирования тестов программы методами
черного ящика [1] с помощью эквивалентного разбиения входных/выходных данных на
области (классы) эквивалентности составлен список ситуаций, каждая из которых
должна создаваться хотя бы одним тестом. Тестовые ситуации приведены в табл.
4.1, в скобках указаны их номера.
Таблица 4.1 Области входных/выходных данных
тестов программы
Входное/выходное
условие (значение)
|
"Правильные"
классы эквивалентности
|
"Неправильные"
¦ классы эквивалентности
|
Номер
пункта меню
|
1..5(1)
|
<1
(2), >5 (3)
|
Входной
файл
|
существует
(4),
|
не
существует (5)
|
Номер
машины
|
существует
(6), не найден(7)
|
Введен
не правильно(8)
|
Марка
машины
|
существует
(9), не найдена
|
|
Для создания перечисленных тестовых ситуаций
разработаны тесты, представленные в табл. 4.2. Входные и выходные данные тестов
по возможности выбирались ближе к границам классов эквивалентности.
файл программирование
черный ящик
Таблица 4.2. Тесты черного ящика для отладки
программы
|
Вход
|
Выход
|
Осн.
сит.
|
1
|
Номер
пункта меню n=9
|
Нужно
вводить номера от 1 до 5
|
3
|
2
|
Номер
пункта меню n=1
|
Вызов
функции PUN1(pz, l)
|
1
|
3
|
Номер
пункта меню n=0
|
Нужно
вводить номера от 1 до 5
|
2
|
4
|
Входной
файл существует
|
Меню
|
4
|
5
|
Входной
файл не существует
|
Файл
«BAZA.txt»
не найден
|
5
|
6
|
Вывод
информации о машине
|
6
|
7
|
С055PM
|
Информация
о машина не найдена
|
7
|
8
|
Т5555В
|
Не
корректно введен номер
|
8
|
9
|
Lada
|
Вывод
информации о владельцах этой марки
|
9
|
10
|
KIA
|
Информации
о владельцах этой марки нет
|
10
|
4.1.2 Тесты белого ящика
Разработанные тесты проверены методами белого
ящика [1] по критериям охвата основных путей выполнения алгоритмов модулей. В
программе имеются составные условия. Поэтому использован критерий
комбинаторного покрытия условий (см. табл. 4.3).
Таблица 4.3. Комбинаторное покрытие условий
тестами черного ящика
Модуль
|
Элементарное
условие
|
Номера
тестов
|
|
|
Истина
|
Ложь
|
main
|
if((n>'0')&&(n<'5'))
|
1
|
2, 3
|
main
|
if(file==NULL)
|
5
|
4
|
PUN2
|
for(j=0;j<6;j++) {if
((j==0)||(j==4)||(j==5)) {if ((r[j]<'A')||(r[j]>'Z')) p++;} else if
((r[j]<'0')||(r[j]>'9')) p++; }
|
6,7
|
8
|
PUN3
|
if(strcmp(tab[j].marka,mar)==0)
|
9,10
|
|
Литература
.
Хохлов Д.Г. Основы технологии модульного программирования. Учебное пособие. -
Казань. Изд-во Казан. гос. техн. ун-та , 2005. - 63 с.
.
Хохлов Д.Г. Структуры данных и комбинаторные алгоритмы. Учебное пособие. -
Казань: Изд-во Казан. гос. техн. ун-та, 2005. - 102 с.
3.
Хохлов Д.Г., Захарова З.Х. Практикум по структурам данных и комбинаторным
алгоритмам: Учебное пособие.- Казань: Изд-во Казан. гос. техн. ун-та, 2005. -
48 с.
4.
Бикмурзина А.Р. Лабораторный практикум по программированию. - Казань: Изд-во
Казан. гос. техн. ун-та, 2000г.
Приложение 1
Текст программы
#include<stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100BAZA
{fio[20];marka[10];nomer[9];
};TAB
{fio[20];marka[10];nomer[9];
};SORT (TAB *tab, int l);PUN1 (TAB
*tab, int l);PUN2 (TAB *tab, int l);PUN3 (TAB *tab, int l);PUN4 (TAB *tab, int
l);main()
{ FILE *f;BAZA b;TAB tab[MAX];n;l=0,
i, s, nomer;((f=fopen("BAZA.txt","r"))==NULL)
{puts ("faila poezd
net");();0;
}(fgets((char*)&b,sizeof(struct
BAZA),f)!=NULL)
{.fio[19]='\0';(tab[l].fio,
b.fio);.marka[9]='\0';(tab[l].marka, b.marka);
b.nomer[8]='\0';(tab[l].nomer,
b.nomer);
l++;
}(tab, l);
{
//clrscr();("cls");("---------------------------------------------------------------------");("Vibirete
nomer punkta menu:");("1-polnaya informazia o
vladelcah");("2-poisk po nomeru");("3-poisk vladelca i
nomera po marke");
puts("4-kolichestvo avtomobilei
kajdoi marki");
puts("5-vihod");("---------------------------------------------------------------------");=getche();(n)
{ case '1':PUN1(tab,
l);break;'2':PUN2(tab, l);break;'3':PUN3(tab, l);break;'4':PUN4(tab,
l);break;'5':break;:puts("Vvidite nomer ot 1 do 5");
}(n!='5')
}
}(n!='5');(f);1;
}PUN1 (TAB *tab, int l)
{int j=0, z=1;
{
//clrscr();("cls");("\n Familia I.O. | Marka | Nomer
");("------------------------------------------");(j;j<l;
j++)
{ if (j<(10*z))("\n %s | %s
| %s", tab[j].fio, tab[j].marka, tab[j].nomer);
{ z++;("\nNajmite lubyu knopky
chto bi vivesti sled 10");getch();;("cls");
}
}
}(l>j);
}PUN2(TAB *tab, int l)
{int j, u=0,i,z=0;p=0;r[9];
//clrscr();("cls");("\nvvedite
nomer mashini\n");(r);
//clrscr();("cls");(j=0;j<6;j++)
{((j==0)||(j==4)||(j==5))
{if ((r[j]<'A')||(r[j]>'Z'))++;}((r[j]<'0')||(r[j]>'9'))++;
}(p==0)
{ puts("\n Familia I.O. | Marka
| Nomer ");("------------------------------------------");(i=0;
i<l; i++)
{ z=0;(j=0; j<6; j++)
{if (tab[i].nomer[j]==r[j])
{z++; }
}(z==6)
{ printf ("\n %s | %s |
%s", tab[i].fio, tab[i].marka, tab[i].nomer);u++;}
}(u==0)
{//clrscr();("cls");("Takogo
nomera net");}
}("Nomer vveden ne
pravelno");
}PUN3(TAB *tab, int l)
{ int i, j, z=0, t=0, n;mar[20];
//
clrscr();("cls");("vvedite marky mashini");
gets(mar);=strlen(mar);
//
clrscr();("cls");("\n Familia I.O. | Marka | Nomer
");("------------------------------------------");(j=0; j<l;
j++, z=0)
{ for (i=0; i<n; i++)
{if (tab[j].marka[i]==mar[i])
{z++; }
}(tab[j].marka[i]==' ' ||
tab[j].marka[i]=='\0')
{ if (z==n)
{ printf ("\n %s | %s |
%s", tab[j].fio, tab[j].marka, tab[j].nomer);
t++;
}
}
}(t==0)
{ //clrscr();("cls");
printf ("\nmarki %s net",
mar);
}
}PUN4(TAB *tab, int l)
{mar[10];z=0,j,i,q;w=1;("cls");
//q=strlen(tab[0].marka);
//strcpy(mar,tab[0].marka);("\n
Marka | Kolichestvo ");(j=0; j<l; j++)
{
if(strcmp(tab[j+1].marka,tab[j].marka)>0)
{printf("\n %s | %.0f",
tab[j].marka, w);=1;
/*strcpy(mar,tab[j].marka);-*/}
{++;
}
}
}SORT (TAB *tab, int l)
{ int i, j;t;fio[20], mar[10], nomer
[7];(i = 0 ; i < l ; i++)
{ for(j = 0 ; j < l - i - 1 ;
j++)
{ for (t = 0 ; t < 10 ;
t++)(strcmp(tab[j].marka,tab[j+1].marka)>0)
{(fio,tab[j].fio);
strcpy(tab[j].fio,tab[j+1].fio); strcpy(tab[j+1].fio,fio);(mar,tab[j].marka);
strcpy(tab[j].marka,tab[j+1].marka);
strcpy(tab[j+1].marka,mar);(nomer,tab[j].nomer);
strcpy(tab[j].nomer,tab[j+1].nomer); strcpy(tab[j+1].nomer,nomer);
}
}
}
}
Приложение 2
Пример входного файла poezd.txt
IvanovA.P. ToyotaB540CT.S.
NissanP990CC.A. NissanB571BP.A. LadaC111CC.I. HummerC777CX.A. LadaC415TO.V.
DachaC789TO.Z. RenaultT894TO.I. LadaT561BE.G. LotusB565BO.B. HondaC717COI.F.
Lada C556TOE.G. Opel C413EOM.A. Toyota P891XOM.D. Lada X013PXM.I. Nissan
B670POT.I. Honda X518TOG.I. Lada P533TOV.A. Nissan T560TTD.R. Cherry C660TOI.A.
Lada T781TPA.I. Dacha A617AEG.D. Honda A415BOP.S. Renault O819TOA.S.
LotusT890AA
Приложение
3
Результаты тестирования программы
Тест 1. Входного файла нет в текущем каталоге.
Результат:BAZA
net
Тест 2.
Рис.
Выбираем пункт 1:
Рис.
Рис.
Рис.
Тест3
Рис.
Выбираем пункт 2:
Номер машини Р990СС
Рис.
Тест4 .
Рис.
Выбираем пункт 3:
Название марки автомобиля: Nissan
Рис.
Тест5
Рис.
Выбираем пункт 4:
Количество автомобилей каждой марки
Рис.
Тест 6 . Неверно выбран номер пункта меню
Рис.
Выбираем не существующий пункт, к примеру 6
Рис.