ТОП 10:

Приклад виконання завдання 2



Варіант 6. Розробити програму для виводу на екран суми усіх негативних елементів кожного рядка даного двовимірного динамічного масиву і їх кількості в кожному рядку.

Дана програма буде складатися з основної функції int main(), та п’яти функцій для виконання поставленої задачі.

F2D Create_2D_Mas(F2D m,int str,int stp) - функція призначена для створення масиву;

void Vvod_2D_Mas(F2D m,int str,int stp) - функція призначена для введення масиву;

void Obrobka_2D_Mas(F2D m,int str,int stp) - функція призначена для обчислення суми усіх негативних елементів кожного рядка даного двовимірного динамічного масиву і їх кількості в кожнім рядку;

void Print_2D_Mas(F2D m,int str,int stp) - функція призначена для виведення масиву;

void Clear_2D_Mas(F2D m,int str,int stp) - функція призначена для очистки масиву

Програма буде мати наступний вигляд:

Лістинг програми

#include <stdio.h>

#include <conio.h>

 

typedef float** F2D;

 

F2D Create_2D_Mas(F2D m,int str,int stp);

void Vvod_2D_Mas(F2D m,int str,int stp);

void Obrobka_2D_Mas(F2D m,int str,int stp);

void Print_2D_Mas(F2D m,int str,int stp);

void Clear_2D_Mas(F2D m,int str,int stp);

 

F2D Create_2D_Mas(F2D m,int str,int stp)

{

float *m1;

m1=new float[str*stp];

m=new float*[str];

for(int i=0; i<str;i++)

m[i]=&m1[stp*i];

return m;

}

void Vvod_2D_Mas(F2D m,int str,int stp)

{

for(int i=0;i<str;i++)

for(int j=0;j<stp;j++)

{

scanf("%f",&m[i][j]);

}

}

 

void Obrobka_2D_Mas(F2D m,int str,int stp)

{

float sum;

int i, j, kol;

printf("Masiv\n");

Print_2D_Mas( m, str, stp);

for(j=0; j<stp; j++)

{

sum=0.0;

kol=0;

for(i=0;i<str;i++)

if(m[j][i]<0)

{

sum+=m[j][i];

kol++;

}

printf("Negatuvnuh V %d stroke=%d ih suma=%.2f\n",j+1, kol,sum); // виведення результатів

}

}

 

void Print_2D_Mas(F2D m,int str,int stp)

{

for(int i=0;i<str;i++)

for(int j=0;j<stp;j++)

{

printf("%6.2f ",m[i][j]);

if(j==stp-1) printf("\n");

}

}

int main()

{

clrscr();

F2D arr = NULL; // масив не створено

int str=2, stp=2;

Create_2D_Mas(arr,str,stp);

Vvod_2D_Mas(arr,str,stp);

Obrobka_2D_Mas(arr,str,stp);

Print_2D_Mas(arr,str,stp);

 

getch();

return 0;}

Тестування:

Для перевірки правильності роботи програми введемо в неї дані, при введені яких результат заздалегідь відомий.

Наприклад сформуємо масив 3х3 з 9 елементів такого виду:

1 2 3

-1 -2 -3

1 -2 3

З введених даних наочно видно, що негативних елементів в 1 стрічці 0, їх сума 0, негативних елементів в другій стрічці 3, їх сума -6, негативних елементів в 3 стрічці 1, їх сума -2

Тепер введемо ці ж дані в програму і перевіримо результат.

-1

-2

-3

-2

Masiv

1 2 3

-1 -2 -3

1 -2 3

Negatuvnuh V 1 stroke = 0 ih suma=0

Negatuvnuh V 2 stroke = 3 ih suma=-6

Negatuvnuh V 3 stroke = 1 ih suma=-2

Приклад виконання завдання 3

Варіант 6. Розробити функцію визначення кубічного кореня з заданого члена і програму, що використовує цю функцію для перетворення кожного елемента даного одновимірного динамічного масиву.

Дана програма буде складатися з основної функції int main(), та п’яти функцій для виконання поставленої задачі:

float()*Create_1D_Mas(float*m,int n) - функція призначена для створення масиву;

void Vvod_1D_Mas(float*m,int n) - функція призначена для введення масиву

float KorKub(float val) - функція призначена для знаходження кубічного кореня з числа;

void Kor_Kub_1D_Mas(float*m,int n) - функція призначена для перетворення кожного елемента даного одновимірного динамічного масиву в його кубічний корінь;

void Print_1D_Mas(float*m,int n) - функція призначена для виведення масиву;

