Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



При использовании данного варианта должны выполняться следующие требования:

- при описании указывается тип void;

- аргументы с возвращаемыми значениями должны быть описаны как указатели (<тип> *ptx,…);

- внутри описания функции этот аргумент должен быть указан как указатель *ptx=…;

- вызов функции осуществляется как самостоятельный оператор < имя> (…,&x,…)

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

.

void find_max (float a,float b,float c, float *max)

{

if(a>b) * max=a; else *max=b;

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

}

void main()

{

scanf(“%f%f%f”x,y,z,);

float x, y, z,rez;

find_max (x,y,z,&rez);

printf(“max=%.2f\n”, rez);

}

Варианты индивидуальных заданий

1. Найти минимальный элемент среди положительных элементов массива А.

2. Найти сумму отрицательных элементов массива А.

3. Найти максимальный элемент среди отрицательных элементов массива А.

4. Найти среднее арифметическое элементов массива А с четными индексами.

5. Найти среднее арифметическое отрицательных элементов массива В.

6. Найти разность между максимальным и минимальным элементами массива В.

7. Найти среднее арифметическое элементов массива В, принадлежащих отрезку [1.2; 8.5].

8. Найти разность между произведением и суммой положительных элементов массива А.

9. Вычислить сумму положительных элементов массива А, принадлежащих отрезку [0; 2].

10. Найти большее между модулями максимального и минимального элементами массива В.

11. Найти среднее арифметическое положительных элементов массива В.

12. Найти среднее арифметическое элементов массива А с нечетными индексами.

13. Найти произведение положительных элементов массива А.

14. Вычислить разность между модулями суммы и произведения элементов массива А, принадлежащих отрезку [0; 2].

15. Найти среднее между максимальным и минимальным элементами среди элементов массива А, принадлежащих отрезку [-24; 12].

16. Найти большее между количеством положительных и отрицательных элементов массива А.

17. Вычислить разность между суммой и произведением элементов массива А, принадлежащих отрезку [-2; 2].

18. Найти произведение положительных элементов массива А.

19. Найти разность между количеством положительных элементов и количеством отрицательных элементов массива А.

20. Найти большее из модулей сумм отрицательных и положительных элементов массива А.

21. Найти среднее арифметическое положительных элементов массива В.

22. Найти разность между модулями максимального и минимального элементов массива В.

Контрольные вопросы и практические задания:

1. Каково назначение функций?

2. Какие два этапа подразумевает использование функции?

3. Как осуществляется описание функции?

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

5. Какие существуют варианты вызова функции?

6. Чем определяется тип функции?

7. Как организуется работа оператора return?

8. Какие требования предъявляются аргументам функции?

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

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

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

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


ЛАБОРАТОРНАЯ РАБОТА №2

ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ ПРИ ОБРАБОТКЕ ОДНОМЕРНЫХ МАССИВОВ

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

2.1 Требования к выполнению работы.

· Для выполнения всех расчетов использовать несколько функций, каждая из которых выполняет отдельную задачу:

- ввод данных;

- печать массива;

- вывод результатов;

- нахождение промежуточных и конечных результатов

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

· Рассмотреть два варианта описания массива – как массив с неопределенным количеством элементов и с помощью указателя.

2.2 Теоретические положения

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

1) как массив с неопределенным количеством элементов:

void fun(float a[], int n,…)

где n – количество элементов массива a.

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

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

fun(y, 20,…);

2) как указатель на начало массива:

void fun(float *pta, int n,…)

где n – количество элементов массива.

Внутри функции элементы массива записываются через указатель

*(pta+i) == a[i].

Вызов функции может осуществляться двояко - на первом месте указывается имя массива, на втором – количество элементов, или на первом месте указывается адрес нулевого элемента, на втором – количество элементов:

fun(y, 20,…);

fun(&y[0], 20,…);

Пример.

Заданы два массива, А[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;

clrscr();

f1(a,10,&as); /*виклик функції f1 для масиву а */

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

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

printf("\n");

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

f2(a,10,&amax,&amin);/*виклик функції f2 для масиву а */

printf("\n");

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

f1(b,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,20,&bmax,&bmin);/*виклик функції f2 для масиву b */

printf("\n");

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

}

2.3 Варианты индивидуальных заданий

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

Таблица 2.1 Варианты индивидуальных заданий.

