Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа ИС Эльде Е.В.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
67 Кб
Скачать
☆

Лабораторная работа №3

Тема: «Операции над списками и арифметические операции»

Цель работы

Изучить правила создания и работы со списками в языке Турбо-Пролог

Выполнение работы

1. Определить число элементов в списке.

domains

List=integer

i=integer

i_list=i*

Predicates

sumlist(i_list,i)

clauses

sumlist([],0).

sumlist([_|T],Sum):- sumlist(T,Sum1), Sum=1+Sum1.

2. Определить произведение элементов списка.

domains

List=integer

i=integer

i_list=i*

Predicates

sumlist(i_list,i)

clauses

sumlist([],1).

sumlist([H|T],Sum):- sumlist(T,Sum1), Sum=H*Sum1.

Лабораторная работа №4

Тема: «Базы данных в Турбо Прологе»

Цель работы

Изучить правила позволяющие работать с базами данных на языке Турбо Пролог

Выполнение работы

1.Создать БД, содержащую сведения о пассажирах:

Ф.И.О., количество мест, вес багажа.

Определить, есть ли пассажиры, багаж которых занимает 1 место и вес багажа больше 30 кг.

domains

i=integer

database

passengers(symbol,i,i)

Predicates

skaner

clauses

passengers(igor,2,10).

passengers(stas,2,35).

passengers(voktor,1,20).

skaner:- passengers(_,P,W),P=2,W>30.

Лабораторная работа №5

Тема: «Сегментация изображения содержащего оптический образ текста»

Цель работы

Исследовать механизм сегментация изображений содержащих оптический образ текста.

Выполнение работы

Задача. Написать алгоритм сегментации изображений содержащих оптический образ текста, при этом изображение содержит несколько строчек текста в каждой из которых несколько букв. Будем считать, что в буквы между собой отделены, по меньшей мере, двумя вертикальными колонками из белых пикселей. Строчки текста строго горизонтальны

#include <iostream>

#include <windows.h>

#include <fstream>

#include<ctime>

using namespace std;

typedef unsigned short WORD ;

// перевод в двоичное представление

string Num2Bin(unsigned char num)

{

std::string output;

int count=0;

while(num/1 > 0)

{

if (num%2 == 1) output = ' '+output;

else output = 'X'+output;

num /= 2;

count++;

}

for(int i=0 ;i< 8-count;i++){

output = 'X'+output;

}

return output;

}

char ** CopyImgToArray(unsigned char *imgBuf,int OffBits,int Height,int Width){

unsigned char *LineBuf;

unsigned int line2Size=Width+(32-Width%32);

// вычисляем количество байт

// предназначенных для одной линии

// с учетом выравнивания по 4 байта

if (line2Size<32) {

line2Size=32;

}

LineBuf=(unsigned char*) malloc(line2Size);

int nLine=0;

unsigned int countChar=0;

string ReadLine;

// строка изображения в двоичном коде

// создание двумерного массива интерпертируюшего изображение

char** arrBMP=new char * [Height] ;

for (int i=0; i<Height; i++){

arrBMP[i] = new char [Width];}

for (int i=0;i<Height/2+Height%2; i++ ) {

memcpy(LineBuf,imgBuf+OffBits+(line2Size)/4*i,

(line2Size)/4);

countChar=0;

for (unsigned int j=0;j<line2Size/4; j++ ) {

ReadLine = ReadLine+

Num2Bin((unsigned char)*(LineBuf+j) );

if ((countChar+8==line2Size)) {

countChar=0;

nLine++;

if (Height>= nLine) {

for(int p=0; p<Width; p++){

arrBMP[int(Height- nLine)][p]=

ReadLine[p];}

}

ReadLine="";

}

else {countChar+=8;}

}

}

return arrBMP;

}

char ** GetImg(string fPath, int* Height,int* Width){

tagBITMAPFILEHEADER bmp;

tagBITMAPINFOHEADER inf;

size_t lSize;

unsigned char *imgBuf;

FILE *fp;

char **arrBMP;

fp=fopen(fPath.c_str(),"rb");

if (fp == NULL) {

//если открытие файла прошло корректно, то

cout<<" File not exists"<<endl;

* Height=0;

* Width=0;

}

else {

fseek (fp , 0 , SEEK_END);

lSize = ftell (fp); // размер файла

rewind (fp);

fread(&bmp, sizeof(bmp), 1, fp);

// заполняем структуру bmp данными из файла

if (bmp.bfType == 0x4d42){

//символы «BM» проверяем, что прочитанный файл

// формата bmp

fread(&inf, sizeof(inf), 1, fp);

// заполняем структуру inf данными из файла

* Height=inf.biHeight;

* Width=inf.biWidth;

imgBuf = (unsigned char*) malloc(lSize);

rewind (fp);

fread(imgBuf, 1,lSize, fp);// считать все

arrBMP=CopyImgToArray(imgBuf,bmp.bfOffBits,

*Height,*Width);

free(imgBuf);

}

fclose(fp); //закрытие потока

return arrBMP;

}

}

void showImg( char **img,int Height,int Width){

for (int i=0;i<Height; i++ ){

for (int j=0;j<Width; j++ ){

cout<< img[i][j];

}

cout<<i <<endl;

}

}

void vyvod(char **img,int width,int x1,int x2,int y1,int y2){

x2=x1;

for (int i=0;i<y2&&x2<width;i++) {

if( img[y1+i][x2]=='X'){break;}

if(i==y2-1){i=0;x2++;}

}

bool endsimvil=false;

while(not endsimvil){

for (int i=0;i<y2&&x2<width;i++) {

if( img[y1+i][x2]=='X'){i=0;x2++;}

//if(i==y2-1){i=0;x2++;}

}

cout<<x2;

if(x2<width){x2++;}else{endsimvil=true;}

for (int i=0;i<y2&&x2<width;i++) {

if( img[y1+i][x2]=='X'){break;}

if(i==y2-1){endsimvil=true;}

}

}

for (int i=y1;i<y2; i++ ){

for (int j=x1;j<x2; j++ ){

cout<< img[i][j];

}

cout <<endl;

}

}

int main(){

char ** pBMP;

int Height, Width;

string p="D:\\55.bmp";

//string p="D:\\ist.bmp";

pBMP =GetImg(p, &Height, &Width);

cout << Height<< endl;

cout << Width<< endl;

showImg(pBMP,Height,Width);

vyvod(pBMP, Width, 0,0,0,Height);

}