void Clear_1D_Mas(float*m) - функція призначена для очистки масиву;

Програма буде мати наступний вигляд:

Лістинг програми

#include<stdio.h>

#include<conio.h>

#include<math.h>

 

float KorKub(float val);

float()*Create_1D_Mas(float*m,int n);

void Vvod_1D_Mas(float*m,int n);

void Kor_Kub_1D_Mas(float*m,int n);

void Print_1D_Mas(float*m,int n);

void Clear_1D_Mas(float*m);

float()*Create_1D_Mas(float*m,int n)

{

m=new float[n];

return m;

}

void Vvod_1D_Mas(float*m,int n)

{

for(int i=0;i<n;i++)

scanf("%f",&m[i]);

}

float KorKub(float val)

{

float m=1.0/3.0;

return pow(val,m);

}

void Kor_Kub_1D_Mas(float*m,int n)

{

for(int j=0;j<n;j++)

m[j]=KorKub(m[j]);

}

void Print_1D_Mas(float*m,int n)

{

for(int j=0;j<n;j++)

printf("%6.2f ",m[j]);

printf("\n");

}

void Clear_1D_Mas(float*m)

{

if(m==NULL)

{

printf("masiv ne stvoreno");

}

if(m)

{

delete[m];

m=NULL;

}

}

int main()

{

clrscr();

float*arr;

int n=5;

Create_1D_Mas(arr,n);

printf("Введіть елементи масиву\n");

Vvod_1D_Mas(arr,n);

Kor_Kub_1D_Mas(arr,n);

printf("Вихідний масив::\n");

Print_1D_Mas(arr,n);

Clear_1D_Mas(arr);

getch();

return 0;

}

Тестування:

Для перевірки правильності роботи програми введемо в неї дані, при введені яких результат заздалегідь відомий.

Наприклад сформуємо масив з 5 елементів такого виду:

8 225 27 64 1

З введених даних наочно видно, що після перетворення даних елементів на їх кубічні корені масив буде мати вигляд:

2 15 3 4 1

Тепер введемо ці ж дані в програму і перевіримо результат.

 

Введіть елементи масиву

Вихідний масив:

2 15 3 4 1

Контрольні запитання

1.Що таке динамічний масив?

2.Що таке динамічна пам’ять?

3.Що таке покажчик?

4.Принцип розподілу одновимірних динамічних масивів у пам’яті.

5.Принцип розподілу двовимірних динамічних масивів у пам’яті.

6.Особливості використання бібліотеки alloc.h.

7.Особливості описання одновимірних і двовимірних динамічних масивів.

8.Особливості обробки динамічних масивів з використанням покажчика.

9.Організація вводу/виводу динамічного масиву.

10.Передача динамічного масиву як вхідного параметру функції.

11.Динамічні масиви як вихідні параметри функції.

12.Особливості розробки функцій, параметрами яких є динамічні масиви.

13.Розробити функцію, яка повертає в головну програму суму елементів заданого масиву.

14.Розробити функцію, яка повертає в головну програму середнє арифметичне значення елементів заданого масиву.

15.Розробити функцію, яка повертає в головну програму значення дисперсії елементів заданого масиву.

16.Розробити функцію, яка повертає в головну програму суму від’ємних елементів заданого масиву.

17.Розробити функцію, яка повертає в головну програму суму додатних елементів заданого масиву.

Лабораторна робота №2

Тема:Основні принципи роботи з текстовими та двійковими файлами методами структурного програмування.

Мета: Набути навики роботи з текстовими та двійковими файлами за допомогою методів структурного програмування.

Порядок виконання роботи

1. Ознайомитися з теоретичними відомостями.

2. Розробити набір функцій для роботи з текстовими файлами, який обов’язково повинен включати наступні функції:

- створення текстового файлу;

- виведення змісту текстового файлу;

- дозапису рядків в текстовий файл;

та функцію, відповідно до завдання 1 і головну програму, яка їх використовує (викликає) для обробки текстового файлу. Для кожної розробленої функції визначити та обґрунтувати список вхідних і вихідних параметрів та їх типів.

3. Розробити набір функцій для роботи з бінарними файлами, який обов’язково повинен включати наступні функції:

- створення бінарного файлу;

- виведення змісту бінарного файлу;

- дозапису рядків в бінарний файл;

та функцію, відповідно до завдання 2 і головну програму, яка їх використовує (викликає) для обробки бінарного файлу. Для кожної розробленої функції визначити та обґрунтувати список вхідних і вихідних параметрів та їх типів.