Задания для составления подпрограммы Массивы и формулы их получения.
     
  Найти для каждого массива количество элементов, значение которых меньше среднего арифметического значения. В каком массиве их больше. c[i]=2.8+5.1*sin(i/2+0.5) r[j]=6.6+4.7*sin(j/3-1.2) s[l]=1.7-3.6*sin(l/4+0.2) i=1 60, j=1 10, l=1 18
  Найти сумму максимальных элементов, найденных для каждого из массивов.   d[i]=3.1*i-59.7*i-16.2 f[j]=5.4*j-82.1*j+29.6 p[k]=-6.9*k+31.2*k-10.5 d[18], f[40], p[22]
  Найти для каждого массива разность между максимальным и минимальным значениями. В каком массиве она наиболь- шая. d[j]=1.5(j-3.2)-1.1*j h[k]=2.7(k-0.8)-0.5*k u[n]=3.3(n+2.5)-1.8*n d[20], h[40], u[20]
  Из исходных массивов сформировать массив d [3], элементы которого равны количеству отрицательных элементов в исходных массивах. Найти большее значение элемента и его номер в массиве d a[i]=9.6i-15.3tan(i+1.5) b[j]=11.2j+18.1tan(j+1.5) c[k]=-8.7k+11.6tan(k-2.2) a[20], b[50], c[16]
  Найти для каждого массива разность между максимальным и средним арифметическим значениями. a[i]=1.4i-2.9e b[j]=-8.5j+1.6e c[k]=11.3k-4.7e a[20], b[10], c[14]
  Определить сумму минимальных элементов, найденных для каждого массива и сумму максимальных элементов. Определить большее значение из модулей этих двух значений. a[i]=3.8i-12.4i+5.1 b[j]=5.6j+11.5j-29.3 c[k]=18.1k-6.8k-9.9 a[8], b[16], c[12]
  Найти для каждого массива отношение между максимальным и средним арифметическим значениями. a[i]=1.2(i-2)*sin(i) f[j]=5.9(j-5)*sin(j) z[k]=12.3(k-4)*sin(k) а[8], f[6],z[10]
  Найти для каждого массива количество элементов, значение которых меньше среднего между минимальным элементом и максимальным. b[i]=2.8-(i+4.5) c[i]=-12.6+(i-2.2) z[i]=-9.1-(i+5.7) b[18], c[12],z[10]
  Найти отношение между максимальным и минимальным значениями элементов массива. a[i]=2.9(i-1.5)-3.1i s[k]=11.7(k-3.1)-8.1k b[j]-4.7(j+2.2)-5.6j a[10], s[12], b[30],
  Определить большее значение из трех значений сумм элементов, найденных для каждого массива.   d[i]=13.4i-exp(0.5i) p[k]=8.7k-exp(-1.4k) h[j]=-21.5j+exp(0.5j) i=1 50, k=1 12, j=1 12
  Сформировать массив Р[р123], где компоненты pi определяются как cумма положительных значений элементов одномерных массивов. Найти максимальный элемент этого массива. b[i]=lg(1.5i)+tan(i-5.5) c[l]=lg(8.5l)+tan(l+3.9) d[j]=lg(2.9j)-tan(j+1.7) i=1 60, j=1 80, l=1 30
  Из исходных массивов сформировать массив d [3], элементы которого равны количеству положительных элементов в исходных массивах. Найти меньшее зна-чение элемента и его номер в массиве d. p[i]=4.8sin(i-2.7) z[k]=2.5sin(k+5.4) x[j]=11.6sin(j-4.4) i=1 7, k=1 5, j=1 8
  Сформировать массив v(r1,r2,r3,r4), компоненты которого равны минимальным значениям элементов соответствующих массивов. Найти сумму элементов этого массива. g[i]=15.3i-16.9i+4.7 z[k]=8.8k-12.4k-5.9 x[m]=6.7m+2.5m-18.6 i=1 40, k=1 50, m=1 70
  Определить для каждого массива разность cуммы положительных элементов и суммы модулей отрицательных элементов.   a[i]=2.7i-(i+4.1) b[i]=12.4i-(i+21.6) c[i]=-8.9i+(i-1.3) а[18], b[20], c[10]
  Определить отношения максимального и минимального элементов для указанных массивов. Найти z = а + b + с, где а, b, с - отношения максимального и минимального элементов c[i]=tan(2.5i)+sin(1.8i) d[i]=tan(3.2i)+sin(2.5i0 f[i]=tan(5.6i)+sin(3.7i) c[18], d[20], f[10]
  Определить, какой из массивов имеет большее количество элементов, которые принадлежат отрезку [a,b] Значения a и b задаются при вводе. c(i)=17.2i*sin(i-1.1) f(j)=5.9j*sin(j+2.4) p(m)=12.3m*sin(m-2.9) c[20], f[40], p[10]
  Найти для каждого из массивов разницу между произведениями элементов с четными индексами и элементов с нечетными индексами. Определить в каком массиве она наибольшая: x[i]=3.7sin(i-5) z[k]=12.2sin(k-3.7) y[j]=5.4sin(j+2.2) x[28], z[12], y[10]
  Определить в каком массиве наибольшее среднее арифметическое. Выстроить эти значения в порядке убывания. u[k]=-2.5+1.8k+14.2* lg(k) z[m)=1.6-0.5m+5.9*lg(m) x[l]=1.3+3.5l-2.7*lg(l) u[18], z[32], x[40]
  Сформировать массив B(bl,b2,b3), компоненты которого равны минимальным элементам соответствующих массивов. Определить большее значение из массива B. r[i]=1.5tan(5.7i) p[j]=4.3tan(2.9j) q[l]=11.6tan(8.2l) r[42], p[20], q[16]
  Определить для каждого массива значение среднего арифметического. Найти сумму этих значений и большее из них. c[i]=17.2i*sin(i-1.1) f[j]=5.9j*sin(j+2.4) p[m]=12.3m*sin(m-2.9) c[10], f[20], p[30]
  Определить разности q между максимальным и минимальным значениями элементов массивов. В каком из массивов она наименьшая. d [j]=1.5(j-3.2)-1.1*j h[k]=2.7(k-0.8)-0.5*k u[n]=3.3(n+2.5)-1.8*n d[15], h[10], u[20]
  Сформировать массив R, компоненты которого являються минимальными по абсолютному значению элементами соответствующих массивов. Упорядочить массив R по возростанию.   g[i]=15.3i-16.9i2+4.7 z[k]=8.8k-12.4k2-5.9 x[m]=6.7m+2.5m2-18.6 g[12], z[20], x[15]
  Найти сумму минимальных элементов, найденных для каждого из массивов. Определить в каком массиве он наибольший.   d[i]=3.1*i-59.7*i-16.2 f[j]=5.4*j-82.1*j+29.6 p[k]=-6.9*k+31.2*k-10.5 d[18], f[40], p[22]
  Определить для каждого массива значение максимального элемента. Найти сумму этих значений и большее из них. c[i]=17.2i*sin(i-1.1) f[j]=5.9j*sin(j+2.4) p[m]=12.3m*sin(m-2.9) c[12], f[24], p[15]
  Сформировать массив X(xl,x2,x3), компоненты которого равны максимальным элементам соответствующих массивов. Упорядочить массив X, о пределить большее значение из массива X. r[i]=1.5tan(5.7i) p[j]=4.3tan(2.9j) q[l]=11.6tan(8.2l) r[42], p[20], q[16]
  Определить разности q между максимальным и минимальным значениями элементов массивов. Упорядочить их и определить в каком из массивов она наибольшая. c [j]=1.5(j-3.2)-1.1*j a[k]=2.7(k-0.8)-0.5*k y[n]=3.3(n+2.5)-1.8*n c[15], a[10], y[20]
  Из исходных массивов сформировать массив r [3], элементы которого равны количеству положительных элементов в исходных массивах. Найти большее значение элемента и его номер в массиве d a[i]=9.6i-15.3cos(i+1.5) b[j]=11.2j+18.1cos(j+1.5) c[k]=-8.7k+11.6 cos(k-2.2) a[20], b[50], c[16]

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

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

2. Как описать массив с определенным количеством элементов?

3. Как описать массив с неопределенным количеством элементов?

4. Как обозначаются элементы массива внутри функции?

5. Как выглядит вызов функции в указанных выше случаях?

6. Как описать массив с помощью указателя на начало массива?

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

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


ЛАБОРАТОРНАЯ РАБОТА № 3

ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ ПРИ ОБРАБОТКЕ ДВУМЕРНЫХ МАССИВОВ

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

3.1 Требования к выполнению работы

· Для выполнения всех расчетов использовать несколько функций, каждая из которых выполняет отдельную задачу:

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

- обработка матрицы и получение одномерного массива;

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

- печать всех промежуточных и конечных результатов.

- результатов и т.п.).

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

