Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c] вычисление суммы площадей треугольников, функция 
:(
    Опции темы
diman4eg
Дата 27.12.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.12.2007

Репутация: нет
Всего: нет



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

желательно, сделать это до завтра.) заранее спасибо)
PM MAIL   Вверх
diman4eg
Дата 27.12.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.12.2007

Репутация: нет
Всего: нет



Люди хелп ми пожалуйста. Я буду не то слово как благодарен.Мне завтра последний день как это нужно сдать.Сеня был первый.Помогите.Напишите код.Вот теоретитечкий матерьал на основе которого нужно сделать лабу.Заранее огромное спасибо!!!
Функции с параметрами переменной длины
При вызове функции с переменным числом параметров в вызове этой функции задается
любое требуемое число аргументов. В объявлении и определении такой функции переменное
число аргументов задается многоточием в конце списка формальных параметров или списка
типов аргументов.
Все аргументы, заданные в вызове функции, размещаются в стеке. Количество
формальных параметров, объявленных для функции, определяется числом аргументов,
которые берутся из стека и присваиваются формальным параметрам. Программист отвечает
за правильность выбора дополнительных аргументов из стека и определение числа
аргументов, находящихся в стеке.
Примерами функций с переменным числом параметров являются функции из библиотеки
функций языка СИ, осуществляющие операции вводавывода
информации (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.
PM MAIL   Вверх
t_gran
Дата 29.12.2007, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



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

#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;
}



Это сообщение отредактировал(а) t_gran - 29.12.2007, 05:04


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.