Вторник, 21.05.2024, 09:49
Приветствую Вас, Гость

БИЛЕТ 14.

1) Функции в С++. Функции с параметрами по умолчанию, с неопределенным числом параметров

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

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

Объявление и определение функции - это та область, где стандартом ANSI в язык внесены самые существенные изменения. В описании функции теперь разрешено задавать типы аргументов. Синтаксис определения функции также изменен, так что теперь объявления и определения функций соответствуют друг другу. Это позволяет компилятору обнаруживать намного больше ошибок, чем раньше. Кроме того. если типы аргументов соответствующим образом объявлены, то необходимые преобразования аргументов выполняются автоматически.

Стандарт вносит ясность в правила, определяющие области видимости имен; в частности, он требует, чтобы для каждого внешнего объекта было только одно определение. В нем обобщены средства инициализации: теперь можно инициализировать автоматические массивы и структуры. Улучшен также препроцессор Си. Он включает более широкий набор директив условной компиляции, предоставляет возможность из макроаргументов генерировать строки в кавычках, а кроме того. содержит более совершенный механизм управления процессом макрорасширения.

 Основные сведения о функциях

Определение любой функции имеет следующий вид:

тип-результата имя-функции (объявления аргументов)

{

    объявления и операторы

}

Отдельные части определения могут отсутствовать, как, например, в определении "минимальной" функции

dummy() { }

которая ничего не вычисляет и ничего не возвращает. Такая ничего не делающая функция в процессе разработки программы бывает полезна в качестве "хранителя места". Если тип результата опущен, то предполагается, что функция возвращает значение типа int.

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

Оператор return реализует механизм возврата результата от вызываемой функции к вызывающей. За словом return может следовать любое выражение:

return выражение;

Если потребуется, выражение будет приведено к возвращаемому типу функции. Часто выражение заключают в скобки, но они не обязательны.

Вызывающая функция вправе проигнорировать возвращаемое значение. Более того, выражение в return может отсутствовать, и тогда вообще никакое значение не будет возвращено в вызывающую функцию. Управление возвращается в вызывающую функцию без результирующего значения также и в том случае, когда вычисления достигли "конца" (т. е. последней закрывающей фигурной скобки функции). Не запрещена (но должна вызывать настороженность) ситуация, когда в одной и той же функции одни return имеют при себе выражения, а другие - не имеют. Во всех случаях, когда функция "забыла" передать результат в return, она обязательно выдаст "мусор".

Функция main в программе поиска по образцу возвращает в качестве результата количество найденных строк. Это число доступно той среде, из которой данная программа была вызвана.

Механизмы компиляции и загрузки Си-программ, расположенных в нескольких исходных файлах, в разных системах могут различаться. Предположим, что три функции расположены в трех разных файлах: main.с, getline.c и strindex.c. Тогда команда

cc main.с getline.c strindex.c скомпилирует указанные файлы, поместив результат компиляции в файлы объектных модулей main.o, getline.o и strindex.o, и затем загрузит их в исполняемый файл a.out. Если обнаружилась ошибка, например в файле main.с, то его можно скомпилировать снова и результат загрузить ранее полученными объектными файлами, выполнив следующую команду:

cc main.с getline.o strindex.o

Команда cc использует стандартные расширения файлов ".с" и ".о", чтобы отличать исходные файлы от объектных.

 

2) Динамические объекты, операции new и delete

Операции выделения и освобождения памяти при программировании на С и С++ используются довольно часто, поэтому в С++ для этих целей существуют специальные операторы new и delete которые работают аналогично функциям malloc и free. Оператор new выделяет блок памяти необходимый для размещения переменной или массива и возвращает указатель на этот блок. В операторе new необходимо указывать тип переменной, а для массива еще и число элементов. Например

int *t, *s;

t=new int;

s=new int [10];

Указатель t будет указывать на переменную типа int, а указатель s на массив из 10 элементов типа int.

Вновь созданной переменной можно присвоить начальное значение или список значений, этот список указывается в скобках после типа.

int *p, *r;

p=new int (28);

r=new int [3] (12,45,9);

В случае если имеющейся памяти недостаточно оператор new возвращает указатель на нулевое значение (void *)0.

Оператор delete освобождает ранее занятую память. Например

delete p; delete r;


*************************************14 - 3

Предложите два варианта функции, удаляющей из строки ведущие и концевые пробелы

 

#include<stdio.h>

#include<conio.h>

char text[]="If you will beate this printer, it will not works!";

int i,kol=1,k=1;

int n=sizeof(text)/sizeof(char);

void main()

{

clrscr();

 printf("%s\n",text);

do {

    for (i=0;i <= n;i++)

             if (text[i] == ' ')

                 for (; i <= n; i++)

                          text[i]=text[i+1];

    n -= 1;

    for (i=n;i >= 0;i--)

             if (text[i] == ' ')

                {

                 for (; i <= n; i++)

                          text[i]=text[i+1];

            break;

                }

    n -= 1;

    k++;

   } while(k <= kol);

 printf("%s",text);

getch();

}


*************************************14 - 4

Напишите  функцию увеличения восьмеричного числа на единицу. 

 

#include <stdio.h>

#include <conio.h>

#include <math.h>

void main () {

        clrscr();

            int a[] = {3,2,6,3,7,7,7};

        int dsf[10];

            int flag=1;

            for (int i=0;i<sizeof(a)/sizeof(int);i++) if (a[i]<0 || a[i]>7) flag=0;

            if (flag) {

                        unsigned len = sizeof(a)/sizeof(int);

                        int newm[sizeof(a)/sizeof(int)+1]; newm[0]=0; printf("0 ");

                        for (int j=0;j<len;j++) {

                                   printf("%i ",a[j]);

                                   newm[j+1]=a[j];

                        };

                        printf("\n\n");

                        i=len;

                        for (;i>-1 && newm[i]==7;i--) {

                                   newm[i]=0;

                        };

 

                        newm[i]+=1;

                        for (j=0;j<len+1;j++) printf("%i ",newm[j]);

                        getch();

            };

}