· Рассмотреть два варианта описания массива – как массив с неопределенным количеством элементов и с помощью указателя.

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

3.2 Теоретические положения

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

1.Массив задается с фиксированной длиной строки k.

void fun(float a[][k], int n,…);

При этом способе есть возможность варьирования количества строк.

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

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

fun(y, 20,…);

2. Массив задается в виде указателя на его начало, количество строк и столбцов задается рядом

. void fun (float *ptx, int m, int n,… )

Элементы массива в программе записываются с помощью указателя:*(ptx+i*n+ j)

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

fun(&y[0][0],4,6…);

Пример.

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

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

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

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

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*m+j)< sr)

*pt_sr=*pt_sr+*(ptx+i*m+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);

}

3.3 Варианты индивидуальных заданий.

Варианты индивидуальных заданий приведены в таблице 3.1.

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

Используя сформированную матрицу получить по заданному правилу компоненты массива Х.

Вычислить значение некоторого параметра r, используя, функция f(X).

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

Таблица 3.1.Варианты индивидуальных заданий.

№ п.п. Правило получения массива Х.   Вид функции f(X).
  Массив Х - строка с наименьшей суммой элементов, и элементы которой сдвинуты на две позиции влево циклическим сдвигом.
  Массив Х - главная диагональ матрицы А, преобразованной сначала таким образом, что в начале каждой строки нужно собрать ее положительные элементы, а в конце - отрицательные элементы.
  Массив Х - строка с наибольшей суммой элементов, порядок следования, в которой инвертирован. max { | xi+1 | - | xi | } 1<=i<=n-1
  Компоненты массива Х - средние арифметические значения элементов строк матрицы А, упорядоченные по убыванию.
  В качестве x[i] принять разность между минимальным элементом каждой строки матрицы А и суммой элементов всей матрицы.
  В качестве x[i] принять max[i] - min[i] каждой строки матрицы А.   max { | xi | } 1<=i<=n
  В матрице А найти строку с максимальной суммой элементов. Массив Х получить путем сдвига элементов этой строки на позицию в левую сторону.
  Массив Х - главная диагональ матрицы А, преобразованной таким образом, что в начале каждой строки нужно собрать ее положительные элементы, а в конце - отрицательные элементы.
  Компоненты массива Х - упорядоченные по возрастанию средние арифметические значения элементов столбцов матрицы А.   min { | xi | } 1<=i<=n
  Массив Х - побочная диагональ матрицы А, элементы которой сдвинуты на три позиции вправо.
  Компоненты массива Х - упорядоченные по убыванию суммы элементов строк матрицы А.
  Массив Х - строка матрицы А, сумма элементов которой наименьшая. В найденной строке элементы сдвинуты циклическим сдвигом на 2 позиции влево. min { xi - x_sred } 1<=i<=n
  В качестве x[i] принять разность между максимальным элементом и средним арифметическим каждой строки матрицы А.
  Массив Х - главная диагональ матрицы А, порядок следования элементов которой инвертирован.
  В качестве x[i] принять разность между минимальным элементом и последним элементом каждой строки матрицы А.
  В качестве x[i] принять разность между максимальным элементом и первым элементом каждой строки матрицы А. max { x_sred - xi+1 } 1<=i<=n
  Массив Х - строка с наименьшей суммой элементов, элементы которой сдвинуты циклическим сдвигом на 2 позиции вправо.   min { | xi+1 | - | xi | } 1<=i<=n-1
  Компоненты массива Х - средние арифметические значения элементов строк матрицы А, упорядоченные таким образом, что в начале стоят отрицательные значения, а потом положительные. max { (xi+1 | - | xi |)*x_sred } 1<=i<=n-1
  Массив Х - строка матрицы А, у которой сумма элементов с наименьшей, и порядок следования элементов в которой инвертирован. min {|xi|-|x_sred|} 1<=i<=n
  В качестве x[i] принять разность между средним арифметическим и минимальным элементом каждого столбца матрицы А.
  Массив Х - строка с наибольшей суммой элементов, и элементы которой сдвинуты на три позиции вправо циклическим сдвигом.   min { | xi+1 | - | xi | } 1<=i<=n-1
  Компоненты массива Х - средние арифметические значения элементов столбцов матрицы А, упорядоченные по возрастанию.
  В качестве x[i] принять a_sr[i] - min[i] каждой строки матрицы А.
  В качестве x[i] принять разность между минимальным элементом и суммой элементов каждой строки матрицы А.
  Компоненты массива Х - средние арифметические значения элементов строк матрицы А, упорядоченные по возрастанию.
  Массив Х - главная диагональ матрицы А, предварительно преобразованной так, что элементы каждой строки упорядочены по возрастанию. max { x_sred - xi+1 } 1<=i<=n
  В качестве x[i] принять разность между максимальным элементом каждой строки матрицы А и суммой элементов всей матрицы.   max { | xi+1 | - | xi | } 1<=i<=n-1

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

