Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лекция 9. Подпрограммы- примеры решения задач Примеры решения задач Задача 9.

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 20.5.2024

PAGE  89

Лекция 9. Подпрограммы: примеры решения задач

Примеры решения задач

Задача 9.1. Составить программу вычисления c = n! / (m! * (m-n)!)

В вычисляемом выражении требуется трижды вычислять факториал вида k!,  где  k! = 1*2*...*k  при целом k > 0,  0! = 1.

Вычисление факториала удобно оформить как подпрограмму.

Решение А. Использование подпрограммы, не возвращающей значение.

Пусть вызов подпрограммы p_fakt (k, f) обозначает действие - операцию присваивания f = k!;.  Здесь k - исходные данные, а f - результат. Таким образом, подпрограмма p_fakt() имеет входной параметр  k  и выходной параметр  f.

Обозначим факториалы: n!, m! и (n-m)! через f1, f2 и f3, соответственно. Получим программу 9.1а.

Подпрограмма вычисления факториала p_fakt содержит повторение умножений, т. е. имеет циклическую структуру. Текущим множителем служит вспомогательная переменная j, изменяющаяся с шагом  +1.

/* Программа 9.1а. Вычисление c=n!/(m!*(m-n)!)   */

/* с  помощью подпрограммы,  не возвращающей значение  */

#include <stdio.h>

void  p_fakt (int k, long *f);   /* прототип функции   */

/* Вычисление  c = n! / (m! * (n-m)!)   */

void  main(void)

{  int n, m, c;                /* исходные данные и результат  */

long f1, f2, f3;   /* n!, m!, (n-m)!    */

printf("\nВведите два исходных целых числа ");

scanf("%d %d", &n, &m);

p_fakt (n, &f1);    /* f1 = n!   */

p_fakt (m, &f2);  /* f2 = m!   */

p_fakt (n-m, &f3);    /* f3 = (n-m)!   */

c = f1 / (f2 * f3);

printf ("\n c = %d", c);

}

/* Подпрограмма: f = k!;   */

void p_fakt (int k, long *f)

{  int j;                                 /* текущий множитель   */

*f=1;

for (j=2; j<=k; j++)

*f = (*f )* j;

return;     /* здесь не обязателен    */

}

/* Программа 9.1б. Вычисление c=n!/(m!*(m-n)!)   */

/* с помощью функции,   возвращающей значение  */

#include <stdio.h>

long fakt (int k);   /* прототип функции    */

/* Вычисление  c = n! / (m! * (n-m)!)   */

void main(void)

{  int n, m, c;            /* исходные данные и результат    */

printf("\nВведите два исходных целых числа ");

scanf("%d %d", &n, &m);

c = fakt(n) / (fakt (m) * fakt (n-m));

printf ("\n c = %d", c);

}

/* Функция  k!   */

long fakt (int k)

{  long f;           /* k!                  */

int j;     /* текущий множитель  */

f=1;

for (j=2; j<=k; j++)

f = f * j;

return f;     /* значение функции  */

}

Пояснения к программам.

1. В программах 9.1а, 9.1б вызовы подпрограмм расположены в тексте программы раньше, чем определения этих подпрограмм.  Поэтому в начале программы объявлены функции, т.е. записаны их прототипы.

2. В программе 9.1б результат работы подпрограммы fakt передается как значение функции. Поэтому переменная f является не параметром, а вспомогательной локальной переменной и записывается без звездочки.

3. В программе 9.1а вызов функции p_fakt, не обладающей значением, может записываться только как самостоятельный оператор. В программе 7.1б вызов функции fakt, обладающей значением, может являться операндом в выражении.

4. В программе 9.1а при выводе результата можно заменить строки:

c = f1 / (f2 * f3);

printf ("\n c = %d", c);

строкой:

printf ("\n c = %d", f1/(f2*f3));

Тогда переменная c и ее объявление становятся ненужными. В программе 9.1б также можно обойтись без переменной с. 

