Функция возвращает одно или несколько значений через аргументы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функция возвращает одно или несколько значений через аргументы



 

ü В описании функции указывается тип - void (неопределенный).

ü Аргументы, которые соответствуют возвращаемым переменным, описываются как указатели:

           void fun (int k, float * ptf, float z).

ü Вызов функции будет самостоятельным оператором.

ü В качестве фактических аргументов для возвращаемых значений, записываются адреса переменных:

    float f;

    fun (20 &f, 5.25);

Необходимость использования указателей, а не имен переменных связана с тем, что при вызове функции в стеке (специальная динамическая область памяти для временного хранения промежуточных данных) создаются копии аргументов функции. Все операции функция выполняет с этими копиями. При выходе из функции стек очищается, копии стираются.

Если мы напишем:

void f (int arg1, int arg2, int arg3)

{ arg3 = arg1 + arg2;}

то фактически исполнится следующая операция:

Копия_arg3 = Копия_arg1 + Копия_arg2;

и значение arg3 не изменится.

Если запишем следующим образом:

void f (int arg1, int arg2, int * arg3)

{ * arg3 = arg1 + arg2; }

то будет выполнен запись суммы по адресу, заданной в копии параметра * arg3:

 

 

 

В результате значение суммы аргументов arg1 и arg2 будет вычислено правильно и сохранено в памяти.

 

Пример 6.5: Написать программу, которая использует функцию для нахождения наибольшего значения из трех переменных. Результат вернуть через аргументы. Текст программы:

Текст программы:

/* Описание функции fmax */

 

void fmax(float x, float y, float z, float *max)

{

if (x>y) *max=x;else *max=y;

if (z>*max) *max=z;

}

 

/* Основная функция main() */

void main()

{

float a,b,c,rez;

scanf("%f %f %f", &a,&b,&c);

fmax(a,b,c,&rez); ) /* вызов функции fmax */

 printf("\n rez= %7.1f ",rez);

}

Аргументом функции является одномерный массив.

Описание функции. Возможны три варианта объявления и использования массива:

1) Одномерный массив объявляется с неопределенным количеством элементов, а среди аргументов должна быть переменная, которая указывает количество элементов:

void name_fun (..., float x[], int n,...)

Внутри функции элементы массива записываются как переменная с индексом - x[i].

 При вызове функции указывается имя массива и его фактический размер

name_fun (..., a, 10,...);

2) Массив объявляется как указатель на массив. Среди аргументов должна быть переменная, которая указывает количество элементов массива:

 void name_fun (float * ptx, int n,...);

Внутри функции элементы массива записываются с помощью указателя *(ptx + i)

При обращении к функции фактический массив можно указать, используя имя или адреса нулевого элемента, а также его размер:

name_fun (..., a, 10,...);

name_fun (..., & a[0], 10,...)

3)Возможен 3-й способ описания массива с указанием фиксированного количества элементов:

name_fun (float a[10],...)

Этот способ имеет недостаток. Функция может работать только с массивами заданной длины.

Пример 6.6. Задано два массива А [10] и В [20]. Найти в них максимальный, минимальный элементы и сумму всех элементов. Сформировать массив и найти сумму в 1-й функции, найти максимальный и минимальный элементы в 2-й функции. Напечатать элементы массива, сумму, максимальной и минимальной элементы в главной функции.

 Текст программы:

/* 1-й функция, формирует массив и находит сумму и возвращает результаты через аргументы*/

void f1(float *x,int n, float *ps)

{

int i;

*ps=0;

for (i=0;i<n;i++)

{

*(x+i)=0.001*rand();

*ps=*ps+*(x+i);

}

}

/*2-й функция, находит максимальный и минимальный элементы и возвращает результаты через аргументы*/

void f2(float *x,int n,

           float *pt_max,float *pt_min)

{

int i;

*pt_max=*pt_min=*x;         

for (i=0;i<n;i++)

{

if (*(x+i)<*pt_min) *pt_min=*(x+i);

if (*(x+i)>*pt_max) *pt_max=*(x+i);

}

 }