9. Какие существуют варианты описание функции, если аргументом функции является матрица?

10. Как описать матрицу с неопределенным количеством строк?

11. Можно ли описать матрицу с неопределенным количеством и строк, и столбцов?

12. Как описать матрицу с помощью указателя на начало массива?

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

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

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

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

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

18. При каком варианте описания массива существует возможность варьировать только количеством строк?

19. При каком варианте описания массива существует возможность варьировать и количеством строк, и количеством столбцов?


ЛАБОРАТОРНАЯ РАБОТА №4

РЕШЕНИЕ ЗАДАЧ ОБРАБОТКИ СТРОК И ПРОСТЕЙШИХ СТРУКТУР ДАННЫХ

Цель работы: практика изучения методов и работы со строками и простейшими структурами данных.

4.1 Требования к выполнению работы:

- для всех задач составить блок-схему алгоритма, а потом программу решения индивидуальной задачи;

- предусмотреть печать исходных строк, промежуточных и результирующих строк;

4.2 Теоретические положения

Строкой в СИ называется последовательность из одного или нескольких символов, которые заканчиваются “\0” –ноль-символом.

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

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

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

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

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

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

Рассмотрим различные способы описания строк:

- Задание строки в форме строковой константы. При этом строка заключается в двойные апострофы, а компилятор сам добавляет в конце строки симол \0.

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

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

Явное:

char имя [N]; char ks[25];

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

Неявное: при этом организуется массив такой длины, сколько символов в строке +1 (0 символ).

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

- Строка в виде указателя на символьный тип. В этом случае создается указатель на символьный тип и ему присваивается адрес размещения строки.

char *pst1= “композитор”;

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

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

“ сливы”,

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

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

В таком представлении pfood - это адрес и имя i-строки.

char *pfood[4] = { “хлеб”,

“молоко”,

“колбаса”,

“крупа” };

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

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

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

Для вывода:

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

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

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

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


Таблица 4.1 Основные функции для работы со строками

Функция Описание функции   Пример
     
strlen(s) Определяет длину строки и возвращает количество символов без нулевого символа. L =strlen(s)  
strcat (s1, s2) Производит сцепку, соединение двух строковых переменных s1 и s2, причем s2 присоединяется в конец s1.   char str1 [10 ]=” adcdef”; *str2 = “nijk”; strcat(str1, str2); Результат: str1 =”abcdefnijk”  
strncat (s1, s2, n) Соединяет n литер из строки s2 с s1.   char str1 [10 ]=” adcdef”; *str2 = “nijk”; strncat(str1, str2,2); Результат: str1 =”abcdefni”  
strcmp (s1, s2) Производит сравнение двух строк s1 и s2.Строки должны быть одинаковой длины и при сравнении происходит посимвольное вычитание кодов символов.   Результат: strcmp(“AAA”,”AAA”) = 0 strcmp(“AAB”,”AAA”)= 1 strcmp(“AAA”,”AAB”)= -1  
strncmp (s1, s2, n) Аналогична strcmp(), но для n символов #include <string.h> #include <stdio.h> int main(void) {char *buf1 = "aaabbb", *buf2 = "bbbccc;int ptr; ptr =strncmp(buf2,buf1,3); if (ptr > 0)printf("buffer 2 is greater than buffer 1\n"); else printf("buffer 2 is less than buffer 1\n"); return(0);}
strcpy (s1, s2) Выполняет копирование строки s2 в строку s1 #include <stdio.h> #include <string.h> int main(void) {char string[10]; char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n", string); return 0; }
strncpy (s1, s2, n) Копирует не более n символов строки s2 в s1.   #include <stdio.h> #include <string.h> int main(void) {char string[10]; char *str1 = "abcdefghi"; strncpy(string, str1, 3); string[3] = '\0'; printf("%s\n", string); return 0;}

