МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра САПР
Звіт
до лабораторної роботи №4
на тему «МАСИВИ І ФАЙЛИ В МОВІ ПРОГРАМУВАННЯ С»
з курсу «Проблемно-орієнтовані мови програмування»
ЛЬВІВ 2011
Мета роботи
Навчитися використовувати масиви та користуватися файлами при розв’язанні задач векторного типу.
Теоретичні відомості
Масив - це послідовно розміщені у пам’яті елементи одного типу. Кожен масив має ім’я. Доступ до окремих елементів масиву відбувається по імені масиву та індексу (порядковому номеру) елемента. Основні властивості масивів:
всі елементи масиву мають однаковий тип;
всі елементи масиву розміщені у пам’яті послідовно - один за одним; індекс першого елемента рівний нулю;
ім’я масиву є вказівником-константою, рівною адресі першого елемента масиву.
Ознакою масиву при описі є наявність парних квадратних дужок [ ]. Константа або константний вираз у квадратних дужках задає число елементів масиву.
Загальний вигляд стрічки оголошення одномірного масиву наступний:
тип ім’я_масиву[розмірність];
Наприклад:
int x[10];
float y[20];
char name[18];
С дозволяє використовувати багатомірні масиви. Найпростіший варіант - двомірний масив. Для оголошення двомірного масиву типу integer twodim розмірністю 10 на 20 потрібно описати його наступним чином:
int twodim[10][20];
Будьте уважні, на відміну від інших мов програмування розмірності масиву відокремлені одна від одної квадратними дужками.
Отже, для доступу до елемента з індексами 3, 5 масиву twodim служить наступний запис twodim[3][5]. Наступний приклад демонструє роботу з двомірним масивом, а саме, присвоєння кожному елементу цього масиву суму відповідних індексів:
main()
{
int t, i, num[3][4];
for(t = 0; t < 3; t++)
for(i = 0; i < 4; i++)
num[t][i] = i + t;
}
Загальний вигляд оголошення багатомірного масиву наступний:
тип ім’я[розмірність1][розмірність2]...[розмірність N]
Для прикладу покажемо, як оголосити масив цілого типу розмірністю 4 х 10 х 5 :
int three[4][10][5];
А створення чотирьохмірного масиву 4 х 10 х 5 х 7:
int four[4][10][5][7];
Файл — це іменований об'єкт, що зберігає дані (програма або будь-яка інша інформація) на якому-небудь носії (дискета, вінчестер, CD). Файл, як і масив, - це сукупність даних, тому вони трохи схожі. Однак, вони мають також істотні розбіжності:
файли, на відміну від масивів, розташовуються не в оперативній пам'яті, а на жорстких дисках або на зовнішніх носіях, хоча файл може розташовуватися на так званому електронному диску (в оперативній пам'яті);
файл не має фіксованої довжини, тобто може збільшуватися й зменшуватися;
перед роботою з файлом його необхідно відкрити, а після роботи - закрити.
Говорячи про файли, слід сказати про файлову систему.
Файлова система - це сукупність файлів і керуючої інформації на диску для доступу до файлів. Або по-іншому - це сукупність програмних засобів для доступу до файлів. Існує досить багато файлових систем, ми будемо говорити про одну з них - про файлову систему MS-DOS.
У файловій системі MS-DOS імена файлів складаються із двох частин, розділених крапкою: ім'я файлу й розширення. Поле ім'я файлу може містити не більше 8 довільних символів з набору дозволених для використання в імені файлу. Поле ж розширення може містити не більше 3 символів з того ж набору. Розширення звичайно вказує на тип збереженої інформації або на структуру файлу, і може взагалі бути відсутнім. Приклади найпоширеніших розширень: exe, com, bat, txt, doc, mp3, htm і ін.
Файли зберігаються в каталогах. Каталоги можуть називатися по тій же системі, що й файли. Допускаються вкладені каталоги (підкаталоги).
Розрізняють два види файлів: текстові й бінарні.
Текстові файли можуть бути переглянуті й відредаговані із клавіатури будь-яким текстовим редактором і мають дуже просту структуру: послідовність ASCII-символів. Ця послідовність символів розбивається на рядки, кожна з яких закінчується двома кодами: 13, 10 (0xD, 0хА). Приклади відомих текстових файлів: *.bat, *.c, *.asm.
Бінарні файли - це файли, які не мають структури текстових файлів. Кожна програма для своїх бінарних файлів визначає власну структуру.
Бібліотека мови С містить функції для роботи як з текстовими, так і з бінарними файлами.
Файлова система С спроектована для роботи з великою кількістью пристроїв: моніторами, дисководами, CD-ROM, принтерами, тощо. Незважаючи на те, що кожний з цих пристроїв має свої особливості, файлова система С трансформує їх в логічний пристрій. Таку абстракцію називають потоком.
Всі потоки однакові за поведінкою, але аналогічно до файлів, розрізняють два типи потоків - бінарні і текстові. Текстовий потік - послідовність ASCII-символів, бінарний - послідовність байтів.
Індивідуальне завдання
6. Прочитати з файлу F1 матрицю А(12,14) переставити рядки матриці таким чином, щоб кількість ненульових елементів зростала від першого рядка до останнього.
Текст програми
#include <stdio.h>
#include <conio.h>
int main()
{
int a[12][14],i,j,z[12],c,v,n;
FILE *fp1;
fp1=fopen("f.txt","r+");
for(i=0;i<12;i++)
for(j=0;j<14;j++)
fscanf(fp1,"%i",&a[i][j]);
printf ("Zadana matrycya: \n");
for(i=0;i<12;i++)
{
for(j=0;j<14;j++)
{
printf("%d ",a[i][j]," ");
}
printf ("\n");
}
for(i=0;i<12;i++)
{
z[i]=0;
for(j=0;j<14;j++)
if(a[i][j]==0) z[i]++;
}
for(i=0;i<13;i++)
for(j=0;j<14;j++)
if(z[j+1]<z[j])
{c=z[j];
z[j]=z[j+1];
z[j+1]=c;
n=j;
for(j=0;j<14;j++)
{
v=a[n][j];
a[n][j]=a[n+1][j];
a[n+1][j]=v;
}
}
printf("\n");
printf("Vporyadkovan masiv:\n");
for(i=0;i<12;i++)
{
for(j=0;j<14;j++)
{
printf("%d ",a[i][j]," "); }
printf ("\n");
}
fclose (fp1);
return 0;
}
Результати обчислень
Висновок: Я навчився використовувати масиви та користуватися файлами при розв’язанні задач векторного типу.