Алгоритм решения задачи

Зміст

  1. Вступ………………………………...…………………………………………….4
  2. Опис завдання…………………………...………………………………………..6
  3. Постановка завдання………………..…………………………………...……….7
  4. Алгоритм розв’язку задачі…………………….…….………………………….11
  5. Тестування програми…………………………….……………………….…….13
  6. Програма на мові Сі з реалізації розробленого алгоритму розв’язку задачі .......15
  7. Результати дослідження……..………………………………....……………….17
  8. Оцінка результатів виконання програми……………………………………...27
  9. Синтаксичні елементи мови Сi, які використані в програмі ……………………28
  10. Висновок…………………………………………………………………………29

 

Вступ

Курсова робота – це самостійне навчально-наукове дослідження студента, яке виконується з певного курсу або з окремих його розділів

Виконання курсових робіт направлене на досягнення наступних  цілей:

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

Курсова робота оформляться   згідно з ГОСТом 7.32-81 «Отчет о научно-исследовательской работе, общие требования и правила оформления»; ГОСТ 2.105-68 «Общие требования к текстовым документам» і « ГОСТ 2.106-68 «ЕСКД текстовые документи».

Метою написання  курсової роботи є набуття практики роботи над задачами на порядок більш складними, ніж стандартні. Передбачається обов'язкова робота з літературою, вивчення необхідних розділів самостійно, адаптація відомих засобів програмування для розв'язування конкретних задач з особливостями, комбінування різних методів та інструментальних засобів, застосування у комплексних задачах знань з різних розділів курсу тощо.

Розв'язання задачі за допомогою алгоритмічної мови передбачає наступні дії:

  • визначення постановки задачі;
  • розробка алгоритму рішення задачі;
  • створення програми  на алгоритмічній мові;
  • наладка та виконання програми за допомогою програмуючого середовища;
  • тестування та аналіз результатів виконання програми.

 

Опис завдання

  • Створити й вивести одномірний масив y з елементами

                                                yk = fi+10(k), де i - номер варіанту, k =1, 2, ..., 10.

  • Виконати для цього масиву завдання свого варіанту.
  • При відсутності шуканих даних вивести про це повідомлення.

Варіант завдання

для студентів групи КБ11 відповідно до порядкового № в журналі

Порядковий  № 22, отже i=22.

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

Номер функції n знаходимо за формулою i+10. Так як функцій всього дано 25, тому номер функції знаходимо таким чином.  n=i+10-25=22+10-25=7.

n

Функція fn (x)

7

13,4 cos|x| sin(x2-2,20)


 

 

 

 

 

 

 

 

 

 

 

 

 

I. Постановка задачі

Масив – це скінченне число даних одного типу. Для формування одномірного масиву необхідно вказати тип, ім’я і розмірність. Оскільки функція  f7(k) відноситься до тригонометричного класу, то тип функції дійсний, використовуємо дійсний тип float. Ми досліджуємо елементи масиву в інтервалі від 1 до 10, а індекс починається з 0, то розмірність буде 11 (позначимо її int Rk=11).

float M[11]

Елементи масиву:

   M[k]=13,4 cos|k| sin(k2-2,20),   k =1, 2, ..., 10.

Оскільки дії  з визначенням елементу масиву повторюються використовуємо цикл з параметром

for (k=1; k<Rk; k++), де k – параметр циклу, який змінюється від 1 до 10.

Для виведення  індексу масиву та його значення використаємо оператор

printf("\n%7d      %4.2f \n", k, M[k]);

Так як в умові  завдання вказано, що потрібно створити і вивести новий масив, що складається з вихідного масиву, то для початку присвоюємо кожен елемент масиву M[k] відповідному елементу масиву M_nov[n], за допомогою циклу, розмірність якого [12], тому що передбачається дописання різниці передостаннього позитивного елемента з найбільшим значенням , тип нового масиву аналогічний вихідному масиву – дійсні числа. Вже в новому масиві будемо проводити решту операцій.