Продолжения таблицы 4.1

     
Strstr (str1, str2) Функция strstr() возвращает указатель на первое вхождение подстроки, адресуемой параметром str2, в строку, адресуемую параметром str1. Если совпадение не обнаружено, возвращается нулевой указатель.   #include <stdio.h> #include < string. h> int main(void) {char *p;p = strstr("хлопот невпроворот", "от"); printf(p);return 0; } Результат: от невпроворот  
Strchr (str,ch) Функция strchr() возвращает указатель на первое вхождение младшего байта параметра ch в строку str. Если указанный символ не найден, возвращается нулевой указатель.   #include <stdio.h> #include <string.h> int main(void) {char *p; p = strchr("строка из примера", ' '); printf(p); return 0;} Результат: строка из примера
Strpbrk (str1, str2) Функция strpbrk() возвращает указатель на первый символ в строке, адресуемой параметром str1, который совпадает с любым символом в строке, адресуемой параметром str2. Если совпадений нет, возвращается нулевой указатель.   #include <stdio.h> #include <string.h> int main(void) { char *p; p = strpbrk("это тест", "есою"); printf(p); return 0;} Результат: о тест
Strspn (str1, str2) Функция strspn() возвращает длину начальной подстроки строки, адресуемой параметром str1, которая состоит только из символов, содержащихся в строке, адресуемой параметром str2. Другими словами, функция strspn() возвращает индекс первого символа в строке str1, который не совпадает ни с одним из символов в строке str2.   #include <stdio.h> #include <string.h> int main(void) { int len; len=strspn("это строка из примера", "акортэ с"); printf("%d", len); return 0; } Результат:
Strrchr (str,ch) Функция strrchr() возвращает указатель на последнее вхождение младшего байта параметра ch в строку, адресуемую параметром str. Если совпадение не обнаружено, возвращается нулевой указатель.   #include <stdio.h> #include <string.h> int main(void) {char *p; p = strrchr("по полю пыль летит", 'п'); printf(p);return 0;} Результат: пыль летит  

Продолжения таблицы 4.1

     
strtok (str1,str2) Функция strtok() возвращает указатель на следующую лексему в строке, адресуемой параметром str1. Символы, образующие строку, адресуемую параметром str2, представляют собой разделители, которые определяют лексему. При отсутствии лексемы, подлежащей возврату, возвращается нулевой указатель. Чтобы разделить некоторую строку на лексемы, при первом вызове функции strtok() параметр str1 должен указывать на начало этой строки. При последующих вызовах функции в качестве параметра str1 нужно использовать нулевой указатель. Этим способом вся строка разбивается на лексемы. При каждом обращении к функции strtok() можно использовать различные наборы разделителей. Эта программа разбивает строку "Травка зеленеет, солнышко блестит" на лексемы, разделителями которых служат пробелы и запятые. В результате получится строка: Травка|зеленеет|солнышко|блестит   #include <stdio.h> #include <string.h> int main(void) {char *p; p = strtok("Травка зеленеет, солнышко блестит", " "); printf(p); do { p = strtok('\0', ", "); if(p) printf("|%s", p); } while(p); return 0; }  

Пример.

Задана строка. Определить первое вхождение некоторого префикса в заданную строку.

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

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

//Задаемся максимальной длиной строки

#define L 300

main()

{

char s[L];

char *slovo;

char *ss;

// Определение префикса

char *prefix="abc";

clrscr();

//Ввод и печать исходной строки

printf("Vvedite nathalnui text(do %d simvolov\n",L);

gets(s);

printf("\n Nathalnui text:\n");

puts (s);

//Поиск слова по символу пробел

slovo= strtok(s," ");

//Поиск префикса в слове

ss = strstr(slovo, prefix);

printf("\nThe substring is: %s\n", slovo);

printf("\nThe is: %s\n", ss);

//Если не найден префикс, то продолжаем поиск, пока не просмотрим все слова

if (strncmp(slovo,ss,strlen(prefix))!=0)

{

for(;slovo;)

{

slovo= strtok(NULL," ");

ss = strstr(slovo, prefix);

printf("\nThe substring is: %s\n", slovo);

printf("\nThe is: %s\n", ss);

//Если префикс найден, то заканчиваем работу программы

if(ss)

{

if (strncmp(slovo,ss,strlen(prefix))==0)

{printf("VHOD NAYDENO slovo=%s",slovo);return(0);

}

}

}

//Если просмотрев строку, префикс так и не был найден, печатаем соответствующее сообщение!

printf("VHOD ne NAYDENO");

}

else

//Печать результатов для случая, когда префикс в первом слове!

{ printf("VHOD NAYDENO slovo=%s",slovo); }

return(0);

}

4.3 Варианты индивидуальных задач

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


Таблица 4.2 Варианты индивидуальных задач

