- •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 ()
{ float Z[N][M], X[N];
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]); //ввод элемента Z[i][j] матрицы Z
}
for(i= 0;i<N; i++)
X[i] = Smatr(Z[i],M); //обращение к функции Smatr и
// формирование элемента X[i] вектора Х
for(i 0;i<N; i++)
{
for(j= 0;j<M; j++)
printf("%7.2f ", Z[i][j]); //выдача введенной матрицы
printf("\n");
}
printf("***********\n");
for(i= 0;i<N; i++)
printf("%7.2f ",X[i]); // выдача вектора Х
getch();
}
float Smatr ( float *mz, int m1) // заголовок функции Smatr
{ //начало тела функции
int j;
float s;
for(j= 0;j<m1; j++)
s+=mz[j];
return s;
}// конец тела функции
В этой программе фактический параметр Z[i] – это адресi –ой строки матрицыZ. Соответствующий ему формальный параметр (float *mz) – это указатель на элемент типаfloat, а выражениеmz[j] в функции реализует обращение кj- элементуi –ой строки матрицыZ, т. е. к элементуZ[i][j].
Ну а если мы хотим использовать динамический массив? Как реализовать данную задачу, например, в последнем примере? Это возможно сделать с помощью указателя на указатель.
Возможный вариант программы с динамическими массивами Z иX, использующей уже проверенную функциюSmatr, представлен ниже:
# include <stdio.h>
# include <conio.h>
float Smatr(float *mz, int m1);
Void main()
{ int N,M,i,j;
float **Z, *X, zz;
clrscr();
printf("N= ");
scanf("%d",&N); //ввод количества строк
printf("M= ");
scanf("%d",&M); //ввод количества столбцов
X = new float[N];//выделение памяти для массива Х
Z = new float*[N];// выделение памяти для массива указателей // на указатели типа float*
for ( i=0;i<N;i++)
Z[i]=new float [M]; //выделение памяти для i – ой строки
// массива Z
for ( i=0;i<N;i++)
for ( j=0;j<M;j++)
{printf("Z[%d][%d]=",i,j);
scanf("%f",&zz); //ввод вспомогательной переменной
Z[i][j]=zz; //формирование значения элемента Z[i][j]
}
printf("\n********************\n");
for ( i=0;i<N;i++)
{printf("\n");
for ( j=0;j<M;j++)
printf("%6.2f",Z[i][j]); //распечатка введенной матрицы
}
printf("\n********************\n");
for ( i=0;i<N;i++)
{ X[i] = Smatr(Z[i],M); //обращение к функции Smatr и // формирование элемента X[i]
printf("%6.2f\n",X[i]); //выдача значения элемента X[i]
}
getch();
}
float Smatr(float *mz, int m1)
{
int j;
float s;
for (j=0;j<m1; j++)
s+=mz[j];
return s;
}
В этой программе для ввода массива Z использована вспомогательная переменнаяzz. Однако можно было обойтись и без вспомогательной переменной. В этом случае фрагмент программы, обеспечивающий ввод, выглядит следующим образом:
for ( i=0;i<N;i++)
for ( j=0;j<M;j++)
{printf("Z[%d][%d]=",i,j);
scanf("%f", Z[i] + j); //ввод элемента Z[i][j]
}
Вспомним, что адрес нулевого элемента i – ой строки массиваZ, аZ[i] + j – адресj –го элементаi – ой строки массиваZ.
2.3. Функции обработки строк
В Си нет операторов для обработки строк как отдельных операторов, но имеется обширная библиотека стандартных функций для обработки строк. В настоящем разделе мы познакомимся с двумя библиотечными функциями обработки строк, что будет весьма полезно для вашей профессиональной подготовки.
Рассмотрим функцию копирования строк с именем strcpy: