Здавалка
Главная | Обратная связь

Пример 2. Перепишем программу, используя предопределенное значение (пусть это будет 0).



#include <iostream>using namespace std;// k - это теперь, всего лишь один// из суммируемых параметровlong summa (int k,...){ //начиная с k int *pk=&k; long sm=0; //движемся до тех пор, //пока не встретим значение 0 while (*pk) //подсчет суммы sm+=*(pk++); return sm;}void main() { // тестируем cout << "\n summa(4,6,0)="<< summa (4,6,0); cout << "\n summa(1,2,3,4,5,6,0)="<< summa (1,2,3,4,5,6,0); cout << "\n summa(1,2,0,4,5,6,0)="<< summa (1,2,0,4,5,6,0); } Результат работы программы: summa(4,6,0)=10summa(1,2,3,4,5,6,0)=21 // Внимание здесь функция // доработает лишь до первого нуля// остальные данные будут утеряны.summa(1,2,0,4,5,6,0)=3

Примечание:Кстати, с подобными функциями вы уже знакомы - это printf и scanf.

Есть ещё один способ проанализировать аргументы внутри функции. Именно этот способ позволит анализировать аргументы не только произвольного количества, но и сразными типами. Для начала подключаем библиотеку stdarg.h, именно в ней находятся, необходимые автоматические средства анализа. Разберём последующие действия по шагам:

1. Объявляем переменную типа va_list (переопределённый char*). Именно здесь мы будем хранить указатель на список параметров нашей функции.

2. Единоразово вызываем функцию:

void va_start( va_list arg_ptr, prev_param );

Первый параметр - созданная заранее переменная типа va_list, в неё запишется указатель на список параметров, созданный данной функцией.

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

3. Анализируем параметры с помощью многократного вызова функции:

type va_arg( va_list arg_ptr, type );

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

4. Заканчиваем анализ параметров и очищаем внутренний указатель, устанавливая его в нуль с помощью функции:

void va_end( va_list arg_ptr );

Рассмотрим пример:

#include <iostream>using namespace std;#include <stdarg.h>// функция подсчитывает сумму чисел количеством count// typeof определяет, какого типа будут элементы// true - параметры целого типа (int)// false - параметры целого типа (double)void AnyType(int count,bool typeof,...){ // сумма для целочисленных параметров int sumi=0; // сумма для вещественных параметров double sumd=0.0; // создаём указатель на список параметров va_list arg_ptr; // получаем этот указатель, отталкиваясь // от первого фактического параметра va_start(arg_ptr,count); // пропускаем второй фактический параметр va_arg(arg_ptr,bool); // count раз считываем последующие параметры while(count--){ // если typeof - true, то считываем параметры типа int // если typeof - false, то считываем параметры типа double (typeof)?sumi+=va_arg(arg_ptr,int):sumd+=va_arg(arg_ptr,double); } // закрываем список параметров va_end(arg_ptr); // если typeof - true, то показываем сумму типа int // если typeof - false, то показываем сумму типа double (typeof)?cout<<"Integer sum = "<<sumi:cout<<"Double sum = "<<sumd; cout<<"\n\n";}void main(){ // вызываем функцию для суммирования параметров типа int AnyType(4,true,3,8,9,4); // вызываем функцию для суммирования параметров типа double AnyType(3,false,2.5,1.1,3.6);}

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

Предыдущая Оглавление Следующая
Предыдущая Оглавление Следующая

Домашнее задание

1. Написать класс, реализующий работу с комлексными числами.

2. Написать программу, которая на основе классов реализует карточную игру Блэк-Джек.

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

Предыдущая Оглавление Следующая

 


 

Предыдущая Оглавление Следующая

Урок №26.

  • Понятие динамической структуры данных
  • Стек
  • Реализация - стек.
  • Очередь
  • Реализация - очередь.
  • Кольцевая очередь
  • Реализация - кольцевая очередь.
  • Очередь с приоритетами.
  • Реализация - очередь с приоритетами.
  • Домашнее задание.
Предыдущая Оглавление Следующая
Предыдущая Оглавление Следующая






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.