Задание
   
  Определить количество гласных букв и заменить их знаком +.
  Определить количество пар одинаковых соседних символов.
  Определить количество слов, нечетные слова заменить пробелами.
  Определить количество предложений, удалить нечетные предложения.
  Определить количество знаков и заменить их знаком *.
  Разбить текст на строки не более 20 символов, перенос осуществлять на месте пробела.
  Определить количество слов, у которых первый и последний символы совпадают между собой.
  Удалить все символы, не являющиеся буквами; подсчитать их количество.
  3аменить все точки цифрами, с соответствующими им номерами.
  Определить количество слов, поменять местами четные и нечетные слова.
  Определить количество символов; сформировать текст, в котором все одинаковые символы стояли бы рядом.
  Найти предложение, содержащее максимальное количество запятых.
  Определить минимальное количество первых букв, по которым можно различить слова в тексте.
  Определить максимальное количество пробелов, идущих подряд.
  Определить количество переносов и заменить знаки переноса знаком +

Продолжение таблицы 3.2

   
  Определить, сколько слов в тексте содержит удвоенную согласную.
  Определить количество 4-буквенных слов и взять их в скобки.
  Определить длины слов и преобразовать текст, дополнив слова знаками * до одинаковой длины.
  Определить количество групп цифр и заменить их соответствующими порядковыми номерами
  Найти длину самого короткого слова и заменить его сочетанием символов *.
  Определить количество слов, после каждого слова вставить точку.
  Определить количество пар повторяющихся символов и заменить их порядковыми номерами.
  Определить количество пробелов и преобразовать текст, оставив везде по одному пробелу.
  0пределить количество предложений, сформировать текст, в котором предложения разделялись бы тремя пробелами.
  Определить, сколько раз в тексте встречается заданное слово, заменить их сочетанием символа М.
  Найти длину самого длинного слова и заменить его номером.
  Найти длину самого длинного слова и все остальные слова добавить пробелами до длины этого слова.

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

1. Какие существуют способы описания строк?

2. Каким образом происходит обращение к елементам строки?

3. Как выполняется инициализация строк?

4. Приведите варианты печати строковых данных.

5. Назовите основные функции для работы со строками.


ЛАБОРАТОРНАЯ РАБОТА № 5

РАЗРАБОТКА ПРОГРАММ, СОДЕРЖАЩИХ НЕСКОЛЬКО ЗАДАНИЙ

Цель работы:

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

1.1Требования к выполнению работы:

- Для всех заданий вначале составить блок-схему общей структуры программы.

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

- Тип функций выбрать самостоятельно и обосновать.

- Предусмотреть вывод на печать исходных массивов, промежуточных и результирующих массивов, а также искомых результирующих величин.

- Значения элементов массивов задавать с помощью генератора случайных чисел.

- Предусмотреть выход из программы.

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

1.2 Теоретические положения

Для выбора направления решения задачи можно использовать условный оператор if или оператор выбора варианта switch.

Пример: Заданы две задачи. В первой найти максимальный элемент в массиве. Во второй найти сумму элементов матрицы.

Фрагмент программы с использованием условного оператора будет выглядеть следующим образом:

void zad_1()

{

float a[10], max;

int i,n;

printf("введите размерность массива n ");

scanf("%d", &n);

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

{

a[i]=0.5+random(10);

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

}

max=-1000;

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

if (a[i]>max) max=a[i];

printf("\n max=%.1f",max);

}

float zad_2()

{ float d[6][8], s=0;

int i,j,n,m;

printf("введите размерность матрицы n,m");

scanf("%d%d", &n,&m);

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

{

printf("\n");

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

{

d[i][j]=0.5+random(10);

printf("%6.1f",d[i][j]);

}

}

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

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

if (d[i][j]>0) s=s+d[i][j];

return s;

}

void main()

{

int v=1;

float sd;

do

{

clrscr();

printf("\n введите номер задачи \n v= ");

scanf("%d",&v);

if (v==1) {

clrscr(); zad_1(); getch();

}

if (v==2) {

clrscr(); sd=zad_2(); printf("\n summa=%6.1f",sd);

getch();

}

if (v==3) {}

}

while(v<3);

}

Основная программы с использованием оператора switch будет выглядеть следующим образом:

void main()

{

int v;

float sd;

met: clrscr();

printf("\n введите номер задачи \n v= ");

scanf("%d",&v);

switch (v)

{

case 1: { clrscr(); zad_1(); getch();goto met; break; }

case 2: {

clrscr(); sd=zad_2(); printf("\n summa=%6.1f",sd);

getch(); goto met;break;

}

case 3: {}

}}

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

1.3 Варианты индивидуальных заданий.

Варианты индивидуальных задач приведенные в таблицы 1.1.

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

Таблица 1.1 Варианты индивидуальных заданий.

№ Вар-та № задачи Условия задач
    Заданы массив действительных чисел. Сдвинуть его элементы циклическим сдвигом вперед так, чтобы максимальный элемент был на последнем месте.
  Дана матрица действительных чисел размером 4х8. Определить числа b1 b2 b3 b4, равные соответственно суммам элементов строк и найти из них большее.
    Задан массив целых чисел размером. Перенести в другой массив элементы, номер которых кратен 3. Найти среди них максимум.
  Дана матрица действительных чисел размером 6х7. Определить числа b1 b2 b3 b4 b5 b6 равные соответственно произведениям элементов строк и найти из низ меньшее.
    Задан массив целых чисел. Перенести в другой массив элементы с четными номерами и найти максимум среди них.
  Дана матрица действительных чисел размером 5х4. Определить числа b1 b2 b3 b4 b5 равные соответственно наименьшим значениям элементов строк и их сумму.
    Задан массив целых чисел. Подразумевается, что в нем могут идти подряд равные между собой элементы. Перенести в другой массив элементы, которые встречаются по одному.
  Дана матрица данного числа размером 8х10. Получить новую матрицу, путем деления ее элементов на наибольший по модулю элемент.
    Задан массив действительных чисел. Перенести в другой массив элементы, значение которых меньше (max+min)/2.
  Дана матрица данного числа размером 8х10. Получить новую матрицу, путем умножения ее элементов на значение наименьшего элемента главной диагонали.
    Задан массив целых чисел. Получить новый массив, отличающийся тем, что все четные элементы умножены на минимальный элемент.
  Дана квадратная матрица целых чисел размером 6х6. умножить элементы лежащие выше главной диагонали на минимальное значение всей матрицы.
    Задан массив целых чисел. Получить новый массив, отличающийся тем, что ко всем элементам прибавлен максимальный элемент.
  Дана квадратная матрица действительных чисел размером 6х6. Заменить элементы лежащие ниже главной диагонали соответствующими элементами, лежащими выше главной диагонали, умноженными на максимальный элемент всей матрицы
    Задан массив действительных чисел. Перенести в другой массив числа, значение которых лежат между средним арифметическим первой половины массива и средним арифметическим второй половины.
  Дана матрица действительных чисел размером 4х8. Определить числа b1 b2 b3 b4, равные соответственно разностям наибольших и наименьших значений элементов строк и найти их сумму.
    Заданы массив действительных чисел. Перенести в другой массив числа, значение которых лежат между значением первого элемента массива и значением последнего.
  Дана матрица действительных чисел размером 6х5. Определить числа b1 b2 b3 b4 b5, равные соответственно суммам значений элементов столбцов найти наибольшее среди них.
    Заданы массив действительных чисел. Сдвинуть его элементы циклическим сдвигом вперед так, чтобы максимальный элемент был на первом месте.
  Дана матрица размером 9х13. Указать для каждой строки индекс максимального элемента.
    Задан массив действительных чисел. Найти средние арифметические значения среди положительных элементов и среди отрицательных.
  Дана матрица размером 9х13. Указать для индексы максимального элемента.
    Задан массив целых чисел. Найти средние арифметические значения среди четных значений элементов массива и среди нечетных.
  Дана матрица данного числа размером 8х10. Получить новую матрицу, путем деления ее элементов на наибольший по модулю элемент.
    Задан массив действительных чисел. Найти меньшее между максимальными значений элементов массива с четными индексами и нечетными.
  Дана квадратная матрица размером 8х8. Получить матрицу, в которой каждый элемент равен исходному, умноженному на минимальный среди элементов, расположенных на главной диагонали.
    Задан массив действительных чисел. Найти максимальные значения среди положительных элементов и среди отрицательных.
  Дана матрица действительных чисел размером 8х8. Получить новую матрицу, путем деления ее элементов на среднее арифметическое элементов главной диагонали.
    Задан массив целых чисел. Найти большее между суммой элементов с четными значениями и суммой элементов с нечетными значениями
  Дана квадратная матрица размером 8х8. Получить целочисленную квадратную матрицу, в которой каждый элемент равен 1, если соответствующий ему элемент исходной матрицы больше элемента, расположенного в начале строки и равен 0 в противоположном случае.
    Задан массив действительных чисел. Найти разницу между минимальным значением положительных элементов и минимальным значением модулей отрицательных элементов массива.
  Дана матрица действительных чисел размером 6х8. Получить массив, элементы которого меньше среднего арифметического всей матрицы.
    Задан массив действительных чисел. Найти большее среди сумм элементов массива с четными индексами и нечетными.
  Дана матрица действительных чисел размером 6х4. Определить числа b1 b2 b3 b4, равные соответственно максимумам элементов столбцов и найти в каком столбце этот максимум наименьший.
    Задан массив целых чисел. Найти большее между минимальным значением элементов с четными значениями и элементов с нечетными значениями
  Дана квадратная матрица размером 8х8. Получить матрицу, в которой каждый элемент равен исходному, умноженному на максимальный среди элементов, расположенных на главной диагонали.
    Задан массив целых чисел. Найти среднее между суммой элементов с четными значениями и суммой элементов с нечетными значениями
  Дана матрица действительных чисел размером 6х8. Получить массив, элементы которого лежат между средним арифметическим всей матрицы и (max+min)/2 всей матрицы.
    Задан массив действительных чисел. Найти большее среди максимальных значений элементов массива с четными индексами и нечетными.
  Дана квадратная матрица размером 8х8. Получить матрицу, в которой каждый элемент равен элементу исходной матрицы умноженному на максимум среди элементов побочной диагонали.
    Заданы массив действительных чисел. Сдвинуть его элементы циклическим сдвигом вперед так, чтобы минимальный элемент был на первом месте.
  Дана матрица действительных чисел размером 8х8. Получить новую матрицу, путем умножения ее элементов на среднее арифметическое элементов главной и побочной диагоналей.
    Задан массив действительных чисел. Перенести в другой массив числа, значение которых лежат между средним арифметическим первой половины массива и средним арифметическим всего массива.
  Дана квадратная матрица действительных чисел размером 6х6. Заменить элементы лежащие ниже побочной диагонали соответствующими элементами, лежащими выше побочной диагонали, умноженными на максимальный элемент всей матрицы
    Задан массив действительных чисел. Перенести в другой массив числа, значение которых лежат между средним арифметическим элементов массива с четными индексами и средним арифметическим элементов массива нечетными.
  Дана матрица действительных чисел размером 8х4. Определить числа b1 b2 b3 b4, равные соответственно суммам элементов столбцов и найти в каком столбце она наименьшая.
    Задан массив действительных чисел. Найти минимальные значения среди положительных элементов и среди отрицательных. Определить большее по модулю из этих двух значений
  Дана квадратная матрица размером 8х8. Получить матрицу, в которой каждый элемент равен исходному, умноженному на максимальный среди элементов, расположенных на побочной диагонали.
    Заданы массив действительных чисел. Сдвинуть его элементы циклическим сдвигом назад так, чтобы максимальный элемент был на последнем месте.
  Дана квадратная матрица размером 8х8. Получить целочисленную квадратную матрицу, в которой каждый элемент равен 1, если соответствующий ему элемент исходной матрицы больше элемента, расположенного на главной диагонали и равен 0 в противоположном случае.

