Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по основам алгоритмизации и программи....doc
Скачиваний:
41
Добавлен:
02.11.2018
Размер:
2.69 Mб
Скачать

Примеры программ

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

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

void fun1(int,...); // прототип ф-ции имеющей 1 постоянный параметр

void fun2(int,...); // прототип ф-ции имеющей 1 постоянный параметр

void fun3(...); // прототип ф-ции не имеющей постоянных параметров

void main(void)

{ int a1,a2,a3;

float f1,f2;

clrscr();

puts("введите 3 значения типа int и 2 типа float");

scanf("%d%d%d",&a1,&a2,&a3);

scanf("%f%f",&f1,&f2);

fflush(stdin);

fun1(3,a1,a2,a3);

fun2(2,f1,f2);

fun1(2,'1','2');

fun3(a1,a3,a1,0);

getch(); // задержка

}

void fun1(int k,...)

{ int s=0;

void *p;

p=&k; // p указатель на элемент стека k

((int *)p)++; // указатель на следующий элемент стека

while(k--) s+=*((int *)p)++; // считывание k чисел int из стека

printf("\n 1 сумма элементов = %d",s);

}

void fun2(int k,...)

{ float s=0;

void *p;

p=(...); // указатель на первый элемент перем. списка парам.

while(k--) s+=*((double *)p)++; // считывание k чисел float из стека

printf("\n 2 сумма элементов = %5.2f",s);

}

void fun3(...)

{ int s=0,k;

void *p;

p=(...); // указатель на первый элемент перем. списка парам.

while(k=*((int *)p)++) s+=k;

printf("\n 3 сумма элементов = %d",s);

}

Пример . Реализация функции с произвольным числом параметров одного типа. Доступ к данным (параметрам) реализован с помощью безтиповых указателей (void *p). При чтении данных из стека данные приводятся к требуемому типу.

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

int * fun(...); // прототип ф-ции не имеющей постоянных параметров

void main(void)

{ int *ms; // для возврата из fun адресов полученных сумм

clrscr();

ms=fun(1,7,2,7,8,6,8,4,0);

for(;*ms;) // вывод пока *ms!=0

printf("%6d",*ms++);

getch(); // задержка

}

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

// найденные элементы возвратить в main

int * fun(...)

{ int i,j,k,n=0,*ii,**jj;

void *p;

printf("\n сколько MAX переменных надо выделить из списка = ");

scanf("%d",&k); // ввести ограничение на k (не более чем параметров)

ii=(int *)calloc(k+1,sizeof(int)); // k max значений из списка (k+1 эл-т

// всегда ==0 - признак конца для main)

jj=(int **)calloc(k,sizeof(int *)); // адреса k max значений в стеке

while(n<=k-1) // пока не найдено k max элементов

{ p=(...); // элипсис, p устанавливается на начало списка

// параметров переменной длинны

do

{ i=0;

while(i<n && jj[i]) // поиск первого еще не занесенного

if (jj[i++]==(int *)p) // адрес уже есть

{ ((int *)p)++; // выбор следующего элемента из стека

break;

}

} while(jj[i]);

ii[n]=*(int *)p; // предварительное max значение для сравнения

jj[n]=((int *)p)++; // его адрес в стеке

while(j=*((int *)p)) // пока считанный j!= 0 (признак конца списка)

{ for(i=0;i<n && jj[i]!=(int *)p && jj[i++];); // поиск адреса эл-та в jj

if (j>ii[n] && jj[i]!=(int *)p) // эл-т max и его адрес не найден

{ ii[n]=*((int *)p); // новое max значение для сравнения

jj[n]=((int *)p); // его адрес в стеке

}

((int *)p)++; // указатель на следующий элемент стека

}

n++;

}

free(jj);

return ii;

}