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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Приклад виконання завдання 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; просмотров: 390; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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