
- •1. Формулировка задачи
- •2. Представление данных и ограничения
- •3. Описание функций программы
- •3.1. Иерархическая схема
- •3.2. Прототипы функций
- •4. Алгоритм решения задачи
- •5. Тестовые наборы данных и реакции
- •6. Исходный текст программы
- •Описание тестирования программы
- •Анализ работы по решению задачи
5. Тестовые наборы данных и реакции
Таблица 5.1. Тест реакции для чисел.
№ теста |
Входные данные |
Результат работы программы |
Результат проверки |
1 |
0101 1010101 100101 |
B Vsevo vvedeno 3 strok i 17 simvolov. Minimalnaia dlinna stroki 4, maksimalnaia - 7. Kod pervoi stroki - 5. Kod stroki 2 - 85. 2 vhogdenii obraza. Kod stroki 3 - 37. 1 vhogdenii obraza. Maksimalnoe vhogdenie obraza 2 ras v stroke 2. |
верно |
2 |
10101 1010101 1001010 1111000011110000 1010101010101010 111010101 101111101 |
Vsevo vvedeno 7 strok i 69 simvolov. Minimalnaia dlinna stroki 5, maksimalnaia - 16. Kod pervoi stroki - 21. Kod stroki 2 - 85. 2 vhogdenii obraza. Kod stroki 3 - 74. Net vhogdenii obraza. Kod stroki 4 - 61680. Net vhogdenii obraza. Kod stroki 5 - 43690. 6 vhogdenii obraza. Kod stroki 6 - 469. 2 vhogdenii obraza. Kod stroki 7 - 381. Net vhogdenii obraza. Maksimalnoe vhogdenie obraza 6 ras v stroke 5.Maksimalnoe vhogdenie obraza 6 ras v stroke 5. |
верно |
3 |
10101 1010101 001001010 1111111111111111 |
Vsevo vvedeno 4 strok i 37 simvolov. Minimalnaia dlinna stroki 5, maksimalnaia - 16. Kod pervoi stroki - 21. Kod stroki 2 - 85. 2 vhogdenii obraza. Kod stroki 3 - 74. Net vhogdenii obraza. Kod stroki 4 - 65535. Net vhogdenii obraza. Maksimalnoe vhogdenie obraza 2 ras v stroke 2. |
верно |
6. Исходный текст программы
Исходный текст программы находится в файле obras.c
#include <stdio.h>
#pragma hdrstop
#include <string.h>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
#define dlina 20
void readwritefile(int* b, int* l, int* m)
/*****
Вход: |
Значение ‘f’ переменной k. |
Действие: |
Считывает из файла строки в массив char d[dlina]. Длину строки записывает в массив int l[8]. Преобразует строки d в соответствующую ей ячейку массива int b[8]. Считает количество строк m. |
Выход: |
Массивы b, l и переменная m. |
*****/
{
int i = 0, r;
int j;
char d[dlina];
FILE *f;
f = fopen("file.txt", "rb");
while (!feof(f))
{
fgets( d, dlina, f);
if (feof(f))
{
l[i] = strlen(d);
} else
{
l[i] = strlen(d)-2;
}
r = 1;
b[i] = 0;
for ( j = l[i]; j > 0; --j)
{
b[i] += r * (d[j-1]-48);
r *= 2;
}
printf( "Stroka: %s ", d);
printf( "kod stroki: %d.\n", b[i]);
++i;
}
fclose(f);
m[0] = i;
}
void readwritecons(int* b, int* l, int* m)
/*****
Вход: |
Значение ‘c’ переменной k. |
Действие: |
Считывает с клавиатуры строки в массив char d[dlina]. Длину строки записывает в массив int l[8]. Преобразует строки d в соответствующую ей ячейку массива int b[8]. Считает количество строк m. |
Выход: |
Массивы b, l и переменная m. |
*****/
{
int i, r, j, h;
char d[dlina];
printf("Vvedite chislo strok.");
scanf("%d", &h);
gets(d);
for (i = 0; i < h; i++)
{
gets(d);
l[i] = strlen(d);
r = 1;
b[i] = 0;
for ( j = l[i]; j > 0; --j)
{
b[i] += r * (d[j-1]-48);
r *= 2;
}
}
m[0] = i;
}
void mask(int* l, int* maska)
/*****
Вход: |
Длинна первой строки(битовый образ). |
Действие: |
Создает число из всех единиц единиц, количество которых равно количеству цифр в двоичной записи первого числа (маску). |
Выход: |
Переменная maska. |
*****/
{
int i, j;
j = 1;
maska[0] = 1;
for (i = 1; i < l[0]; i++) {
j *= 2;
maska[0] += j;
}
}
void raschet(int* b, int* l, int* c, int* m , int* maska)
/*****
Вход: |
Массивы b, l, maska и переменная m. |
Действие: |
Подсчитывает количество вхождений образа в строки и записывает в массив с. |
Выход: |
Массив с. |
*****/
{
int i, j, r, e, obr;
obr = b[0];
for (i = 1; i < (m[0]); i++)
{
e = b[i];
j = l[i];
c[i] = 0;
while ((e >= obr) && (j >= l[0]))
{
r = e & maska[0];
printf("%d ", r);
if (r == obr){ ++c[i];}
e = e >> 1;
--j;
}
}
}
void vivod(int* b, int* l, int* c, int* m, char* k)
Void vivod( b, l, c, m, k);
/*****
Вход: |
Массивы b, l, c и переменнst m и k. |
Действие: |
Выводит все полученные в ходе вычислений данные на экран или в файл. |
Выход: |
Нет. |
*****/
;
{
int m1, m2, n, i, c1, c2;
n = l[0];
m1 = l[0];
m2 = l[0];
c1 = c[1];
c2 = 1;
for (i = 1; i < m[0]; i++) {
if (l[i] < m1 ) {m1 = l[i];}
if (l[i] > m2 ) {m2 = l[i];}
if (c[i] > c1 ) {c1 = c[i]; c2 = i;}
n += l[i];
}
printf("\nVsevo vvedeno %d strok i %d simvolov.\n", m[0], n);
printf("Minimalnaia dlinna stroki %d, maksimalnaia - %d.\n", m1, m2);
printf("Kod pervoi stroki - %d.\n", b[0]);
for (i = 1; i < m[0]; i++) {
printf("Kod stroki %d - %d. ", i + 1, b[i]);
if (c[i] == 0) {
printf("Net vhogdenii obraza.\n");
}else
{
printf("%d vhogdenii obraza.\n", c[i]);
}
}
printf("Maksimalnoe vhogdenie obraza %d ras v stroke %d.\n", c1, c2+1);
if (k = 'f') {
FILE *f;
f = fopen("file2.txt", "wt");
fprintf(f, "\nVsevo vvedeno %d strok i %d simvolov.\n", m[0], n);
fprintf(f, "Minimalnaia dlinna stroki %d, maksimalnaia - %d.\n", m1, m2);
fprintf(f, "Kod pervoi stroki - %d.\n", b[0]);
for (i = 1; i < m[0]; i++) {
fprintf(f, "Kod stroki %d - %d. ", i + 1, b[i]);
if (c[i] == 0) {
fprintf(f, "Net vhogdenii obraza.\n");
}else
{
fprintf(f, "%d vhogdenii obraza.\n", c[i]);
}
}
fprintf(f, "Maksimalnoe vhogdenie obraza %d ras v stroke %d.\n", c1, c2+1);
fclose(f);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int b[8], l[8], c[7], maska[1], m[1];
char k[1];
int k1;
printf("Vvedite \"f\" dla vvoda informacii is faila, \"c\" - dla vvoda s klaviatyri.\n");
scanf("%c", &k[0]);
if(k[0] == 'f')
{
readwritefile( b, l, m);
} else
{
readwritecons( b, l, m);
};
mask(l, maska);
raschet( b, l, c, m , maska);
vivod( b, l, c, m, k);
printf("Vvedite liboi simvol dlia zakritiia programi.\n");
scanf("%d", &k1);
return 0;
}