Схемы для каждой функции рисуются отдельно. Для данной программы нужно изобразить две схемы: для главной функции main и для функции fakt. Для подпрограмм в начальном блоке пишется имя функции, а в конечном  - слово возврат с возвращаемым значением (если функция значение не возвращает, то просто слово возврат). Ниже приведены схемы для программы   9.1б.

Задача 9.2.   Даны две строки  длиной до 80 символов.  Определить число латинских букв в каждой строке.

  /*  Программа 9.2 */

    #include <stdio.h>

/*----------------------------------------------------------------------------------*/

/* Функция определения количества лат. букв в заданной строке  */

/*----------------------------------------------------------------------------------*/

    int   KolLatBukv (char s[])

    {

int  i,  /* индекс очередного символа строки  s */

     k=0; /* количество лат. букв */

for (  i = 0;  s[i] != '\0';  i++ )

    if (s[i] >= 'a'  &&  s[i] <= 'z'  | |  s[i] >= 'A'  &&  s[i] <= 'Z'  )  k++;

return k;

    }

/*------------------------*/

/* Главная функция */

/*------------------------*/

    void main()

    {

char s1[81], s2[81];  /* заданные строки */

printf ("\nВведите две строки символов\n");

 gets (s1);

gets (s2);

printf ("В  1-й  строке  %d  лат. букв\n", KolLatBukv (s1));

printf ("Во  2-й  строке  %d  лат. букв\n", KolLatBukv (s2));

    }

 Пример  результата выполнения программы:

Введите две строки символов

    AaBbcd 123 Zz

    t = x + y * z / 10 ;

В  1-й  строке  8  лат. букв

Во  2-й  строке  4  лат. букв

Задача  9.3.  Описать функцию, которая для заданного числового массива определяет сумму и количество положительных элементов.

  /*  Программа 9.3 */

#include <stdio.h>

/*------------------------------------------------------------------*/

/*      Функция определения суммы и количества        */

/*    положительных  элементов  заданного массива   */

/*------------------------------------------------------------------*/

 

void  SumPos (float m[], int n, float  *s,  int  *k)

   /* Вх. параметры:

 m – указатель на заданный массив,

 n –  число элементов массива.

Вых. параметры:

*s –  сумма положительных элементов массива,

*k – количество положительных элементов        */

{

int i;

for (i=0, *s=0, *k=0;  i<n;  i++)

if (m[i] > 0)   (*s) += m[i],  (*k)++;

}

/*---------------------------------------------------------------------*/

/* Главная функция (для тестирования подпрограммы) */

 /*---------------------------------------------------------------------*/

void main()

{

float a[6],  /* массив */

   s;  /* сумма положительных элементов */

int k,  /* количество положительных эл-тов */

 i;   /* индекс элемента массива*/

printf ("\nВведите 6 чисел\n");

for ( i=0; i < 6; i++)  scanf ("%d ", &a[i] );

SumPos (a, 6, &s, &k);    /* вызов функции */

printf ("Сумма положительных чисел =  %f\n", s);

printf ("Количество положительных чисел:  %d\n", k);

}

 Выполнение контрольных заданий

             

1. Получите у преподавателя индивидуальное задание.

2. Составьте блок-схему и программу на языке С и подберите тесты для проверки программы на компьютере.

3. Отладьте программу на компьютере.

5. Оформите и сдайте отчет.

Контрольные задания

                           

1. Даны две строки  длиной до 80 символов.

а) Определить, в какой строке больше цифр: в первой или во второй (вывести соответствующее сообщение).

Описать в виде отдельной функции определение числа цифр                  в заданной строке.

б) Определить, сколько раз заданный символ встречается в обеих строках.

Описать в виде отдельной функции определение числа повторений заданного символа в заданной строке.

в) Удалить заданный символ  в каждой строке.

Описать в виде отдельной функции удаление заданного символа в заданной строке.

г) Заменить в каждой строке один заданный символ на другой  заданный символ.