/*Основная функция*/

Void main()

 {

 float a[10], b[20];

 float as, amax, amin, bs, bmax, bmin;

 int i;

f1(&a [ 0 ],10,&as); /* вызов функции f1 для массива а */

for (i=0;i<10;i++)

printf(" %7.1f ", a[i]);

printf("\n");  

printf("\n sa= %7.1f ",as);

f2 (&a[0],10,&amax,&amin); /*вызов функции f2 для массива а */

printf("\n");

printf("amax= %6.2f amin= %6.2f\n",amax,amin);

      

f1 (&b[0], 20,&bs); /* вызов функции f1 для массива b */

for (i=0;i<20;i++)

printf(" %7.1f ", b[i]);

printf("\n");  

printf("n sb= %7.1f ",bs);

f2(&b[0], 20,&bmax,&bmin); /*вызов функции f2 длямассива b */

printf("\n");

printf("bmax= %6.2f bmin= %6.2f\n",bmax,bmin);

 

}

Пример 6.7. Найти среднее арифметическое в массиве чисел, размером 20.

Составить функцию, в которой:

• сформировать массив,

• найти среднее арифметическое

• вернуть результат через имя.

В основной программе распечатать массив и результат.

Текст программы:

/* функция формирует массив, находит среднеее арифметическое и возвращает результаты через имя функции */

 float form_sr (float x[],int n)

 {

int i;

float s=0;

for (i=0;i<n;i++)

{

x[i]=0.01*rand();

s=s+x[i];

}

return s/n;

}

 

/* основная функция*/

 void main()

 {

float a[20],sr;

int i;

sr= form_sr(a,10); /* вызов функции */

for (i=0;i<10;i++)

printf(" %7.1f ", a[i]);

printf(" \n ");

printf("sr= %6.2f",sr);

 }

Пример 6.8 Заданы три массива F[8], G[12], H[15], элементы которых вычисляются по формулам:

fi=1.7*i*cos(2.5*i)

gj=2.9*j*cos(3.1*j)

hl=3.5*l*cos(5.4*l)

 

Для каждого массива вычислить среднее значение элементов (sf, sg, sh) и количество элементов, которые больше среднего значения (kf, kg, kh).

У данной задаче рационально использовать функции, которые будут выполнять следующее:

·  формирование массива Х из n элементов по формуле:

              x[i]=a*i*cos(b*i), i=1..n

· вычисления среднего значения sx:

   

· подсчет кх – количество x[i]>sx

Текст программы:

 

/* Описание функции формирования массива.

 Функция формирует и печатает массив.

Входные аргументы- размер n и коэффициенты а и b.

Выходной аргумент - массив */

 

void fmas(float *x, int n, float a, float b)

{

int i;

for(i=0;i<n;i++)

{

    *(x+i)=a*i*cos(b*i);

    printf("%.3f ",*(x+i));

    }

}

                                                            

/* Описание функции нахождения среднего арифметического.

 Функция находит среднее арифметическое и возвращает результат через аргумент.

Входные аргументы – массив и его размер,

возвращаемый – среднее арифметическое */

 

void f_sr(float *x, int n, float *pt_sx)

{

int i;

float sx=0;

for(i=0;i<n;i++) sx=sx+*(x+i);

sx/=n;

*pt_sx=sx;

}

 

 

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

 Возвращает результаты через аргументы.

Входные аргументы – массив и его размер,

 возвращаемый – количество элементов */

 

void f_kolelm(float *x, int n, float sx, int *pt_kx)

{

int i, kx=0;

    

for(i=0;i<n;i++)

    if(*(x+i)>sx) kx++;

    *pt_kx=kx;

}

 

/* Основная функция */

Void main()

