![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
diman4eg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 27.12.2007 Репутация: нет Всего: нет |
Здравствуйте, нужна помощь, надо написать функцию вычисления суммы площадей прямоугольников.С переменным числом параметров.
желательно, сделать это до завтра.) заранее спасибо) |
|||
|
||||
diman4eg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
t_gran |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 13.11.2007 Где: г.Усть-Илимск Репутация: 33 Всего: 37 |
Немного кривовато, но я думаю подойдёт:
Это сообщение отредактировал(а) t_gran - 29.12.2007, 05:04 -------------------- Я знаю, что ничего не знаю© Сократ ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |