Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник 357.docx
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
1.75 Mб
Скачать

Int main(void) /* вывод строки в верхнем регистре */

{

char s[80];

gets (s);

print_upper(s) ;

printf("%s", s);

return 0;

}

/* функция изменения символов строки на прописные */

void print_upper(char *string)

{

int t;

for(t=0; string[t]; ++t) string[t] = toupper(string[t]);

}

Пример 3. Передача многомерного массива

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

Void arrprint (int*a, int n, int m);// прототип функции

int main() {

Int *a; // указатель на массив

int i, j, n, m;

setlocale(0,"Russian");

printf("Введите количество строк: ");

scanf("%d", &n);

printf("Введите количество столбцов: ");

scanf("%d", &m);

a = (int*) malloc(n*m*sizeof(int)); // Выделение памяти

// Ввод элементов массива

for(i=0; i<n; i++) // цикл по строкам

{

for(j=0; j<m; j++) // цикл по столбцам

{

printf("a[%d][%d] = ", i, j);

scanf("%d", (a+i*m+j));

}

}

arrprint(a, n, m); //Вызов функции, печатающую элементы массива

free(a);// Высвобождение памяти

system("pause"); return 0;}

void arrprint (int*a, int n, int m) {

// Вывод элементов массива

for(int i=0; i<n; i++) // цикл по строкам

{

for(int j=0; j<m; j++) // цикл по столбцам

{

printf("%5d ", *(a+i*m+j)); // 5 знакомест под элемент массива

}

printf("\n");

}

}

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

  • выделить блок оперативной памяти под массив указателей;

  • выделить блоки оперативной памяти под одномерные массивы, представляющие собой строки искомой матрицы;

  • записать адреса строк в массив указателей.

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

 void arrprint (int**a, int n, int m) {

// Вывод элементов массива

for(int i=0; i<n; i++) // цикл по строкам

{

for(int j=0; j<m; j++) // цикл по столбцам

{

printf("%5d ", *(*(a+i)+j)); // 5 знакомест под элемент массива

}

printf("\n");

}

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

free(a[i]);   // цикл освобождение памяти занимаемой строками

}

int main() {

Int **a; // память под массив указателей на строку

  int i, j, n, m;

  printf("Введите количество строк: ");

  scanf("%d", &n);

  printf("Введите количество столбцов: ");

  scanf("%d", &m);

 // Выделение памяти под указатели на строки

  a = (int**)malloc(n*sizeof(int*));

  // Ввод элементов массива

  for(i=0; i<n; i++)  // цикл по строкам

  {

// Выделение памяти под хранение строк

    a[i] = (int*)malloc(m*sizeof(int));

    for(j=0; j<m; j++)  // цикл по столбцам

{

      *(*(a+i)+j) = -10+rand()%21;//

      }

}

arrprint(a, n, m);

free(a); // освобождение памяти массива указателей

system("pause");

  return 0;}

Пример 4. Передача структуры по значению и адресу

#include <stdio.h>

/* объявление типа структуры */

struct data_type {

int y, d;

char *m;

};

void print_data (struct data_type parm);

int main(void)

{

char month[][20]={"january","february","march", ...};

struct data_type arg = {2015, month[3],7};

print_data (arg);

return 0;

}

void print_data(struct data_type parm) {

printf("%04d/%s/%02d", parm.y, parm.m, parm.d);

}

Для передачи структуры по указателю следует описать указатель на структурную переменную в качестве аргумента:

void print_data (struct data_type *pData);

Поскольку структура адресуется указателем, доступ к полям структуры осуществляется оператором->

void print_data(struct data_type *prt) {

printf("%04d/%s/%02d", prt->y, prt->m, prt->d);

}

Соответственно в функции main() должна быть организована передача адреса инициализированной структуры в функцию:

print_data (&arg);

Пример 4. Использование указателя на функцию

// Объявление типа указателя на функцию

typedef double (*TFun)(double);

// Объявление прототипов функций

double fun1(double);

double fun2(double);

void Out_Rez (TFun,double,double,double);

void main()

{

double a, b, h;

puts("Input a,b,h");

scanf("%lf%lf%lf", &a, &b, &h);

puts("\n\t Function - 2*exp(x)");

Out_Rez (fun1,a,b,h);

puts("\n\t Function - sin(x)*sin(x)");

Out_Rez (fun2,a,b,h);

getch();

}

/*----Описание пользовательских функций -----*/

double fun1( double r)

{

return 2*exp(r*r);

}

double fun2(double r)

{

returnpow(sin(r), 2);

}

/*----Функций вывода результата-------------*/

void Out_Rez (TFun f, double xn,double xk,double h)

{

for(double x=xn; x<=xk; x+=h)

printf("|x = %5.2lf| y = %8.4lf|\n",x,f(x));

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]