4. Розробити 2-3 теста для перевірки правильності роботи розроблених комплексів програм.

5. Оформити звіт, зробити висновки.

Завдання 1

Варіант 1.Розробити функцію для підрахунку кількості рядків в текстовому файлі.

Варіант 2.Розробити функцію для підрахунку кількості слів в текстовому файлі.

Варіант 3.Розробити функцію для порівняння двох текстових файлів та виведення номеру рядка та позиції символу, де вони відрізняються.

Варіант 4.Розробити функцію для підрахунку кількості повторень заданого слова в текстовому файлі.

Варіант 5.Розробити функцію для дозапису рядка в початок текстового файлу.

Варіант 6.Розробити функцію для дозапису рядка в кінець текстового файлу.

Варіант 7.Розробити функцію для дозапису рядка в середину текстового файлу.

Варіант 8.Розробити функцію для видалення рядка з середини текстового файлу.

Варіант 9.Розробити функцію для видалення рядка з початку текстового файлу.

Варіант 10.Розробити функцію для дозапису слова в перший рядок текстового файлу.

Завдання 2

Варіант 1.Розробити функцію для дозапису заданого набору цілих даних у початок існуючого двійкового файлу.

Варіант 2.Розробити функцію для дозапису заданого набору дійсних даних у середину існуючого двійкового файлу з заданої позиції.

Варіант 3.Розробити функцію для дозапису заданого набору символів у кінець існуючого двійкового файлу.

Варіант 4.Розробити функцію для видалення заданої кількості цілих даних з початку двійкового файлу.

Варіант 5.Розробити функцію для видалення заданої кількості дійсних даних з середини двійкового файлу з заданої позиції.

Варіант 6.Розробити функцію для видалення заданої кількості дійсних даних з кінця двійкового файлу.

Варіант 7.Розробити функцію для копіювання заданої кількості цілих даних з заданої позиції.

Варіант 8.Розробити функцію для видалення заданої кількості цілих даних з заданої позиції заданого двійкового файлу і вставки їх з заданої позиції у новий файл.

Варіант 9.Розробити функцію для перезапису змісту файлу з кінця в початок в оберненому порядку.

Варіант 10.Розробити функцію для створення нового файлу, який містить цілі дані з заданого файлу, кратні одинадцяти.

Теоретичні відомості

Читання і запис текстових файлів

Введення-виведення окремих символів. Одним з найбільш ефективних способів здійснення введення-виведенняодного символу є використання бібліотечних функцій getchar()іputchar().

getchar() – функція, що здійснює введення одного символу з консолі. При зверненні вона повертає в функцію, яка її викликала один введений символ. При читанні з файлу з допомогою функції getchar() може бути досягнуто кінця файлу. В цьому випадку операційна система у відповідь на спробу читання символу передає функції getchar() значення EOF (End of File).

putchar()– функція, що виводить в стандартний потік один символ, при цьому також повертає в функцію, яка її викликала щойно введений символ.

Введення-виведення рядків. Однією з найбільш популярних операцій введення-виведенняє операція введення-виведеннярядка символів. В бібліотеку мови С для обміну даними через стандартні потоки введення-виведеннявключені функції введення-виведеннярядка gets()іputs(), які зручно використовувати при створенні діалогових систем. Обидві функції мають тільки один аргумент – вказівник s на масив символів. Якщо рядок прочитано нормально, функція gets() повертає адресу того масиву s, в який відбувається введення рядка. В разі помилки повертається NULL.

Функція puts() у випадку успішного завершення повертає останній символ, який завжди є символом ’\n’. У разі помилки повертається EOF.

Наведемо найпростіший приклад використання цих функцій:

#include<stdio.h>

char str1[] = ” ”;

int main ()

{

char name[80];

puts(str1);

gets(name);

return 0;

}

Будь-який рядок символів в мові С повинен закінчуватись нуль-символом ’\0’. В останній елемент масиву str1 нуль-символ буде записаний автоматично під час трансляції при ініціалізації масиву.

Форматне введення-виведення. Для роботи з стандартними потоками в режимі форматного введення-виведеннявизначені дві функції:

printf() – форматне виведення, перетворює дані з внутрішнього представлення в символьний вид в відповідності з форматним рядком і виводить їх в потік. Дані, які перетворюються і виводяться, задаються як аргументи функції printf ().

scanf() – форматне введення з вхідного потоку, читає послідовності кодів символів з вхідного потоку і інтерпретує їх як цілі числа, дійсні числа, одиничні символи рядка.

Для роботи з файлами включені наступні функції:

fgetc (), getc () – введення (читання) одного символу з файлу;