{

float f[8], g[12], h[15], sf, sg, sh;

int kf, kg, kh;

 

printf(“Массив f из 8 элементов \n”);

/* вызов функции для массива f */

fmas(&f[0], 8, 1.7, 2.5);

f_sr(&f[0], 8, &sf);

f_kolelm (&f[0], 8, &sf, &kf);

printf(“sf=%.3f kf=%d\n”,sf,kf);

 

printf(“Массив g из 12 элементов \n”);

/* вызов функции для массива g */

fmas(&g[0], 12, 2.9, 3.1);

f_sr(&g [0], 12, & sg);

f_kolelm (&g [0], 12, & sg, & kg);

printf(“sg=%.3f kg=%d\n”,sg,kg);

 

printf(“Массив H из 15 элементов \n”);

/* вызов функции для массива   h */

fmas(&h[0], 15, 3.5, 5.4);

f_sr(&h[0], 15, & sh);

f_kolelm (&g [0], 12, & sh, & kh);

printf(“sh=%.3f kh=%d\n”,sh,kh);

}

4. Аргументом функции является двумерный массив (матрица)

 

Описание функции. Такой аргумент можно описать 3-мя способами: 

1. Матрица объявляется с заданным количеством строк и столбцов void name_fun (float c [5][10],...)

Внутри функции элементы массива записываются конечно, как переменная с индексом - c[i][j].

При вызове функции указывается имя массива.

name_fun (a,...);

Недостаток этого способа - функция может работать только с матрицами заданного размера.

2. Матрица объявляется как массив с неопределенным количеством строк и заданным количеством столбцов 

void name_fun (float c [] [10], int m,...)

где: m - количество строк

Внутри функции элементы массива обозначаются c[i][j]

При вызове функции указывается имя массива и фактическое количество строк

name_fun (a, 4,...)

Достоинством является то, что функция может работать с матрицами, которые имеют различное количество строк, например: A [5] [10], B [8] [10], C [20] [10].

Недостаток - длина строки (второй параметр) фиксированная - 10.

3. Матрица объявляется как указатель на массив:

void name_fun (float * ptc, int m, int n,...)

где: m - количество строк; n - количество столбцов.

Доступ к элементам массива осуществляется с помощью выражения  

*(ptc + i*m + j).

При обращении к функции нужно указать фактический массив с помощью адреса нулевого элемента и его размеры:

name_fun (&a[0][0], 10,8,...).

Этот способ является универсальным, так как функция может работать с массивами любых размеров.

Пример 6.9. Задана матрица действительных чисел размером 4х4. Найти сумму элементов матрицы, значение которых не превышает среднего арифметического всей матрицы.

Выполнить формирования матрицы и все расчеты с помощью функций.

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

Рассмотрим все три варианта описания матрицы при объявлении функции.

1.Матриця объявляется с заданным количеством строк и столбцов.

Текст программы:

void sum(float x[4][4],float *pt_sr)

{

int i,j;

float s=0, sr;

for (i=0;i<4;i++)

for (j=0;j<4;j++)

{

x[i][j]= 0.0001*rand();

s=s+ x[i][j];

}

sr=s/16;

 *pt_sr=0;

for (i=0;i<4;i++)

for (j=0;j<4;j++)

if (x[i][j] < sr) *pt_sr=*pt_sr+ x[i][j];

}

 

 void main()

 {

float a[4][4], ssr;

int i,j;

sum(a,&ssr );

for (i=0;i<4;i++)

{

printf("\n");

for (j=0;j<4;j++)

printf("%5.1f",a[i][j]);

}

printf("\n ssr= %6.2f \n",ssr);}

2. Матрица объявляется как массив с неопределенным количеством строк и заданным количеством столбцов.

Текст программы:

 void sum(float x[][4],int l,float *pt_sr)

