- •Практикум по программированию на языке с
- •Порядок выполнения лабораторных работ
- •Основы программирования в среде языка си. Оператор присваивания
- •Приоритет операций в выражении
- •Задание 1 (программа 1_1)
- •Программирование разветвленных алгоритмов. Операторы передачи управления
- •Программирование циклических алгоритмов с заданным числом повторений
- •Программирование циклических алгоритмов с предусловием
- •Программирование циклических алгоритмов с постусловием
- •Модифицировать программу 3_2 для вычисления функций f1(X) и f2 (X) с применением оператора цикла с постусловием. Выполнить ее и сравнить результаты с полученными ранее.
- •Программирование алгоритмов обработки одномерных массивов
- •Задание 1
- •Обработка двумерных массивов
- •Программирование с применением функций
- •[Класс] тип имя ([список параметров])[throw (исключения)] {тело функции}
- •Return [выражение];
- •Программирование с возвратом из функций нескольких значений
- •Лабораторная работа 10 Обработка символьных и строковых данных
- •Структуры
- •Модульное программирование
- •Динамические структуры данных. Списки
- •Задание 1 (программа 14_1)
- •Графика
- •Задание к расчетно-графической работе
- •Библиографический список
- •Типы данных
- •Обозначения графические в схемах алгоритмов (гост 19.701-90)
- •Сообщения об ошибках Сообщения об ошибках периода компиляции
- •Ошибки стадии выполнения
- •Математические ошибки
- •Функции ввода-вывода для стандартных потоков
- •Функции для работы со строками
- •Библиотека заголовочных файлов
- •Контейнерные классы
Программирование с возвратом из функций нескольких значений
Цель работы: научиться разрабатывать и отлаживать программы с использованием функций, вычисляющих несколько значений.
Для возврата значений из функции можно использовать два способа. Первый способ заключается в использовании глобальных переменных. Второй способ позволяет возвратить одно значение с помощью оператора return, а другие записать в ячейки памяти с указанными адресами. В последнем случае в функцию необходимо передать адреса ячеек, куда надо поместить значения. Это выполняется с помощью указателей.
Пример 1. Написать программу, функция в которой будет вычислять квадрат и куб аргумента. (Одно значение будем возвращать из функции оператором return, другое будет записываться по указателю int*.)
# include <stdio.h>
# include <iostream.h> // для потоковых функций ввода/вывода
int fun(int, int*); // прототип функции
void main()
{
int a, kub, qv;
cin>>a; // ввод из потока
qv=fun(a,&kub); //исходное число, адрес ячейки,
куда поместить второе значение
cout<<"для числа " << a<< "\t квадрат=" <<qv<<"\t куб=" <<kub; // вывод
}
int fun(int k, int* p)
{
*p=k*k*k; // значение куба помещаем по адресу *p
return k*k;
}
Пример2. Ввести три массива A[1..3], B[1..4], C[1..5] (подпрограммой). Вычислить средние арифметические и геометрические значения в каждом из них.
Для решения задачи pазpаботана СА (pис.11), состоящая из основной программы (а) и двух подпрограмм: одной - для ввода элементов массива (б), другой - для определения среднего арифметического и среднего геометрического значений в массиве (в), а также следующая пpогpамма для реализации алгоритма:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int vvod(int d[])
{
int i, k;
printf("Vvedite chislo elementov ");
scanf("%d",&k);
printf("Vvedite massiv is %d elementov \n", k);
for ( i=0; i<k; ++i )
scanf("%d", &d[i]);
return k;
}
float sr(int k, int f[], double *g)
{
int i;
long int s, p ;
s = 0; p = 1;
for ( i = 0; i<k; ++i )
{
s += f[i]; // s = s + f[i];
p *= f[i]; // p = p * f[i];
}
*g = pow((double)p, 1.0/k);
return ((float)s)/k;
}
void main ()
{
int ka, kb, kc; double ga, gb, gc;
int a[5], b[5], c[5];
clrscr();
ka=vvod(a);
printf("srA = %5.2f \t ", sr(ka,a,&ga));
printf(" srGA = %5.2f \n", ga);
kb=vvod(b);
printf("srA = %5.2f \t ",sr(kb,b, &gb));
printf("srGB = %5.2f \n", gb);
kc=vvod(c);
printf("srA = %5.2f \t ",sr(kc,c, &gc));
printf("srGC = %5.2f \n", gc);
getch();
}
Задание 1 (программа 9_1)
Написать и отладить программу для задачи из лабораторной работы 7 с выделением алгоритма обработки или формирования массива. Организовать вызов процедуры с параметрами-массивами для двух наборов исходных данных. (Для ускорения отладки массив можно задать константой).
Задание 2 (программа 9_2)
1. Даны массивы A [1..6], B [1..6], C [1..6], вычислить суммы положительных и отрицательных элементов. Получить А*B, B*С, А*C. Вычисление произведения массивов оформить подпрограммой.
2. Даны массивы A [1..5], B [1..6]. Получить новые массивы путем сдвига элементов в массивах на два разряда вправо, освободившиеся слева элементы обнулить. Сдвиг элементов в массиве оформить подпрограммой, из подпрограммы вернуть выпавшие справа разряды.
3. Даны два одномерных массива А [1..6] и C [1..6]. Получить A2, С2, А*С. Подсчитать число четных и число нечетных чисел в полученных массивах. Перемножение массивов и подсчет выполнить в подпрограмме.
4. Даны матрицы целых чисел S[1..3,0..2], K[1..3,0..2], в которых имеется по два одинаковых числа. Найти и напечатать их значения и индексы.
5. Вычислить значение функции Z = x1+ex2, где x1, x2 - корни уравнения Aix2+Bix+Ci = 0, где i = 1,2,..,N. Коэффициенты уравнения заданы в массивах A [1..N], B [1..n], C [1..N]. Для вычисления корней использовать подпрограмму.
6. Составить подпрограмму для переменных двух квадратных матриц, с помощью которой вычислить вторую, третью и четвертую степени матрицы M [1..5,1..5]. Для каждой матрицы вычислить сумму и среднее арифметическое значение элементов.
7. Даны массивы A [1..6], B [1..6], C [1..6]. Преобразовать их, каждому элемен-ту массива, присваивая значение, соседнего с ним справа. Последнему элементу присвоить значение первого. Напечатать исходные, результирующие массивы и отдельно последние два элемента результирующего.
8. По заданным вещественным массивам A[1..6], B[1..6] и С[1..6] вычислить (minAi)/maxAi + (maxCi)/min(Ci) + max(B+C)I / min(B+C)i.
9. Даны массивы A [1..6], B[1..8]. Выбрать из них положительные элементы и записать соответственно в массивы A [1..k] и B [1..k], где k<6, n<8; из отрицательных элементов сформировать массивы A2 [1..6-k],B2 [1..8-n]. Напечатать суммы и произведения элементов для каждого.
10. Даны массивы A [1..6], B [1..6], C [1..6]. Переставить элементы в них таким образом, чтобы слева подряд были записаны отрицательные, а справа положительные, подсчитать количество положительных и число отрицательных в каждом массиве.
11. Даны две целые квадратные матрицы четного порядка. Элементы массивов с четными номерами строки и столбца заменить нулем (стереть). Напечатать исходные и полученные массивы, количество четных и число нечетных чисел в каждом.
12. Даны одномерные массивы A[1..6], B[1..8], C[1..10]. Записать их в виде матриц AA [1..3,1..2], BB [1..2,2..4], CC [1..5,1..2], найти наименьшие элементы в каждой и напечатать их номера.
13. Даны две целые квадратные матрицы шестого порядка. Распечатать элементы главных диагоналей каждой из них и вычислить суммы элементов отдельно главной и побочной диагоналей.
14. По заданным 10 элементам вещественных массивам A, B и С вычислить
15. Даны матрицы целых чисел V (-1..2,0..3), W [1..3,0..2]. Сформировать из них одномерные массивы VV и WW, записывая элементы построчно. Напечатать индексы исходных мартиц для максимальных значений.
16. Дана матрица чисел H [1..5,1..6]. Переставить элементы в строкам матрицы таким образом, чтобы они были расположены в порядке возрастания их модулей. Подсчитать сколько в исходных матрицах положительных и отрицательных чисел.
17. Дана матрица чисел G [1..2,1..6]. Переставить элементы в матрице так, чтобы элементы каждого столбца матрицы были смещены циклически вправо. Перестановку элементов в столбце реализовать подпрограммой, напечатать два «выпавших» элемента.
18. Даны массивы A [1..6], B [1..6], C [1..6]. Упорядочить элементы в них в порядке убывания их модулей, напечатать наименьшее и наибольшее значения.
19. Даны две матрицы целых чисел V [1..2,1..3], W [1..2,1..3]. Найти общие суммы элементов строк, из функции вернуть две суммы.
20. Даны две целые квадратные матрицы шестого порядка. Вычислить суммы элементов выше главной диагонали и ниже нее. Определить, можно ли отражением относительно главной диагонали преобразовать одну в другую.