
- •Московский государственный институт пищевой промышленности
- •Type * имя указателя;
- •Int **p7; //неинициализированный указатель на объект типа int * // р7 – указатель на указатель
- •1.2. Типы указателей и операции над ними
- •Операция разыменования
- •Операция преобразования типов
- •Операция присваивания
- •Операция получения адреса указателя
- •Операция сложения и вычитания
- •Операции отношений (операции сравнений)
- •1.3. Массивы Массивы и переменные с индексами
- •Int z[100]; // одномерный массив из 100 элементов типа int char s[80]; // одномерный массив из 80 элементов типа char (строка) float y[3][4];// двумерный массив из 12 элементов типа float
- •Задача – 1
- •Математическая постановка задачи
- •Задача – 2
- •Математическая постановка задачи
- •Инициализация массивов
- •Массивы и указатели
- •Динамические массивы
- •2. Функции, передача параметров
- •2.1.Определение функции
- •Void Sum(float *s,float *X, int n); //прототип функции Sum
Задача – 2
Для заданной матрицы вещественных чисел c4 строками и 3 столбцами рассчитать сумму элементов в каждом столбце. Результат выдать на экран вместе с исходной матрицей и сохранить как одномерный массив.
Математическая постановка задачи
Д
Программа
на Си
//
program
– 5 #
include<stdio.h> #
include<conio.h> #
define N 4
# define M 3
void
main () {int
i,j; float Z[N][M], X[M];
clrscr(); for (i=0; i <N; i++)
for (j=0; j <M; j++)
{ printf
(“Z[%d][%d] = ”, i, j);
scanf (“%f”, &Z[i][j]); }
for (j=0; j <M; j++)
{
X[j] = 0;
for
(i=0; i <N; i++) X[j] += Z[i][j];
}
printf( “Исходнаяматрица\n”);
for (i=0; i <N;
i++) {
for (j=0; j <M; j++)
printf (“%7.2f ”,
Z[i][j]);
printf (“\n”); }
printf(
“Результат решения\n”); for (j=0; j <M; j++) printf (“%7.2f ”, X[j]); getch ( ); }
Алгоритм на АЯРН Начало цикл по iот 0 с шагом 1 доN–1 цикл поjот 0 с шагом 1 доM–1 вводZ[i][j] конец-цикла поj
конец-цикла по I
цикл по jот 0 с шагом 1 доM–1Xj= 0
цикл по iот 0 с шагом 1 доN–1Xj =Xj+Z[i][j] конец-цикла поi
конец-цикла по j
цикл по iот 0 с шагом 1 доN–1 цикл поjот 0 с шагом 1 доM–1
вывод Z[i][j]
конец-цикла по jперевести курсор на новую строку
конец-цикла по iцикл поjот 0 с шагом 1 доM–1 выводXj
конец-цикла по j
конец
В этой программе использованы препроцессорные операторы # define N 4# define M 3. При выполнении этих операторов в текст программы вместо буквNиMвставляются соответственно числа 4 и 3. Дело в том, что хотя в постановке задачи жестко указано, чтоN= 4, aM= 5, возможно возникнет необходимость выполнить программу при других значенияхNиM. В этом случае нам достаточно будет поменять только два значения в операторе# define, и не будет нужно просматривать всю программу, находить в ней соответствующие константы и изменять их. Программисту всегда полезно сделать программу более универсальной, чем требуется в настоящий момент. Но любознательный читатель может спросить: «А нельзя ли сделать так, чтобы число элементов массива можно было вводить с клавиатуры?». В принципе это возможно, если использовать указатели (в таком случае необходимо реализовать динамический массив). Однако этот метод мы рассмотрим позднее.
Пусть исходная матрица задана в следующем виде:
1 2.1 3.1 2 3.2 4.2
1 1 1
2 2 2
Тогда при выполнении программы на экране получим следующую информацию:
Z[0][0]=1
Z[0][1]=2.1
Z[0][2]=3.1 Z[1][0]=2
Z[1][1]=3.2
Z[1][2]=4.2
Z[2][0]=1
Z[2][1]=1
Z[2][2]=1
Z[3][0]=2
Z[3][1]=2
Z[3][2]=2
Исходная
матрица 1.00 2.10 3.10
2.00 3.20 4.20 1.00 1.00 1.00 2.00 2.00 2.00 Результатрешения6.00
8.30 9.30
В заключение одно замечание. Некоторые версии трансляторов Си не воспринимают операторы типа:
scanf (“%f”, &X[i]); scanf (“%f”, &Z[i][j]);
В этом случае следует использовать вспомогательную переменную для ввода элемента массива:
scanf (“%f”, &vp1); X[i] = vp1; scanf (“%f”, &vp2);
Z[i][j] = vp2;
В этом фрагменте vp1 – вспомогательная переменная того же типа, что и элементы массиваХ, аvp2 -вспомогательная переменная того же типа, что и элементы массиваZ.