Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 9
з курсу „ Засоби системного програмування ”
Тема:
Опрацювання файлів з текстовою інформацією.
Виконав:
студент групи КІ-2
Львів – 2004
Мета роботи: Закріпити теоретичні знання та оволодіти практичними навиками в створенні програм для опрацювання текстової інформації, що міститься в дискових файлах. Засвоїти основні методи читання, запису даних з дискових файлів текстового типу.
Завдання на лабораторну роботу
Розробити програмне забезпечення зі застосуванням техніки роботи з дисковими файлами відповідно до заданого варіанту.
Програмне забезпечення повинно складатися з декількох модулів. Основна програма вводить та виводить дані які опрацьовуються функціями, що реалізовані як окремі модулі.
Назву текстового файлу, в якому містяться дані для опрацювання, передавати через аргументи функції main().
Розміри та значення елементів матриць (в загальному не квадратних) вводити з текстового файлу. Параметри, що задають кількість рядків та стовпців повинні бути іменованими.
Пам’ять під матриці виділяти динамічно. Для трикутних матриць (опираючись на їх структуру) виділяти мінімальні об’єми пам’яті.
Обмін даними з функцією, що опрацьовує матрицю, виконувати через її аргументи.
Результати обчислень записувати в текстовий файл. Назву файлу для запису результатів формувати на основі назви файлу з вхідними даними шляхом заміни розширення.
Звернути особливу увагу на обробку помилок, які користувач може зробити при створені текстового файлу з вхідними даними.
При вирішенні задач забезпечити дружній інтерфейс з користувачем.
Варіант 23. Множення квадратної матриці на матрицю стовпець.
Аналіз завдання та опис алгоритму вирішення задачі
Матрицю (двовимірний масив) зберігаємо в одновимірному масиві. Для звертання до елементу m[i][j] використовуємо звертання m[i*x+j], де х – кількість елементів в одному рядку масива.
При множенні двох матриць ми отримуємо нову матрицю, в якій число рядків таке ж як і в першій, а кількість стовпців – як в другій матриці.
Зчитування даних проводиться з файлу, ім’я якого задається через аргументи функції main(). Результати обчислень записуються до файлу з таким же ім’ям, але з розширенням, зміненим на .out.
Текст програми
Файл “Lab9.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;
char buffer[40], *buf;
FILE *fin,*fout;
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);
matrix_mult (m, s, result, x);
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.с”:
void matrix_mult (int *m, int *s, int *result, int x)
{int i,j;
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”:
int *m, *s, *result, x;
char *name;
void matrix_mult (int *m,int *s,int *result,int x);
Опис результатів тестування
Для запуска програми в командний рядок потрібно ввести ім’я програми з необхідним аргументом, наприклад:
Lab9.exe data.txt , де data.txt – файл вхідних даних.
Вміст файла data.txt:
Size:
3
First matrix:
1 2 3
4 5 6
7 8 9
Second matrix:
10
20
30
Новий файл з результатами – data.out:
First matrix is :
1 2 3
4 5 6
7 8 9
Second matrix is:
10
20
30
Result of matrix multiplication is:
140
320
500
Висновок: Виконуючи дану лабораторну роботу, я закріпив теоретичні знання та оволодів практичними навиками в створенні програм для опрацювання текстової інформації. Засвоїв основні методи читання, запису даних з дискових файлів текстового типу, використовував передачу параметрів програмі через аргументи функції main(), при вводі невірної кількості параметрів, програма повідомляє про помилку та припиняє свою роботу.