{   

int i,j;

float s=0, sr;

for (i=0;i< l;i++)

for (j=0;j<4;j++)

{

x[i][j]= 0.0001*rand();

s=s+ x[i][j];

}

sr=s/ l*4;

 *pt_sr=0;

for (i=0;i< l;i++)

for (j=0;j<4;j++)

if (x[i][j] < sr) *pt_sr=*pt_sr+ x[i][j];

}

 

  void main()

 {

float a[6][4],ssr;

int i,j,m;

printf(“задайте количество строк и столбцов матрицы ”);

scanf(“%d”,&n);

sum(a,m,&ssr);

for (i=0;i< n;i++)

{

printf("\n");

for (j=0;j<4;j++)

printf("%5.1f",a[i][j]);

}

printf("\n ssr= %6.2f \n",ssr);

 }

3.Матрица объявляется как указатель на начало массива:

Текст программы:

void sum (float *ptx, int n,int m,float *pt_sr)

{   

int i,j;

float s=0, sr;

for (i=0;i< n;i++)

for (j=0;j< m;j++)

{

*(ptx+i*m+j)=0.0001*rand();

s=s+*(ptx+i*m+j)=

}

sr=s/ n*m;

 *pt_sr=0;

for (i=0;i< n;i++)

for (j=0;j< m;j++)

if (*(ptx+i*l+j)< sr) *pt_sr=*pt_sr+*(ptx+i*l+j)=

}

 

Void main()

 {

float a[6][8];

int i,j;

printf(“задайте размеры матрицы”);

scanf(“%d%d”,&k,&l);

sum (&a[0][0],k,l,&ssr);

for (i=0;i<k;i++)

{

  printf("\n");

  for (j=0;j<l;j++)

  printf("%5.1f",a[i][j]);

}

  printf("\n ssr= %6.2f \n",ssr);

}

 

Пример 6.10. Задана матрица A [5][4]. Определить сумму элементов строки и произведение элементов столбца, на пересечении которых находится максимальный элемент.

Использовать следующие функции:

- формирования матрицы;

- вывод на печать;

- нахождения номеров строки и столбца, на пересечении которых находится максимальный элемент;

- нахождения суммы.

В основной функции осуществить вызов функций в соответствующем порядке и распечатать значение суммы и произведения.

  

 Текст программы

/*функция формирует матрицу, которая объявлена с помощью указателя*/

void form (float *ptx, int n,int l)

{ int i,j;

for (i=0;i<n;i++)

for (j=0;j<l;j++)

  *(ptx+i*l+j)= 0.001*rand();

 }

 

/*функция печатает матрицу, которая объявлена с помощью указателя */

void vuvod (float *ptx, int n,int l)

{

int i,j;

for (i=0;i<n;i++)

{

  printf("\n ");

for (j=0;j<l;j++)

printf("%6.2f ",*(ptx+i*l+j));

}

}

 

/*функция находит номера строки и столбца, на пересечении которых находится максимальный элемент. Матрица объявлена с помощью указателя. Результат возвращается через аргументы*/

void find_max

(float *ptx,int n,int l, int *nstr, int *nstb)

{

int i,j;

float max=-10000;

for (i=0;i<n;i++)

for (j=0;j<l;j++)

if (*(ptx+i*l+j)> max)

{ max =*(ptx+i*l+j);

*nstr =i; *nstb =j;

}

}

/*функция, с помощью которой находится сумма. Результат возвращается через имя функции*/

 

  float find_s (float * ptx, int l, int nstr)

{

int j;

float s =0;

for (j=0;j<l;j++)

s=s+ *(ptx+nstr*l+j);

return s;

}

/* функция, с помощью которой находится произведение.

Результат возвращается через имя функции */

 

  float find_pr (float *ptx, int n, int l, int nstb)

{

int i;

float pr=1;

for (i=0;i<n;i++)

pr=pr* *(ptx+i*l+nstb);

return pr;

}

 

/*основная функция*/

Void main()

