- •2.2.Функции, возвращающие значение
- •Void main ()
- •Void Sum(float *s,float *X, int n)
- •Void main ()
- •Void Sumstmatr ( float (*mz)[m], float *mx, int n1, int m1); //прототип функции Sumstmatr
- •Void main ()
- •Void Sumstmatr (float (*mz)[m], float *mx, int n1, int m1)
- •Void main ()
- •Void main()
- •2.3. Функции обработки строк
- •Void strcpy ( char *s, char *t)
- •Void strcpy ( char *s, char *t)
- •Int strcmp ( char * s, char * t)
- •Unsigned strlen (const char *str );
- •Void strcpy (char *s,char *t);
- •Void main ()
- •Int Vs(char *s, char *sl, int d);
- •Int Vs(char *s,char *sl, int d) // функция формирования очередной строки
- •2.4. Рекурсивные функции
- •Void main()
- •3.Классы памяти и области действия описаний
- •Автоматические переменные
- •Внешние переменные
- •Void main ()
- •Void main ()
- •Int a[4]; // указано, что а – локальный массив целого типа
- •Void main ()
- •Статические переменные
- •Void f();
- •Void main ()
- •Void f()
- •Регистровые переменные
- •4.Элементы структурного программирования
- •4.1.Нисходящая разработка
- •4.2.Основные структуры, пошаговая детализация
- •Void main ()
- •Void main ()
- •Void Smog (long mz[][n2]);
- •Void main ()
- •Void Smog (long mz[][n2])
- •4.3.Сквозной структурный контроль
- •Элементы, которые должны проверяться на контрольных сессиях
Void main ()
{
int i, Na, Nb;
float *A, *B;
float s1,s2;
clrscr();
printf("Na = ");
scanf("%d", &Na);// вводим к-во элементов массива А
A = new float[Na]; // выделяем место в оперативной памяти для // массива А
for(i = 0; i < Na; i++)
{ printf("A[%d]=", i );
scanf("%f", A+i); // вводим элементы массива А
}
s1 = Sum (A, Na);
printf("s1= %7.2f\n",s1);
printf("**************\n");
printf("Nb = ");// вводим к-во элементов массива B
scanf("%d",&Nb);
B = new float [Nb];// выделяем место в оперативной памяти для // массива B
for(i = 0; i < Nb; i++)
{ printf("B[%d] =", i );
scanf("%f", B+i); // вводим элементы массива B
}
printf("**************\n");
s2 = Sum (B, Nb);
printf("s2 = %7.2f \n",s2);
getch();
}
Обратите внимание на операторы ввода элементов массивов А иВ (scanf("%f", A+i);иscanf("%f", B+i);). В них:A+i – это адресi–го элемента массиваА (эквивалентная запись -&A[i]). Аналогично для выраженияB+i. Вспомните свойства указателей! А теперь, когда мы справились с обработкой функцией одномерных массивов, попытаемся составить функцию обработки для двумерного массива. Вернемся к задаче-2 из раздела “массивы”. Напомним постановку задачи:
Дано: Матрица вещественных чиселZ[N][M],N= 4,M= 3Определить:
Составим программу решения этой задачи, введя функцию обработки двумерного массива. Но сначала нам нужно решить, как можно передать двумерный массив функции, если формальный параметр может быть только указателем на простой тип или на одномерный массив. Простой тип мы использовали при передаче одномерного массива. Давайте представим себе, что у нас имеется указатель на массив из Мэлементов типаfloat. Вспомним, как можно описать такой указатель? Очевидно, это можно сделать таким образом:float (* p) [M], гдеp и есть тот самый указатель. Программа решения поставленной задачи представлена ниже:
#include<stdio.h>
#include<conio.h>
#define N 4
#define M 3
Void Sumstmatr ( float (*mz)[m], float *mx, int n1, int m1); //прототип функции Sumstmatr
Void main ()
{ float Z[N][M], X[M];
int i,j;
clrscr();
for(i= 0;i<N; i++)
for(j= 0;j<M; j++)
{ printf("Z[%d][%d] = ", i,j);
scanf("%f",&Z[i][j]);
}
Sumstmatr(Z,X,N,M); //вызов функции Sumstmatr
// Z – адрес нулевого элемента нулевой строки массива Z // Х – адрес нулевого элемента массива Х
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();
}
//заголовок функции Sumstmatr
Void Sumstmatr (float (*mz)[m], float *mx, int n1, int m1)
// float (*mz)[M] – указатель на массив из М элементов типа // float
{//начало тела функции Sumstmatr
int i,j;
for(j= 0;j<m1; j++)
{mx[j]=0;
for(i= 0;i<n1; i++)
mx[j]+=mz[i][j];
}
}// конец тела функции Sumstmatr
Отметим, что правила языка Си позволяют при описании формальных параметров вместо выражения float (*mz)[M] писать выражениеfloat mz[][M]. Эти выражения эквивалентны и в каждом описанmz – указатель на массив изМэлементов типаfloat. Соответствующий фактический параметрZ воспринимается транслятором как адрес нулевого элемента одномерного массива элементов типаfloat [M], а выражениеmz[i][j] реализует обращение к элементуZ[i][j]. Остальные элементы программы очевидны.
Следует отметить, что не всегда требуется передача всего двумерного массива. Для примера рассмотрим такую задачу:
Дано: Матрица вещественных чиселZ[N][M],N= 4,M= 3Определить:
Программа решения этой задачи представлена ниже:
#include<stdio.h>
#include<conio.h>
#define N 4
#define M 3
float Smatr ( float *mz, int m1); //прототип функции Smatr