Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 10
з курсу „ Засоби системного програмування ”
Тема:
Опрацювання файлів з двійковими даними.
Виконав:
студент групи КІ-2
Львів – 2004
Мета роботи: Закріпити теоретичні знання та оволодіти практичними навиками в створенні програм для опрацювання даних, що міститься в дискових файлах. Засвоїти основні методи читання, запису даних з дискових файлів бінарного типу.
Завдання на лабораторну роботу
Розробити програмне забезпечення зі застосуванням техніки роботи з дисковими файлами відповідно до заданого варіанту.
Програмне забезпечення повинно складатися з декількох модулів. Основна програма вводить та виводить дані які опрацьовуються функціями, що реалізовані як окремі модулі.
Назву текстового файлу, в якому містяться дані для опрацювання, передавати через аргументи функції main().
Розміри та значення елементів матриць (в загальному не квадратних) вводити з текстового файлу. Параметри, що задають кількість рядків та стовпців повинні бути іменованими.
Пам’ять під матриці виділяти динамічно. Для трикутних матриць (опираючись на їх структуру) виділяти мінімальні об’єми пам’яті.
Обмін даними з функцією, що опрацьовує матрицю, виконувати через двійковий файл (тимчасовий). Назва файлу передається функції як параметр. Після використання тимчасовий файл знищувати.
Результати обчислень записувати в текстовий файл.
Назви файлів (тимчасового та для запису результатів) формувати на основі назви файлу з вхідними даними шляхом заміни розширення.
Звернути особливу увагу на обробку помилок, які користувач може зробити при створені текстового файлу з вхідними даними.
При вирішенні задач забезпечити дружній інтерфейс з користувачем.
Варіант 23. Множення квадратної матриці на матрицю стовпець.
Аналіз завдання та опис алгоритму вирішення задачі
Матрицю (двовимірний масив) зберігаємо в одновимірному масиві. Для звертання до елементу m[i][j] використовуємо звертання m[i*x+j], де х – кількість елементів в одному рядку масива.
При множенні двох матриць ми отримуємо нову матрицю, в якій число рядків таке ж як і в першій, а кількість стовпців – як в другій матриці.
Зчитування даних проводиться з файлу, ім’я якого задається через аргументи функції main(). Результати обчислень записуються до файлу з таким же ім’ям, але з розширенням, зміненим на .out.
Для обробки даних використовується функція, яка використовує тимчасовий файл, який створюється на основі вхідного файлу та видаляється після виконання функції.
Текст програми
Файл “Lab10.c”:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include "xmatrix.h"
void Err (int e)
{ printf("ERROR: ");
if (e==0) puts("Wrong argument count!");
else if (e==1) printf("File \"%s\" not found!",name);
else if (e==2) printf("Incorrect matrix size in file \"%s\"!",name);
puts("\nSYNTAX: <prog_name> <input_data_file>");
getchar(); exit(0);
}
void main (int argc,char *argv[])
{
int i, j, *m, *s, *result, x;
char buffer[40], *buf;
FILE *fin, *fout, *ftmp;
clrscr();
if (argc!=2) Err(0);
name=(char*)calloc(40,sizeof(char));
strcpy(name,argv[1]);
if ( !(fin=fopen(name,"rt")) ) Err(1);
do fgets (buffer,40,fin);
while(!strstr(buffer,"Size:\n"));
fscanf(fin,"%d",&x);
if (x<1) Err(2);
m = (int*)calloc(x,sizeof(int));
s = m+x*x;
result = s+x;
do fgets(buffer,40,fin);
while (!strstr(buffer,"First matrix:\n"));
for (i=0;i<x*x;i++) fscanf(fin,"%d",m+i);
do fgets(buffer,40,fin);
while (!strstr(buffer,"Second matrix:\n"));
for (i=0;i<x;i++) fscanf(fin,"%d",s+i);
fclose(fin);
if (buf=strstr(name,".")) *buf='\0';
strcat(name,".tmp");
ftmp=fopen(name,"wb");
fwrite(&m,sizeof(m),1,ftmp);
fwrite(&x,sizeof(x),1,ftmp);
fclose(ftmp);
matrix_mult (name);
if (buf = strstr(name,".")) *buf = '\0';
strcat(name,".out");
fout = fopen(name,"wt");
fprintf(fout,"First matrix is :\n");
for (i=0;i<x;i++) {
for (j=0;j<x;j++) fprintf(fout,"%d ",m[i*x+j]);
fprintf(fout,"\n"); }
fprintf(fout,"\nSecond matrix is:\n");
for (i=0;i<x;i++) fprintf(fout,"%d\n",s[i]);
fprintf (fout,"\nResult of matrix multiplication is:\n");
for (i=0;i<x;i++) fprintf(fout,"%d\n",result[i]);
fclose(fout);
free(m); free(name); free(buffer);
}
Файл “xmatrix.с”:
#include <stdio.h>
void matrix_mult (char* name)
{
int i, j, *m, *s, *result, x;
FILE *ftmp;
ftmp=fopen(name,"rb");
fread(&m,sizeof(m),1,ftmp);
fread(&x,sizeof(x),1,ftmp);
fclose(ftmp);
remove(name);
s = m+x*x;
result = s+x;
for(i=0;i<x;i++)
{ result[i]=0;
for(j=0;j<x;j++) result[i] += m[i*x+j]*s[j];
}
}
Файл “xmatrix.h”:
char *name;
void matrix_mult (char *);
Опис результатів тестування
Для запуска програми в командний рядок потрібно ввести ім’я програми з необхідним аргументом, наприклад:
Lab10.exe data.in , де data.in – файл вхідних даних.
Вміст файла data.in:
Size:
3
First matrix:
1 4 7
2 5 8
3 6 9
Second matrix:
11
22
33
Новий файл з результатами – data.out:
First matrix is :
1 4 7
2 5 8
3 6 9
Second matrix is:
11
22
33
Result of matrix multiplication is:
330
396
462
Висновок: Виконуючи дану лабораторну роботу, я закріпив теоретичні знання та оволодів практичними навиками в створенні програм для опрацювання даних, що міститься в дискових файлах. Засвоїв основні методи читання, запису даних з дискових файлів бінарного типу, використовував передачу параметрів програмі через аргументи функції main(), при вводі невірної кількості параметрів, програма повідомляє про помилку та припиняє свою роботу.