ЛАБОРАТОРНАЯ РАБОТА № 6

ОБРАБОТКА СТРУКТУР С ИСПОЛЬЗОВАНИЕМ ФАЙЛОВ И МЕНЮ

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

6.1 Требования к выполнению работы:

При выполнении данного задания должны быть реализованы следующие режимы работы программы:

· Исходная информация должна быть занесена в исходный файл;

· Результирующая информация должна быть занесена в один или несколько файлов согласно индивидуальному условию;

· Должен быть предусмотрен режим редактирования уже существующих записей и внесения новых;

· Должен быть предусмотрен вывод на экран содержимого исходного файла и результирующих файлов;

· Для организации работы всей программы необходимо разработать меню, позволяющее в удобном для пользователя режиме выбирать и осуществлять все выше перечисленные действия.

6.2 Теоретические положения

Описание структуры может быть осуществлено тремя способами:

1. Описание шаблона:

При этом способе вначале в общем виде записывают так называемый шаблон, т.е. структуру полей, а затем в различных местах программы могут объявляться данные, имеющие структуру заданного шаблона.

struct <имя_структ>

{

<тип> <имя_поля1>;

<тип> <имя_поля2>;

....

<тип> <имя_поляN>;

};

Далее в программе с использованием этого шаблона могут быть описаны данные, с которыми будет работать программа.

struct <имя_структ> <имя_пер>,<имя_массиваk[k]>;

2. Описание структуры в виде нового типа данных.

Для этого используется ключевое слово typedef, которое позволяет создавать в программе новые нестандартные типы данных. Форма описания следующая:

typedef struct

{

<тип> <имя_поля1>;

<тип> <имя_поля2>;

...

<тип> <имя_поляN>;

} <имя типа>;

Объявление переменных, массивов:

<имя типа> <имя перем1>,<имя перем2>,...,

<имя массива>[k];

3.Прямое описание данных (переменных, массивов) в виде структуры.

При этом производится совмещение описания структуры с объявлением переменных и массивов.

struct

{

<тип> <имя_поля1>;

<тип> <имя_поля2>;

...

<тип> <имя_поляN>;

}< перем1>,< перем2>,…,< массив>,…;

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

Для получения доступа к элементам структур используется следующая форма записи:

<имя перем>.< имя поля>

С элементами структуры можно выполнять различные действия также, как и с простыми переменными аналогичного типа (ввод, вывод, присваивание, сравнение т.д.).

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

<имя типа структуры> * <имя переменной>,;

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

1. с помощью операции - выделение элемента структуры через адрес, задаваемый указателем:

<имя переменной> < имя поля>

2. с помощью операции * -получение значенияпо адресу, заданному указателем:

(*<имя переменной>).< имя поля>

6.3 Пример использования меню

// Функция, реализующая меню и возвращающая номер позиции курсора

void menu(int *m)

{

char text [4][20]={

"rabota f1",

"rabota f2",

"rabota f3",

"exit" };

char sim; int n,k=4, xm=10,ym=10;

window(1,1,80,25);

textbackground(BLACK);

clrscr();

n=0;

while (n<k)

{

window(xm,ym+n,xm+15,ym+n);

textbackground(1); textcolor(15);

clrscr();

printf("%s",text[n]);

n++;

}

n=0;

while(sim!=13 && sim!=27)

{

textbackground(4); textcolor(15);

window(xm,ym+n,xm+15,ym+n);

clrscr();

printf("%s",text[n]);

sim=getche();

textbackground(1); textcolor(15);

clrscr();

window(xm,ym+n,xm+15,ym+n);

printf("%s",text[n]);

kbhit();

switch(sim)

{

case 72: if(n==0) n=k; else n--; break;

case 80: if(n==k) n=0; else n++; break;

}

*m=n; }

}

//Основная программа

void main()

{

int c;

float a;





Дата публикования: 2015-04-10; Прочитано: 1023 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.132 с)...