fputc (), putc () – запис одного символу в файл;

fprintf () – форматне введення в файл;

fscanf () – форматне введення (читання) з файлу;

fgets () – введення (читання) рядка з файлу;

fputs () – запис рядка в файл.

Функція fputs(const char*s, FILE*stream) записує обмежений символом ’\0’ рядок в файл, визначений вказівником stream на потік, і повертає невід’ємне число. Символ ’\0’ в файл не переноситься, і символ ’\n’ не записується в кінці стрічки замість ’\0’.

Функція fgets (char*s, int n, FILE*stream) – читає з визначеного вказівником stream файлу не більше (n-1) символів і записує їх в рядок, на який вказує вказівник s. Функція закінчує читання, як тільки прочитає (n-1) символів чи зустріне символ нового рядка ’\n’, який переноситься в рядок s. Додатково в кінець кожної стрічки записується ознака кінця стрічки ’\0’. В випадку успішного завершення функція повертає вказівник s. При помилці чи при досягненні кінця файлу, при умові, що із файлу не прочитаний жоден символ, повертається значення NULL. В цьому випадку вміст масиву, який адресується вказівником s, залишається без змін. На відміну від fgets () функція gets () відкидає символ ’\n’.

Перед тим як працювати з потоком його необхідно ініціалізувати. При цьому потік зв’язується в виконуваній програмі з структурою визначеного типу FILE. Визначення структурного типу FILE знаходиться в заголовочному файлі stdio.h. В структурі FILE вміщуються компоненти, з допомогою яких ведеться робота з потоком: покажчик на буфер, покажчик поточної позиції в потоці та ін.

При відкритті потоку в програму повертається покажчик на потік, що є покажчик на об’єкт структурного типу FILE. Цей покажчик ідентифікує потік в усіх послідуючих операціях.

Покажчик на потік, наприклад fp, повинен бути описаний в програмі наступним чином:

 

#include<stdio.h>

FILE *fp;

 

Покажчик на потік набуває значення в результаті виконання функції відкриття потоку:

 

fp = fopen (ім’я_файлу, режим_відкриття);

Параметри функції fopen () є покажчиками на масиви символів, які вміщують відповідно ім’я файлу, зв’язаного з потоком, і рядка режимів відкриття. Однак ці параметри можуть задаватись і безпосередньо у вигляді рядків при виклику функції відкриття файлу:

fp = fopen (”file.txt”,”r”);

де file.txt – ім’я деякого файлу, зв’язаного з потоком;

r– позначення одного з режимів роботи з файлом (тип доступу до потоку).

Після закінчення роботи з файлами рекомендується закрити їх явно. Для цього використовується функція fclose (покажчик на потік)

Відкритий файл можна відкрити повторно (наприклад, для зміни режиму роботи з ним) тільки після того, як файл буде закритий з допомогою функції fclose().

Читання і запис бінарних файлів

Текстові файли, незважаючи на своє широке поширення, є тільки одним з видів файлів, які можна зберігати на диску. Бінарні файли знайшли більш широке застосування в професійних програмах, тому що :

1) одна з переваг збереження даних у бінарних форматах – швидкість (тобто немає необхідності перетворювати дані при передачі з диска в пам'ять і навпаки);

2) інша перевага – пам'ять. Так, наприклад, змінна типу double займає 4 байти, а в текстовій формі набагато більше. Звичайно бінарні файли за розміром менші текстових і в більшості випадків програми обробляють їх швидше, ніж текстові.

Мова С дозволяє досить легко працювати з двійковими файлами. Методи обробки майже такі ж, як і для текстових файлів, і вони працюють як у DOS, так і в Windows, при цьому програми виконують читання і запис наборів байтів.

Відкриття бінарних файлів

Для відкриття двікових файлів необхідно:

1) визначити файлову змінну File *fp;

2) безпосереднє відкриття виконується функцією fopen() по всіх режимах якої додається буква b ”rb”, “wb”, “ab”, “r+b”, “w+b”, “a+b”.

Наприклад, оператор fp=fopen(“test.txt”,”r+b”); - відкриває файл для читання і запису в двійковому режимі. При відкритті можливі помилки (тобто програмні переривання), які можна передбачити за допомогою фрагмента програми: File*out;

out=fopen (filename, “wb”);

if(!out)

{

puts(“Саn't create file”);

exit(1);

}

Існує два способи читання і запису бінарних файлів:

послідовний;

прямий (довільний);







Последнее изменение этой страницы: 2016-04-18; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.233.221.149 (0.023 с.)