С++: Л/р№2 Функции - часть I
реклама
Функции - часть I (2 часа)
Цель работы: изучение создания и использования функций.
Порядок выполнения работы
1.Провести анализ примеров. Программы из примеров копируются в файлы С++ и выполняются.
2.Выполнить задания.
3.Защитить выполненную работу.
Контрольные вопросы
1.Как работают программы примеров?
2.Перечислить преимущества применения указателей для передачи аргументов.
Примеры
Пример 1. Демонстрация способов применения функций.
Пример вызова функции sum(int, int) с передачей значений (Call-by-Value).
#include <stdio.h>
sum(int, int); /* прототип функции, возвращающей целое число и
использующей два аргумента типа int */
void main(void) /* начало определения функции, не возвращающей
значений и не получающей аргументов */
{
int a = 5, b = 4, c;
c = sum(a, b); /* вызов функции sum(). Возвращаемое значение
присваивается переменной с */
printf("Сумма чисел равна %d\n", c);
}
sum(int k, int l) /* начало определения функции sum(). Если тип
возвращаемого значения не задан, принимается
по умолчанию int */
{
int m;
m = k + l;
return m;
}
Пример вызова функции с передачей адресов (Call-by-Reference).
#include <stdio.h>
sum(int*, int*); /* прототип функции, возвращающей целое число и
использующей два аргумента типа "указатель на
целое" (int *) */
void main(void) /* начало определения функции, не возвращающей
значений и не получающей аргументов */
{
int a = 5, b = 4, c;
c = sum(&a, &b); /* вызов функции sum(). Возвращаемое значение
присваивается переменной с */
printf("Сумма чисел равна %d\n", c);
}
sum(int * k, int * l) /* начало определения функции, возвращающей
значение типа int и имеющей 2 аргумента
типа "указатель на целое" (int *) */
{
int m;
m = * k + * l;
return m;
}
Задания
Задание 1.
Программу задания из лабораторной работы 1 реализовать с использованием функций.
Задание 2.
Проанализировать работу приведенной ниже функции, осуществить её вызов. Для этого в программе задать две строковые переменные одинаковой длины. Указатели на переменные передать функции. В результате значение одной переменной должно быть скопировано во вторую.
Пример вызова функции с передачей адресов. Переносит ASCIIZ-строку, на начало которой указывает source, в буфер, на начало которого указывает destination. Возвращает указатель на начало буфера destination.
char * my_strcpy(char * destination, char * source)
{
char * ret_ptr = destination;
while(*source) /* пока не достигнут символ '\0' */
* destination++ = * source++;
* destination = '\0'; /* в цикле не был перенесен символ '\0' */
return ret_ptr;
}
Выполнение задания
1)
#include<stdio.h>
#include<conio.h>
#define size 4
float max(float a[size][size],int*,int*,int*);
float min(float a[size][size],int*);
void main()
{
int i,imx,jmx,j;
float a[size] [size]={{9,8,7,6},
{8,4,6,5},
{1,0,5,-3},
{0,2,4,-2}},mi_ma,ma_mi;
clrscr();
/*
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
printf("Введите А[%i][%i]=",i,j);
scanf("%f",&a[i][j]);
}
}
*/
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
printf(" %g ",a[i][j]);
}
puts("");
}
for(i=0;i<size;i++)
{
mi_ma=max(a,&imx,&jmx,&i);
ma_mi=min(a,&jmx);
if(ma_mi==mi_ma)
{
printf("a=%gi=%i j=%i\n",mi_ma,imx+1,jmx+1);
}
else;
}
getch();
}
///////////////////////max_fun///////////////////////////
float max(float a[size][size],int* imx,int* jmx,int* i)
{
float mi_ma;
int j;
mi_ma=a[*i][0];
for(j=0;j<size;j++)
{
if(a[*i][j]<mi_ma)
{
mi_ma=a[*i][j];
*imx=*i;
*jmx=j;
}
else;
}
return(mi_ma);
}
//////////////////////////////min_fun///////////////////////
float min(float a[size][size],int* jmx)
{
float ma_mi;
int j,i=0;
ma_mi=a[i][*jmx];
for(j=*jmx;i<size;i++)
{
if(a[i][j]>ma_mi)
{
ma_mi=a[i][j];
}
else;
}
return(ma_mi);
}
2)
#include<stdio.h>
#include<conio.h>
char* my_strcpy(char*, char*);
void main()
{
char *a, *b, *c;
clrscr();
printf("A--->>>");
scanf("%s",a);
printf("B--->>>");
scanf("%s",b);
c=my_strcpy(a,b);
printf("%s\n%s\n%s\n",a,b,c);
getch();
}
char * my_strcpy(char * destination, char * source)
{
char * ret_ptr = destination;
while(*source) /* пока не достигнут символ '\0'
*/
* destination++ = * source++;
* destination = '\0'; /* в цикле не был перенесён символ '\0'
*/
return ret_ptr;
По материалам ОмГУПС, все права защищены...
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают