Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [c] вычисление суммы площадей треугольников


Автор: diman4eg 27.12.2007, 21:32
Здравствуйте, нужна помощь, надо написать функцию вычисления суммы площадей прямоугольников.С переменным числом параметров.

желательно, сделать это до завтра.) заранее спасибо)

Автор: diman4eg 27.12.2007, 22:02
Люди хелп ми пожалуйста. Я буду не то слово как благодарен.Мне завтра последний день как это нужно сдать.Сеня был первый.Помогите.Напишите код.Вот теоретитечкий матерьал на основе которого нужно сделать лабу.Заранее огромное спасибо!!!
Функции с параметрами переменной длины
При вызове функции с переменным числом параметров в вызове этой функции задается
любое требуемое число аргументов. В объявлении и определении такой функции переменное
число аргументов задается многоточием в конце списка формальных параметров или списка
типов аргументов.
Все аргументы, заданные в вызове функции, размещаются в стеке. Количество
формальных параметров, объявленных для функции, определяется числом аргументов,
которые берутся из стека и присваиваются формальным параметрам. Программист отвечает
за правильность выбора дополнительных аргументов из стека и определение числа
аргументов, находящихся в стеке.
Примерами функций с переменным числом параметров являются функции из библиотеки
функций языка СИ, осуществляющие операции вводавывода
информации (printf,scanf и т.п.).
Подробно эти функции рассмотрены во третьей части книги.
Программист может разрабатывать свои функции с переменным числом параметров. Для
обеспечения удобного способа доступа к аргументам функции с переменным числом
параметров имеются три макроопределения (макросы) va_start, va_arg, va_end, находящиеся в
заголовочном файле stdarg.h. Эти макросы указывают на то, что функция, разработанная
пользователем, имеет некоторое число обязательных аргументов, за которыми следует
переменное число необязательных аргументов. Обязательные аргументы доступны через свои
имена как при вызове обычной функции. Для извлечения необязательных аргументов
используются макросы va_start, va_arg, va_end в следующем порядке.
Макрос va_start предназначен для установки аргумента arg_ptr на начало списка
необязательных параметров и имеет вид функции с двумя параметрами:
void va_start(arg_ptr,prav_param);
Параметр prav_param должен быть последним обязательным параметром вызываемой
функции, а указатель arg_prt должен быть объявлен с предопределением в списке переменных
типа va_list в виде:
va_list arg_ptr;
Макрос va_start должен быть использован до первого использования макроса va_arg.
Макрокоманда va_arg обеспечивает доступ к текущему параметру вызываемой функции и
тоже имеет вид функции с двумя параметрами
type_arg va_arg(arg_ptr,type);
Эта макрокоманда извлекает значение типа type по адресу, заданному указателем arg_ptr,
увеличивает значение указателя arg_ptr на длину использованного параметра (длина type) и
таким образом параметр arg_ptr будет указывать на следующий параметр вызываемой
функции. Макрокоманда va_arg используется столько раз, сколько необходимо для
извлечения всех параметров вызываемой функции.
Макрос va_end используется по окончании обработки всех параметров функции и
устанавливает указатель списка необязательных параметров на ноль (NULL).
Рассмотрим применение этих макросов для обработки параметров функции вычисляющей
среднее значение произвольной последовательности целых чисел. Поскольку функция имеет
переменное число параметров будем считать концом списка значение равное 1.
Поскольку в
списке должен быть хотя бы один элемент, у функции будет один обязательный параметр.
Пример:
#include
int main()
{ int n;
int sred_znach(int,...);
n=sred_znach(2,3,4,-1);
/* вызов с четырьмя параметрами */
printf("n=%d",n);
n=sred_znach(5,6,7,8,9,-1);
/* вызов с шестью параметрами */
printf("n=%d",n);
return (0);
}
int sred_znach(int x,...);
{
int i=0, j=0, sum=0;
va_list uk_arg;
va_start(uk_arg,x); /* установка указателя uk_arg на */
/* первый необязятельный параметр */
if (x!=-1) sum=x; /* проверка на пустоту списка */
else return (0);
j++;
while ( (i=va_arg(uk_arg,int))!=-1)
/* выборка очередного */
{ /* параметра и проверка */
sum+=i; /* на конец списка */
j++;
}
va_end(uk_arg); /* закрытие списка параметров */
return (sum/j);
}
Передача параметров функции main
Функция main, с которой начинается выполнение СИпрограммы,
может быть определена
с параметрами, которые передаются из внешнего окружения, например, из командной строки.
Во внешнем окружении действуют свои правила представления данных, а точнее, все данные
представляются в виде строк символов. Для передачи этих строк в функцию main
используются два параметра, первый параметр служит для передачи числа передаваемых
строк, второй для передачи самих строк. Общепринятые (но не обязательные) имена этих
параметров argc и argv. Параметр argc имеет тип int, его значение формируется из анализа
командной строки и равно количеству слов в командной строке, включая и имя вызываемой
программы (под словом понимается любой текст не содержащий символа пробел). Параметр
argv это массив указателей на строки, каждая из которых содержит одно слово из командной
строки. Если слово должно содержать символ пробел, то при записи его в командную строку
оно должно быть заключено в кавычки.
Функция main может иметь и третий параметр, который принято называть argp, и который
служит для передачи в функцию main параметров операционной системы (среды) в которой
выполняется СИпрограмма.
Заголовок функции main имеет вид:
int main (int argc, char *argv[], char *argp[])
Следующий пример представляет программу печати фактических аргументов,
передаваемых в функцию main из операционной системы и параметров операционной
системы.
#include <stdio.h>
int main ( int argc, char *argv[], char *argp[])
{
int i;
printf ("\nИмя программы: %s", argv[0]);
for(i=1; i<argc; i++)
printf ("\nАргумент %d равен %s",i,argv[i]);
printf ("\nПараметры операционной системы:");
i=0;
while (*argp && i<10 ){
printf ("\n %s",*argp);
argp++;
i++;
}
return (0);
}
Результат выполнения программы:
./a.out aaa ZZZZZZZZZz XXXX "String with space"
Имя программы: ./a.out
Аргумент 1 равен aaa
Аргумент 2 равен ZZZZZZZZZz
Аргумент 3 равен XXXX
Аргумент 4 равен String with space
Параметры операционной системы:
MANPATH=/usr/local/share/man:/usr/share/man:/usr/share/binutils-data/i686-
pc-linux-gnu/2.17/man:/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man
SHELL=/bin/bash
TERM=xterm
SSH_TTY=/dev/pts/0
PRELINK_PATH_MASK=/usr/lib/gstreamer-0.10
GDK_USE_XFT=1
CONFIG_PROTECT_MASK=/etc/gconf /etc/terminfo
PAGER=/usr/bin/less
Доступ к параметрам операционной системы можно также получить при помощи
библиотечной функции getenv, ее прототип имеет следующий вид:
#include <stdlib.h>
char *geteuv (const char *name);
Аргумент этой функции задает имя параметра среды, указатель на значение которой
выдаст функция getenv. Если указанный параметр не определен в среде в данный момент,
то возвращаемое значение NULL.
Используя указатель, полученный функцией getenv, можно только прочитать значение параметра
операционной системы, но нельзя его изменить. Для изменения значения параметра системы предназначена
функция putenv.

Автор: t_gran 29.12.2007, 05:02
Немного кривовато, но я думаю подойдёт:
Код

#include <stdio.h>
#include <stdarg.h>

struct stTreangle
{
   double a; // Основание
   double h; // Высота
};
//----------------------------------------------//
double area (double inA, double inH) // Площадь треугольника
{
   return (inA * inH) / 2;
}
//----------------------------------------------//
double sum (int inNum, ...) // Сумма площадей треугольника
{
   double result= 0;
   va_list argptr; 
   va_start (argptr, inNum);
   for (; inNum; inNum--)
   {
      stTreangle dat= va_arg (argptr, stTreangle);
      result+= area (dat.a, dat.h);
   }
   va_end (argptr);
   return result;
}
//----------------------------------------------//
int main ()
{
   stTreangle t1= {3, 3};
   stTreangle t2= {5, 4};
   printf ("%f\n", sum (2, t1, t2));
   return 0;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)