МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра САПР
Звіт
з лабораторної роботи №2
на тему «ФУНКЦІЇ ЗІ ЗМІННИМ ЧИСЛОМ ПАРАМЕТРІВ.
КОМАНДНА СТРІЧКА, ПАРАМЕТРИ ФУНКЦІЇ MAIN»
ЛЬВІВ 2015
Мета роботи: поглиблене вивчення можливостей функцій зі змінним числом параметрів і використання параметрів функції main.
ФУНКЦІЇ ЗІ ЗМІННИМ ЧИСЛОМ ПАРАМЕТРІВ
У С/C++ поряд з використанням функцій з фіксованим числом параметрів можна використовувати функції зі змінним числом параметрів, тобто функції, у які можна передавати дані, не описуючи їх у прототипі й заголовку функції. Описи цих даних заміняються трьома крапками. У таких функціях може перебувати й постійний параметр (ознака), за допомогою якого можуть зчитуватися дані. Якщо у функції є кілька постійних параметрів, то спочатку перераховуються ці параметри, а потім ставляться три крапки. Зверніть увагу, при передачі у функцію додаткових аргументів, компіляторові не відомо, який тип змінних буде використаний у функції для їхньої обробки. Тому контроль типів, приведення аргументів до типу параметрів не відбувається. Необхідні перетворення повинен передбачити програміст. Дані в стек поміщаються відповідно до типу, який використовується при виклику функції. В C++ повинен бути хоча б один фіксований параметр.
Можливість передачі змінного списку параметрів залежить від способу запису аргументів функції в стек програми й способу очищення стека від параметрів. У С/С++ параметри записуються в стек з кінця списку параметрів (якщо не зазначений модифікатор pascal) і звільняє стек викликаюча функція. Таким чином, якщо є виклик функції fl(xl,x2,x3);, то аргументи xl, х2, х3 занесуться в стек програми в такий спосіб:
Вершина стека - sp3 | х1 - молодші адреси
sp2 | х2
sp1 | х3 -старші адреси.
У мові Паскаль стек від параметрів звільняє викликаючий модуль. У зв'язку з цим список параметрів повинен бути відомий заздалегідь і мати фіксовану довжину. Аргументи в стек поміщаються в порядку їхнього надходження;
Вершина стека - sp3 | х3 - молодші адреси
sp2 | х2
sp1 | х1 -старші адреси.
Відзначимо, що мова С допускає і паскалівский спосіб передачі аргументів у функцію.
Рекомендуються два способи задання довжини змінного списку параметрів:
- пересилання у функцію числа аргументів;
- завдання ознаки кінця списку аргументів.
Наприклад: f2(5,xl,x2,x3,x4,x5); - тут зазначене число аргументів - 5; f3( xl,x2,x3,x4,0); - тут зазначена ознака кінця списку - 0.
Зауважимо, що копії даних типу char передаються у функцію (стек) як іnt, a float - як double. Реалізувати функції зі змінним числом параметрів можна трьома способами:
- використовуючи вказівник без типу, наприклад: voіd *pv;
- використовуючи вказівник, що відповідає типу змінних списку параметрів, наприклад:
іnt *pі; double *pd;
- використовуючи вказівник, визначений самою системою програмування. У бібліотеці С є стандартні макроси для роботи зі списком змінної довжини, які описані в розділі бібліотеки stdarg.h. Таких макросів є чотири: va_lіst, va_start, va_arg, va_end.
Приклад оголошення й виклику функції:
іnt func (іnt, ...); - прототип функції зі змінним числом параметрів, що має один постійний параметр і повертає число типу іnt.
іnt func(int k, ...){…}; - структура функції зі змінним числом параметрів, що має один постійний параметр і повертає число типу іnt.
y=func(k,a,b,c); - виклик функції зі змінним числом параметрів, що має один постійний параметр k і три змінних параметри a, b, c і повертає число типу (іnt).
КОМАНДНА СТРІЧКА. ПАРАМЕТРИ ФУНКЦІЇ MAІN
Автори мови С передбачили можливість передачі аргументів головному модулю запущеної на виконання програми - функції maіn (), за допомогою використання командного рядка. Аргументи командного рядка - це текст, записаний після імені запущеного на виконання *.com або *.ехе файлу, або переданий програмі за допомогою опції інтегрованого середовища С - arguments. За аргументи доцільно передавати імена файлів, функцій, текст, що задає режим роботи програми, а також самі дані (числа).
Borland С підтримує три параметри функції maіn(). Для їхнього позначення рекомендується використовувати загальноприйняті імена argc, argv, envp (але не забороняється використовувати будь-які інші імена). Вхід у функцію maіn при використанні командного рядка має вигляд:
іnt maіn(іnt argc, char *argv[], char *envp[])
{ Тіло функції },
або:
іnt maіn (іnt argc, char **argv, char **envp)
{ Тіло функції }
Перший параметр (argc) повідомляє функції кількість переданих у командному рядку аргументів, враховуючи як перший аргумент ім'я самої виконуваної програми (тобто кількість слів, розділених пробілами). Звідси слідує, що кількість параметрів не може бути менше одиниці, тому що перший аргумент - ім'я програми з повним шляхом до неї є присутнім завжди.
Другий параметр (char **argv, char *argv[]) є вказівником на масив з вказівників на слова (тобто самі параметри) з командного рядка. Кожний параметр зберігається у вигляді ASCІI-рядка. Під словом розуміється будь-який текст, що не містить символів пробілу або табуляціЇ. Аргументи повинні розділятися пробілами або знаками табуляції. Коми, крапки та інші символи не розглядаються як розділювачі. Останнім елементом масиву вказівників є нульовий вказівник (NULL).
Наприклад, нехай програма L13_15.exe запускається в такий спосіб:
c:\BorlandC\bіn\L13_5.exe ddd 123 bcde а+b
і заголовок функції maіn має вигляд:
voіd maіn(іnt argc, char *argv[])
{ . . . }
Індивідуальне завдання
21. У головній функції main () ввести число n, що задає кількість рядків, які вводяться, а також, скільки рядків буде оброблено у функції. У функцію зі змінним числом параметрів надходять рядки, кінець списку - вказівник NULL. Рядки необхідно вивести на екран. Програма завершує роботу при введенні числа 11.
Текст програми у відповідності з індивідуальним завданням.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void transform(int i, int typ);
int main(void){
transform(2,0);
}
void transform(int i, int typ){
int n=0;
char mas[n];
float mas1[n];
for(int k=0;k<i;k++){
if(k!=0)
scanf("%d",&i);
switch (typ){
case 0:
printf("Kil'kist elementiv:\n");
scanf("%d",&n);
printf("Vvedit' elementi':\n");
fflush(stdin);
for(int s=0;s<n;s++)
scanf("%c",&mas[s]);
fflush(stdin);
for(int s=0;s<n;s++)
printf("%d",(int)mas[s]);
fflush(stdin);
break;
case 1:
printf("Kil'kist elementiv:\n");
scanf("%d",&n);
printf("Vvedit' elementi':\n");
fflush(stdin);
for(int s=0;s<n;s++)
scanf("%f",&mas1[s]);
fflush(stdin);
for(int s=0;s<n;s++)
printf("%d",(double)mas1[s]);
break;
};
};
}
Результати обчислень
/
/
Аналіз результатів, висновки
Дана програма виконує дії, які поставленні в завданні: Перед кожною групою задається кількість елементів у групі, потім їхній тип потім слідують самі дані:
Введені кількість елементів «1» після чого введений елемент «а» після чого виводяться дані «97».
Введені кількість елементів «5» після чого введений елемент «asdqw» після чого виводяться дані «97115100113119».
На даній лабораторній роботі я поглиблено вивчив можливості функцій зі змінним числом параметрів і використання параметрів функції main.