Описать в виде отдельной функции замену  символа в  строке.

д) Определить общее число гласных букв в обеих строках.

Описать в виде отдельной функции определение числа гласных букв в заданной строке.

2.  Дан   числовой  массив  X[12].  Определить

        6                       11

а)  ∑ X[i]  –  ∑ X[i]

         i=0                    i=7

Описать в виде отдельной функции определение суммы элементов заданной части массива.

б)  max (X[0], X[1], … , X[5]) – max (X[6], X[7], … , X[11])

Описать в виде отдельной функции определение максимального элемента в заданной части массива.

в)  min (X[0], X[1], … , X[4]) + min (X[5], X[6], … , X[11])

Описать в виде отдельной функции определение минимального элемента в заданной части массива.

3.  Даны два массива из  n  целых чисел (n ≤ 10).  Для каждого массива

а) определить произведение элементов, которые по модулю меньше заданного числа.

Описать в виде отдельной функции определение произведения элементов заданного массива, которые по модулю меньше заданного числа.

б)  определить сумму элементов с четными индексами.

Описать в виде отдельной функции определение для заданного массива суммы элементов с четными индексами.

в)  определить количество нечетных элементов.

Описать в виде отдельной функции определение количества нечетных элементов в  заданном массиве.

г) определить сумму элементов до минимального элемента.

Описать в виде отдельной функции определение для заданного массива суммы элементов до минимального элемента.

д) определить количество элементов до максимального элемента.

Описать в виде отдельной функции определение количества элементов до максимального элемента заданного массива.

е) проверить, упорядочены ли элементы по возрастанию.

Описать отдельную функцию проверки, упорядочены ли элементы заданного массива по возрастанию.

ж) проверить, упорядочены ли элементы по убыванию.

Описать отдельную функцию проверки, упорядочены ли элементы заданного массива по убыванию.

з) упорядочить элементы по возрастанию.

Описать отдельную функцию сортировки заданного массива по возрастанию элементов.

и) упорядочить элементы по убыванию.

Описать отдельную функцию сортировки заданного массива по убыванию элементов.

к) удалить заданное число.  

Описать отдельную функцию удаления заданного числа в заданном массиве. Функция должна вернуть число удаленных элементов.

PAGE  

PAGE  89

конец

вывод с

 c = fact(n)/

(fact(m)*fact(n-m))

ввод  n,m

начало

да

нет

f = f * j

j = j +1

j<=k

 f=1, j=2

возврат f

fakt




1. 1 Экка пп сформлась в 6070х гг
2. Тема-Державність та державне управління економія 1
3. Наибольшая доля в его структуре приходится на земли лесохозяйствснных предприятий 483 организаций и граж
4. Великая Яс
5. Английские причастия соответствуют как русским причастиям так и деепричастиям
6. Социокультурные лакуны
7. Юрисдикционная форма защиты гражданских прав
8. Одной из важнейших забот семьи когда ребенок пошел в школу должна стать забота о его комфортном самочувс
9. Прозрение Прошу всех дочитать до конца или же хотя бы прочитать завершающую часть
10. Менталитет англичан
11. Классификация основных форм поведения животных
12. на тему Семья- Признание общественностью формы отношений между мужчиной и женщиной в целях создания с
13. КУРСОВА РОБОТА Гроші та теорії грошей ЗМІСТ ВВЕДЕННЯ.html
14. Введение 2.Как стать предпринимателем 3.html
15. західному узбережжі а також на родючих землях вздовж річки Кумо Кокемяен тта її озерної системи
16. Учет затрат в строительстве
17. Stolen Dncewv 04-02New 02-04-02Polrkreis 18 llein llein
18. задание 2 ПОНЯТИЕ ИНФОРМАЦИОННОГО МЕНЕДЖМЕНТА
19. Реферат на тему Экономикогеографическая характеристика Индии
20. і В природі відбувається процес розвитку перетворення ~ але не творчості