{

float a[5][4],sum, prouz;

int k,m,nstr1,nstb1;

 

form (&a[0][0], 5,4);

vuvod (&a[0][0], 5,4);

find_max (&a[0][0], 5,4 ,&nstr1,&nstb1);

printf("nom_stroki=%d nom_stolbza= %d \n",nstr1,nstb1);

 

sum=find_s (&a[0][0], 4, nstr1);

printf("\n sum= %6.2f\n",sum);

 

prouz=find_pr (&a[0][0], 5,4, nstb1);  

printf("\n pr= %6.2f\n",prouz);

}

}

 

Пример 6.11. Заданы две матрицы A [5][4], B[8][5], элементы которых вычисляются по формулам:

a i,j=1.9ij2-3.7i2j

b k,l=2.5kl2-4.1k2l

Для каждой из матриц удалить строки, в которых нет положительных элементов.

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

  x[i][j]=k1*i*j2-k2*i2 *j

Значения коэффициентов k1 и k2 должно передавать как аргументы функции.

Текст программы

/*функция, которая формирует матрицу*/

 

void form(float *ptx,int n,int l, float k1,float k2)

int i,j;

for (i=0;i<n;i++)

for (j=0;j<l;j++)

*(ptx+i*l+j)=k1*(i+1)*(j+1)*(j+1)+k2*(i+1)*(i+1)*(j+1);

 }

 

/*функция, которая печатает матрицу*/

void vuvod (float * ptx, int n, int l)

{

int i,j;

   for (i=0;i<n;i++)

   { printf("\n ");

for (j=0;j<l;j++)

printf("%6.2f ",*(ptx+i*l+j));

}

}

 

/*функция, находит строки, в которых нет положительных элементов, и удаляет их. Возвращает также количество строк, которые остались*/

 

void fun_yd(float *ptx, int n, int l, int *kst)

{

int i,j,r, k, kyd=0;

  for (i=n-1;i>=0;i--)

  {

      k=0;

    for (j=0;j<l;j++)

    if (*(ptx+i*l+j)<=0) k++;

if (k==l) { kyd++;

            for (r=i; r<n; r++)

            for (j=0;j<l;j++)

                *(ptx+r*l+j)=*(ptx+(r+1)*l+j);

            }

  }    

*kst=n-kyd;

}

 

/* основная функция */

 void main()

 {

float a[8][5],b[12][6];

int i,j,kk;

clrscr();

form(&a[0][0],5, 4, 1.9, -3.7);

printf("\n исходный массив А ");

vuvod (&a[0][0],5,4);

fun_yd(&a[0][0], 5, 4, &kk);

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

printf("\n результирующий массив А ");

vuvod (&a[0][0], kk, 4);

 getch();

 

form(&b[0][0],8,5,2.5,-4.1);

printf("\n исходный массив B ");

vuvod (&b[0][0],8,5);

 fun_yd(&b[0][0], 8, 5, &kk);

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

printf("\n результирующий массив B ");

vuvod (&b[0][0], kk, 5);

 getch();

 }

 

5. Аргументом функции является другая функция

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

<тип1>< имя 1>(<тип2> (*<имя 2>) (<типы аргументов>)…)

де: тип1 – тип функции;

имя 1 – имя функции;

тип2 – тип функции, которая является аргументом;

* имя 2 – указатель на имя функции, которая является аргументом;

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

Например:

 void namefun (void *pfun (int, float, float)…)

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

<тип>< имя >(<тип_арг1> <имя_ арг2>, …)

Например:

     float f1 (float x)

     {

....

     }

Таких функций может быть несколько.

При вызове функции в списке аргументов указывается только имя фактической функции-аргумента:

     namefun (f1 (арг1, ар2,...))

де f1 – имя фактичной функции.

Пример:6.12  Задано две функции

f1=sin(x)+1.3*x на отрезке [-6, 4]

f2=2*cos(x)-3.5*x на отрезке [- 4, 5]

для которых нужно найти максимальные значения функции, и соответствующие значения аргументов.

Текст программы:

/* описание функции, которая находит максимальное значение функции-аргумента */ 

 

void f_max(float (*ptf)(float), float xn, float xk, float dx,float *max, float *xxk)