В умові задачі вказано, що потрібно знайти передостанній  позитивний елемент. Для цього знаходимо всі позитивні елементи, зафіксовуватимемо їхні індекси (позначимо індекси позитивних елементів так: ind – цілий тип), а також зафіксовуємо індекс попереднього позитивного значення (позначимо індекси попереднього позитивного значення так: indp – цілий тип). Для знаходження індексів позитивних значень застосовуємо операцію порівняння з «нулем».

 

 

 Використовуємо  оператор циклу  

  if (M[n]>0)

    indp=ind;  

ind=n;

Потрібно передбачити  ситуацію, що передостаннього позитивного  елемента немає. Для цього перед тим як знаходити передостаннє позитивне значення порахуємо кількість позитивних значень за допомогою операції порівняння з «нулем», тобто М_nov[n]>0. Застосовуємо умовний оператор     

       if (M_nov[n]>0)

c++;

c – кількість позитивних елементів (цілого типу). Присвоїмо перед циклом початкове значення c=0.

Якщо кількість позитивних елементів буде менше ніж 2 це значить, що передостаннього позитивного елементу немає. Повідомлення про це виводимо на екран за допомогою функції printf.  В інакшому випадку шукаємо передостаннє позитивне значення так як описано вище. 

         Для знаходження максимального  значення використовуємо операцію  порівняння, починаючи з першого  значення з іншими елементами  масиву. Вводимо нову змінну цілого типу, присвоюємо їй якесь значення і порівнюємо цю змінну з кожним елементом масиву, коли виявиться, що значення елементу масиву більше ніж значення даної змінної, то здійснюємо переприсвоєння: даній змінній присвоюємо значення масиву. Місце елементу масиву задається індексом. Ми фіксуємо кожного разу індекс найбільшого значення. Ім’я змінної нехай буде max, а індекс цього елементу буде imax. 

Оскільки ми порівнюємо всі елементи і операції повторюються, то використаємо оператор циклу. Параметром циклу використаємо індекс n.

for (n=imax=1; n<Rk; n++)

{

if (M[n]>M[imax])

imax=n;

}

Щоб поміняти місцями  якісь елементи масиву потрібно ввести додаткову змінну buf (дійсний тип), яка буде виконувати роль посередника.

Формально записуємо

 

buf=M_nov[imax];

M_nov[imax]=M_nov[indp];

M_nov[indp]=buf;

Різницю передостаннього  позитивного та найбільшого значень  позначимо через Riz (дійсний тип), і знайдемо так:

Riz=M_nov[indp]-M_nov[imax].

За умовою задачі далі потрібно визначену різницю  вставити перед найближчим за індексом до неї елементом.

Для цього спочатку створюємо змінну найближчої відстані(найближчого  елемента за індексом) vids (типу дійсні числа). Перед циклом надаємо змінній vids значення відстані від різниці до першого індекса нового масиву:           vids=Riz-1. А в циклі for(n=1; n<Rk; n++) знаходиться найближча відстань, тобто елемент, який найближчий за індексом до різниці передостаннього позитивного елемента з найбільшим значенням за допомогою умови if(fabs(Riz-n)<vids) при виконанні якої виконуються такі дії:

          nabl=n;

vids=Riz-n;

          nabl - найближчий індекс до різниці передостаннього позитивного елемента з найбільшим значенням, типу цілих чисел.

Вставити значення перед деяким елементом означає  всі елементи, які знаходяться після місця в яке потрібно вставити, перемістити вправо на одиницю,  для того щоб звільнити місце під знайдену різницю: 

 

for (n=11; n>nabl; n--)

M_nov[n]=M_nov[n-1]; 

Після завершення циклу в комірку з найближчим індексом вставляємо різницю індексів: M_nov[nabl]=Riz;                     

Виводиться новий масив на екран з виконанням всіх завдань:

printf ("%s     %13s\n", "Index", "Znachennya elementy zminenoho novoho     masuvy");

        for (n=1; n<Rk+1; n++)

{  

     printf ("\n %7d      %4.2f \n",n,  M_nov[n]);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ІІ. Алгоритм


 


 

 

Ні

Так

 

 

 Ні  


                                                 


 



 Ні


 Ні


 Так



                                


 Ні


  


                         Ні


 Так 


                                                                        


            Ні



  Так


 



 


 Ні


 Так


 Так




 





 Ні


 



Ні

 Так


 


 


 Ні





     




Тестування  програми

Тестування 1. Для тестування даної програми замінюється вихідний масив масивом, який табулюється за формулою M[k]= 3*cos(k)+k*2.

Результати  першого тестуючого масиву:

Index

Znachennya elementy masuvy

1

3,62

2

2,75

3

3,03

4

6,04

5

10,85

6

14,88

7

16,26

8

15,56

9

15,27

10

17,48


 

Передостанній позитивний елемент: 15,27

Індекс передостаннього  позитивного елемента: 9

Найбільше значення: 17,48

Індекс найбільшого  значення: 10

Різниця передостаннього позитивного елемента з найбільшим значенням: 2,22

Індекс найближчий до різниці передостаннього позитивного елемента з найбільшим значенням: 2

Новий масив

Index

Znachennya elementy masuvy

1

3,62

2

2,22

3

2,75

4

3,03

5

6,04

6

10,85

7

14,88

8

16,26

9

15,56

10

17,48

11

15,27


 

Тестування 2. Також проведемо тестування в якому перевіримо функцію, яка не має позитивних значень M[k]= -23*k+3

Результати другого тестуючого масиву:

Index

Znachennya elementy masuvy

1

-20,00

2

-43,00

3

-66,00

4

-89,00

5

-112,00

6

-135,00

7

-158,00

8

-181,00

9

-204,00

10

-227,00


 

Результат програми: передостаннього позитивного значення немає.

Копії екранних вікон з тестуючою програмою подані у відповідному пункті.

 

Програма  на мові Сі з реалізації розробленого алгоритму розв’язку задачі

#include <stdio.h>

#include <math.h>

int main ()

{

 const int Rk=11;

float M[11], buf, Riz, M_nov[12], vids;

int k, ind, indp, imax, n, nabl, c;

printf ("%s %13s     \n", "Index", "Znachennya elementy masuvy");

for(k=1; k<Rk; k++)

{

      M[k]=13.4*cos(fabs(k))*sin((pow(k,2))-2.20);

     printf("\n%7d      %4.2f \n", k, M[k]);

}

printf ("%s %13s     \n", "Index", "Znachennya elementy novoho masuvy");

for (n=1; n<Rk; n++)

{

     M_nov[n]=M[n];

    printf ("\n %7d      %4.2f\n", n, M_nov[n]);/*Vuvodumo na ekran index novoho masuvy ta yogo znachennya*/

}

c=0;

for(n=1; n<Rk; n++)

{

     if (M_nov[n]>0)

    c++;

}

if (c<2)

     printf ("\n Peredostann`oho pozutuvnoho net \n");

     else

{

for(n=1; n<Rk; n++)

{

     if (M_nov[n]>0)

     indp=ind;  

     ind=n;

}

printf ("\n indp=%d  \n", indp); /* index peredostannioho pozutuvnoho elementy*/

printf ("\n M_nov[indp]=%4.2f \n", M_nov[indp]); /* znachennya peredostannioho pozutuvnoho elementy */

for (n=imax=1; n<Rk; n++)

{

if (M_nov[n]>M_nov[imax])

imax=n;

}

printf ("\n max=%4.2f \n", M_nov[imax]); /* Vuvodumo na ekran maksumal`ne znachennya*/

printf ("\n imax=%d \n", imax); /*Vuvodumo na ekran index maksumal`noho znachennya*/

buf=M_nov[imax];

M_nov[imax]=M_nov[indp];

M_nov[indp]=buf;

printf ("%s     %13s\n", "Index", "Znachennya elementy zminenoho novoho masuvy");

for (n=1; n<Rk; n++)

printf ("\n %7d        %4.2f\n", n, M_nov[n]);/*Vuvodumo na ekran index zminenoho novoho masuvy ta yogo znachennya*/

Riz=M_nov[indp]-M_nov[imax];

printf ("\n Riz=%4.2f \n", Riz); /* riznuca peredostannioho pozutuvnoho ta maksumal`noho */

vids=Riz-1;

for (n=1; n<Rk; n++)

{

     if(fabs(Riz-n)<vids)

{

          nabl=n;

          vids=Riz-n;

}

}  

printf("\nnabl=%4d\n",nabl); /* Vuvodumo na ekran index naibluzhcui do riznuci*/

for (n=11; n>nabl; n--)

M_nov[n]=M_nov[n-1];  

M_nov[nabl]=Riz;

printf ("%s     %13s\n", "Index", "Znachennya elementy zminenoho novoho masuvy");

for (n=1; n<Rk+1; n++)

{  

     printf ("\n %7d      %4.2f \n",n,  M_nov[n]);

}

}

return 0;

}

 

 

Результати  дослідження 

1. Екранні вікна з налагодженою програмою

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. Екранне вікно з результатами виконання програми

 

 

 

 

 

3. Екранне вікно з тестуючою програмою

Тестування 1.

 

 

 

 

Тестування 2.

 

Оцінка результатів виконання програми

Для виконання  програми було розроблено постановку задачі в якій детально розписано дії. Також створений  алгоритм розв’язку задачі, за яким писався текст програми. У результатах виконаної програми присутній вихідний масив, новий масив, повідомлення про передостанній позитивний елемент, його індекс, найбільше значення та його індекс, різниця  цих двох елементів та індекс найближчий до неї, а якщо немає передостаннього позитивного елемента, то на екран виводиться повідомлення про це.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Синтаксичні елементи мови Сi, які використані в програмі

Директива #include широко використовується для включення в програму так званих заголовних файлів, що містять прототипи бібліотечних функцій, і тому більшість програм на Сі починаються з цієї директиви.

math.h - заголовний файл стандартної бібліотеки мови програмування Сі, розроблений для виконання простих математичних операцій.

Функція main, з якої починається виконання Сі-програми

float – тип даних дійсний.

int – тип даних цілий.

if () – умовний оператор. Синтаксис if(умова) оператор 1; else оператор 2;

Оператор for() - це найбільш загальний спосіб організації циклу. Він має наступний формат:

for (вираз 1; вираз  2; вираз 3) тіло 

Вираз 1 зазвичай використовується для встановлення початкового значення змінних, керуючих циклом. Вираз 2 - це вираз, що визначає умову, за якої тіло циклу буде виконуватися. Вираз 3 визначає зміна змінних, керуючих циклом після кожного виконання тіла циклу.

printf - узагальнена  назва ряду функцій або методів  стандартних або широковідомих комерційних бібліотек, або вбудованих операторів деяких мов програмування, використовуваних для форматного виведення - виведення в різні потоки значень різних типів, відформатованих згідно заданим шаблоном. Найбільш універсальною функцією, яка дозволяє ввести дані з клавіатури, є функція scanf, у програмах на Cі цю функцію можна було використовувати, коли необхідно завершити роботу програми після натискання користувачем будь-якої клавіші

/*    */- коментарі в тексті програми.

= - присвоєння.

 

 

Висновок

Отже, я набула практики роботи над задачами складнішими, ніж типові. Вивчила необхідні розділи, адаптувала відомі засоби програмування для розв'язування конкретних задач з особливостями, використовувала різні методи та інструментальні засоби, застосувала у комплексних задачах знання з різних розділів курсу.

 

 


Алгоритм решения задачи