{float x;

x=xn;

*max= ptf(x);*xxk=x;

do

{

x=x+dx;

if(ptf(x)>*max) {*max=ptf(x);*xxk=x;}

}

while (x<xk);

}

 

 

/* описание функции, которая является  фактическим аргументом*/ 

 

Float f1 (float x)

  {

return sin(x)+1.3*x;

  }

 

/*описание второй функции, которая является  фактическим аргументом */

 

Float f2 (float x)

  {

return 2*cos(x)-3.5*x;

  }

 

/*основная функция*/ 

Void main()

{

float max1,x1,max2,x2,

xn1=-6,xk1=4,dx1=0.1,

xn2=-4,xk2=5,dx2=0.1;

 

/*вызов функции для обработки первой функции-аргумента */

 

f_max(f1, xn1, xk1, dx1, &max1, &x1 );

printf("\n x1= %6.1f max1= %6.2f \n",x1, max1);

 

/* вызов функции для обработки второй функции-аргумента */

 

f_max(f2, xn2, xk2, dx2, &max2, &x2 );

printf("\n x2= %6.1f max2= %6.2f \n",x2, max2);

}

6.4 Контрольные вопросы

 

1. Что такое функция?

2. Из каких двух этапов состоит использования функции?

3. Как выглядит структура программы с использованием функции?

4. Как выглядит описание функции?

5. Как выполняется вызов функции?

6. Какие аргументы называются формальными, а какие фактическими, какие требования предъявляются к использованию формально-фактических аргументов?

7. Как выглядит описание функции, если результат возвращается через имя функции?

8. Как выглядит описание функции, если результат возвращается через аргументы функции? Как выполняется ее вызов?

9. Напишите два варианта программы, содержащие функцию, в которой формируются значения одномерного массива и находится сумма. В основной программе выполняется печать суммы. В первом варианте результат надо передать через имя функции, а во втором через аргумент.

10. Какие существуют варианты описания функции, если ее аргументом является одномерный массив? Как обозначается элемент массива? Как осуществляется вызов?

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

12. Какие существуют варианты описания функции, если ее аргументом является двумерный массив? Как обозначается элемент массива? Как осуществляется вызов?

13. Напишите программу, содержащую 2 функции. В первой формируются значения массива. Во второй находится сумма всех элементов матрицы. В основной программе вводится размер матрицы и выполняется печать. При передаче матрицы используйте указатель.

14. Как выглядит описание функции, если аргументом является вторая функция? Как выполняется вызов? Что используется в качестве фактической функции?


СИМВОЛЬНЫЕ СТРОКИ

Символьные строки хранят такую информацию, как имена файлов, названия книг, имена служащих и другие символьные сочетания. Большинство программ на Cи широко используют символьные строки. В Cи символьные строки хранятся в массиве типа char, который заканчивается символом NULL (или ASCII 0). Таким образом, строкой в Си называется последовательность из одного или нескольких символов, которые заканчиваются на “\0” –ноль-символом. В Си отсутствует специальный тип для объявления строк, и для этого используют стандартный тип символов – char.

По отношению к строкам можно сказать следующее.

Чтобы объявить символьную строку, необходимо объявить массив типа char, Чтобы присвоить символы символьной строке, надо просто присваивоить символы элементам массива символьных строк. Программы Cи используют символ NULL (ASCII 0), чтобы отметить последний символ строки. Cи позволяет программам инициализировать символьные строки при их объявлении. Программы могут передавать символьные строки в функцию, как и любой массив.

Символьные данные

Символьный тип (сhar) — простой тип данных, предназначенный для хранения одного символа. В языке Си размер типа равен одному байту. Каждому символу сопоставлено число от 0 до 255, которое называется ASCII-кодом символа. Так как char - порядковый тип, то к его значениям применимы следующие функции:

succ ()- возвращает следующий символ литерного множества;

pred() - возвращает предыдущий символ литерного множества;

ord ()- возвращает значение кода литеры;

chr ()- возвращает значение литеры по ее коду, является обратной по отношению к функции ord().

Например:

succ('0')='1'- символ, следующий за символом 0, равен символу 1;

pred('3')='2‘ - символ, предшествующий символу 3, равен 2;

chr(65)='A' - символ, соответствующий коду 65, равен А;

ord('A')=65 - код символа А равен 65.

 

Объявления строковых данных

Имеется несколько способов описания и задания строк:

- Строковая константа.

- Символьный массив как строка.

- Указатель на символьный тип как строку.

- Многомерный символьный массив как набор строк.

- Массив указателей символов как набор строк.

Рассмотрим указанные способы описания строк и приемы работы со строковыми данными при различных вариантах описания.

1.Задание строки в форме строковой константы.

При этом строка задается в “ “, компилятор сам добавляет в конце \0. Используется чаще всего в управляющих строках операторов.

scanf (“%f…”,…);

printf (“rez=…”,…);

printf(“Исходные данные \n”);

 

2.Задание строки в виде массива символьного типа.

При этом возможны два случая: явное указание длины и неявное указание длины массива.

- Явное указание длины подразумевает указание конкретного количества символов, которые могут быть записаны в виде строки:

char <имя> [N];

где: char - тип массива символов;

  < имя > - имя массива;

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

Например:     char texts[25].

Одновременно с объявлением возможно инициализировать строку:

char имя[N]=”последовательность из К–символов”;(К<=N-1)

char aud[20]=”аудитория 8.712”

- При неявном указании длины организуется массив такой длины, сколько символов в заданной строке +1 (“0” символ).  Признаком массива служат квадратные скобки.

char <имя> [ ]=”последовательность символов”

В случае задания строки в виде массива, к каждому символу строки можно обращаться как к элементу массива с помощью индекса – имя[i].

3.Строка в виде указателя на символьный тип.

char *имя = “последовательность символов”

В этом случае создается указатель на символьный тип и ему присваивается адрес размещения строки. При объявлении возможна инициализация массива.

Например: char *pst1= “композитор”;

Обращение к элементу массива выглядит следующим образом: *(pst1+i).

4. Многомерный символьный, массив как набор строк.

Строковые данные можно представлять не в виде одной строки, а в виде нескольких строк. В таком случае при объявлении указывается количество строк и максимальное количество символов, которые можно поместить в одной строке.

char имя [m][n] = {“ строка 1”,

              “ строка 2”,

                  …

              “ строка L” }

 

char fruits[5][10] = { “яблоко”,

                  “ сливы”,

                     …

                  “ абрикосы” };     

В данном варианте задания строк, к каждому символу можно обращаться, как к элементу двумерного массива, с помощью индексов – имя[i][j].

5. Массив указателей на символьный тип, как набор строк.

Для объявления нескольких строк можно использовать указатели.

В таком случае при объявлении указывается массив указателей на символьный тип. Размер массива соответствует количеству строк. Одновременно возможна инициализация.

 

char *имя [M] ={“ строка 1”,

            “ строка 2”,

              …

            “ строка L” }  

 L ≤ M

Для обращения к отдельному символу используется следующее выражение         *(pfruits[i] +j)

 

Ввод-вывод строковых данных

 

При вводе-выводе строк необходимо обязательно зарезервировать память для строки.

Для ввода строковых данных возможно использовать следующие функции: scanf () с форматом %s;

gets(имя строки). 

Например:  char fio[30];

scanf(“%s”, fio);

gets (fio);

Для вывода строковых данных возможно использовать функции:

 ptintf() с форматом %s;

 puts(имя строки).

  Например: printf(“%s”, fio);

puts(fio);

Обе функции выводят все содержимое строки на экран без 0- символа. Отличие состоит в том, что printf() может переводить курсор на другую строку или нет, а puts() – переводит обязательно.



Поделиться:


Последнее изменение этой страницы: 2021-04-04; просмотров: 57; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.198.173 (0.38 с.)