WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 6 | 7 || 9 | 10 |   ...   | 11 |

int size_char(char *s); // прототип int _tmain(int argc, _TCHAR* argv[]) { char s[]="November";

int l_s =size_char(s);

cout<<"\nLength "<

} int size_char(char *s) { // вычисление длины строки s int l_s=0; // l_s - длина строки s while (s[l_s++] !='\0');

return l_s;

} Замечание. В разделе Массивы были рассмотрены также безразмерные числовые массивы. Написать функцию вычисления границы таких массивов, как только что было сделано для символьных массивов, не получится – в функцию передается указатель только на начало области памяти, занятой массивом и нет информации о том, где эта область заканчивается. У безразмерных символьных массивов такая информация есть – символ '\0'.

Аргументы по умолчанию В языке C этого средства не было, оно появилось в C++. При объявлении функции можно задать значения по умолчанию для одного или нескольких параметров в списке. При вызове функции можно пропустить аргумент по умолчанию – в функцию будет передано значение, назначенное по умолчанию. В списке параметров аргументы по умолчанию размещаются последними.

Пример. Функция f() содержит два параметра, причем оба параметра имеют значения по умолчанию.

#include using namespace std;

void f(int a = 0, int b = 0) { cout<<"a= "<< a <<", b= "<

} int main() { f();// переданы значения по умолчанию f(10);//второму параметру – значение по умолчанию f(9, 99);

return 0;

} Аргументы по умолчанию необходимо указывать при объявлении функции.

Пример. Функция f() содержит два параметра, имеющие значения по умолчанию. Значения по умолчанию заданы в прототипе функции.

#include using namespace std;

void f(int = 0, int = 0);

{ cout<<"a= "<< a <<", b= "<

} int main() { f(); f(10); f(9, 99);

return 0;

} void f(int a, int b) { cout<<"a= "<< a <<", b= "<

} Рекурсия Языки C и C++ поддерживают рекурсию. Рекурсивная функция – это функция, которая содержит вызов этой же функции. Вызов функции может осуществляться и через другую функцию.

Пример. Вычисление факториала n!=1*2*…*n. Соотношение n! = (n -1)! * n позволяет реализовать рекурсивную функцию вычисления n!.

#include using namespace std;

int fn(int n);

int main() { int n,m;

cout<<"\n n=";cin>>n;

m=fn(n);

cout<<"\n "<

return 0;

} int fn(int n) { // Вычисление факториала if (n==1) return 1;

else return fn(n-1) * n;

} Пример. Снова числа Фибоначчи.

#include using namespace std;

int fn(int n);

int main() { // Вычисление чисел Фибоначчи setlocale(LC_CTYPE, "rus");//русификация консоли int n,m;

cout<<"\n Введите целое (<47) "; cin>>n;

m=fibonacci(n);

cout<<"\n "<

return 0;

} int fibonacci(int n) { if ((n==0) || (n==1)) return n;

else return fibonacci(n-1)+fibonacci(n-2);

} Перегрузка функций Перегрузка функций (полиморфизм функций) реализована в C++, в языке C такой возможности не было. Полиморфизм функций позволяет использовать под одним именем несколько функций.

Пример. Перегрузка функций. Две функции с одинаковым именем f1.

Обратите внимание на аргументы функций – число их различно.

#include using namespace std;

void f1(int a);

void f1(int a, int b);

int main() { f1(10);

f1(10, 20);

return 0;

} void f1(int a) { cout << "‚ f1(int a) \n";

} void f1(int a, int b) { cout << "‚ f1(int a, int b) \n";

} Пример. Перегрузка функций – в программе две функции date(), позволяющие передавать дату различными способами.

#include using namespace std;

void date(char *date); // дата в виде строки void date(int day, int month, int year);//и в виде чисел int main() { setlocale(LC_CTYPE, "rus"); // русификация консоли char *xday="21 декабря 2012";

date(xday);

date("21/12/2012");

date(21,12,2012);

return 0;

} // Дата в виде строки void date(char *date) { cout << "Дата:" << date << "\n";

} // Дата в виде целых чисел void date(int day, int month, int year) { cout << "Дата:" << day << "/";

cout << month << "/" << year << "\n";

} Пример. Перегрузка функции minimum() – в программе сразу несколько функций с этим именем.

#include #include using namespace std;

char minimum(char a, char b);

string minimum(string a, string b);

int minimum(int a, int b);

double minimum(double a, double b);

int main() { setlocale(LC_CTYPE, "rus"); // русификация консоли cout <<"Минимум равен: " << minimum('x', 'w');

cout <<"\nМинимум равен: " << minimum(10, 20);

cout<<"\nМинимум равен: "<

cout<<"\nМинимум равен: "<

return 0;

} // Минимум для char char minimum(char a, char b) { // предварительно символы переводятся в нижний регистр // функцией tolower() return tolower(a) < tolower(b) a : b;

} // Минимум для string string minimum(string a, string b) { return a < b a : b;

} // Минимум для int int minimum(int a, int b) { return a < b a : b;

} // Минимум для double double minimum(double a, double b) { return a < b a : b;

} Главную роль в перегрузке функций играет список аргументов, который называют также сигнатурой функции. Если две функции имеют одно и то же количество аргументов, эти аргументы имеют одинаковые типы и порядок следования, то функции, по определению, имеют одинаковую сигнатуру. В языке C++ можно определить две различные функции с одинаковым именем при условии, если эти функции обладают различными сигнатурами.



Ввод и вывод Консольный вывод В языке C консольный вывод выполняется функцией printf(управляющая строка, список аргументов,....) Управляющая строка содержит информацию, выводимую на экран.

Места подстановки значений переменных из списка аргументов обозначены спецификаторами данных. Признаком спецификатора является символ "%". Количество спецификаторов должно совпадать с количеством аргументов, более того, спецификаторы и аргументы должны попарно соответствовать друг другу.

Как и любая функция языка C, функция printf() возвращает значение.

Это значение равно числу выведенных символов, если при выводе произошла ошибка – функция возвращает отрицательное число.

Пример.

setlocale(LC_CTYPE, "rus");//русификация консоли int m=10; double pi=3.1415; char ch='Ё';

printf("\n m=%d pi=%f ch=%c \n",m,pi,ch);

Для каждого встроенного типа данных имеется отдельный спецификатор: %c – для типа char, %d – для целых чисел, %e, %E, %f, %g – для чисел с плавающей точкой (два первых формата отображают числа в научной нотации, а последний, в зависимости какой формат окажется короче), %o – для вывода чисел без знака в восьмеричной системе счисления, %x, %X – для вывода чисел без знака в шестнадцатеричной системе счисления, %p – для вывода значений указателей (т.е. адресов памяти), %s – для строк.

Пример.

int m=2012; double pi=3.141592;

printf("\n m=%d m=%o m=%x m=%X",m,m,m,m);

printf("\n pi=%f pi=%e pi=%E pi=%g \n",pi,pi,pi,pi);

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

Модификатор минимальной ширины поля указывается между знаком % и символом формата, если выводимое число оказывется больше, чем отведенное для него место, то число все равно будет выведено полностю, если же поле окажется шире, то лишние позиции будут дополнены пробелами или нулями, если перед модификатором ширины указан символ 0.

Пример.

double pi=3.141592;

printf("\n pi=%f pi=%2f pi=%12f pi=%012f",pi,pi,pi,pi);

Модификатор точности определяет количество значащих цифр. Этот модификатор размещается после модификатора минимальной ширины поля и отделяется точкой.

Пример.

double pi=3.141592;

printf("\n pi=%f pi=%.3f pi=%12.8f pi=%012.8f", pi,pi,pi,pi);

В строке форматирования управлять отображением можно с помощью специальных символов – Esc-кодов: \n – переход на новую строку, \t – горизонтальная табуляция и др. (см., напр., Дейтел Х. М., Дейтел П. Дж..

Как программировать на С.).

Консольный вывод в C++ В языке C++ вывод информации на консоль можно выполнить с помощью объекта cout класса ostream. Объект cout используется вместе с оператором вставки <<, который умеет работать со всеми базовыми типами языка C++ (подробнее см., напр., Прата С. Язык программирования C++). В большинстве уже рассмотренных примеров был использован именно этот способ вывода данных.

Пример.

// Вывод данных основных типов setlocale(LC_CTYPE, "rus"); // русификация консоли int n=2012;

cout<<"\n n="<

cout<<"\n Адрес n="<<&n;

int coord[3]={1,2,3};

cout<<"\n coord="<

for(int i=0;i<3;i++) cout<<" coord["<

double pi=3.1415;

cout<<"\n pi="<

scientific(cout); // устанавливаем экспоненц.форму cout<<" pi="<

char * Name="Alphabet";

cout<<"\n Name="<

cout<<"\n Адрес строки Name="<<(void *)Name;

string name="Alphabet";

cout<<"\n name="<

cout<<"\n Адрес строки name="<<&name;

bool u;

u=(pi>3) && (pi<4);

cout<<"\n u ="<

boolalpha(cout); /* вывод значений в форме true и false */ cout<<"\n u ="<

С помощью манипуляторов, определенных в стандартной библиотеке языка C++, можно управлять отображением данных. Полный список манипуляторов можно найти в книге Стауструп Б. Язык программирования C++.

Пример. Вывод целого числа в различных системах счисления.

Установка системы счисления выполняется манипуляторами dec (десятичное представление), hex (шестнадцатеричное представление) и oct (восьмеричное представление). Можно использовать две формы вызова манипулятора, например, установку шестнадцатеричной системы представления чисел можно выполнить в виде hex(cout);

и вставкой в cout:

cout<<"\n n= "<

Установка, выполненная манипулятором, сохраняется до следующего явного вызова аналогичного манипулятора.

// Целые числа в различных системах счисления int n=2012;

cout<<"\n n= "<

Пример. Вводятся целое число и число с плавающей точкой.

int n; double x;

printf("\n n= ");

scanf("%d",&n);

printf("\n x= ");

scanf("%lf",&x);

printf("\n n=%d x=%f x= %e \n", n, x,x);

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

В управляющей строке функции scanf() используются те же спецификаторы данных, что и в функции printf(), отметим, что для ввода значений типа double применяется спецификатор %lf.

Переменные, которым функция scanf() присваивает введеннные значения, передаются в функцию по ссылке, т.е. в списке аргументов указываются адреса этих переменных: &n, &x и т.д.

Консольный ввод в C++ В языке C++ консольный ввод можно выполнить с помощью объекта cin класса istream. Этот объект используется вместе с оператором извлечения >>, переопределенным для основных встроенных типов языка (подробнее см., напр., Прата С. Язык программирования C++).

Пример. Вводятся целое число и число с плавающей точкой.

int n;

cout<<"\n n= ";

cin>>n;

double x;

cout<<"\n x= ";

cin>>x;

cout<<"\n n="<

for(i=0;i<100;i++) { x=i*2;

fprintf(f," %d ",x);

} fclose(f);

} Оператор FILE *f;

Объявляет, что переменная f является указателем на структуру FILE. С каждым файлом необходимо связать отдельную структуру FILE.

Открытие файла производится оператором f=fopen("c:\\tmp\\result.txt","w");

Функция fopen() возвращает указатель на структуру FILE открываемого файла, если же файл невозможно открыть, функция возвращает NULL. В первом параметре функции указывается имя файла (обращаем внимание на двойные слеши в полном имени файла), а второй параметр указывает режим открытия файла (в данном случае, выбран режим w – файл для записи).

Оператор fprintf(f," %d ",x);

записывает данные в файл, на который указывает первый параметр этой функции – переменная f, в остальном функция полностью аналогична функции printf().

После выполнения операций с передачей данных в файл или из файла, необходимо выполнить закрытие файла с помощью оператора fclose(f);

в качества аргумента этой функции используется указатель файла.

Пример. Запись в файл с проверкой дисковой операции (как принято в C). В операторе fprintf() в строке форматирования спецификатор %d записан с пробелом – иначе в результирующем файле получим сплошную запись.

#include FILE *f;

int main() { int i,x;

if((f=fopen("result.txt","w"))==NULL){ printf("File-Error!!!");

return 1;

} for(i=0;i<10;i++){ x=i*2;

fprintf(f," %d ",x);

} fclose(f);

return 0;

} Режимы открытия файлов r – режим чтения данных из файла;

w – режим записи в файл;

a – добавление в конец файла (или создание, если файл не обнаружен);

r+ – открытие файла для обновления (чтение и запись) Чтение из файла Для чтения из файла можно использовать функцию fscanf(). Эта функция является аналогом функции scanf(), но с дополнительным параметром – указателем на файл, из которого будет производиться чтение данных.

FILE *fp;

int n; float x;

….

fscanf(fp,"%d",&n);

fscanf(fp,"%f",&x);

… Пример. Чтение данных из файла в массив. Количество данных известно или их в файле больше. Числа записаны в файле по одному на строке (или через пробел).

// Чтение данных из файла в массив // количество данных известно или их в файле больше FILE *fp;

char * fileName="d:\\temp\\dann.txt";

fp=fopen(fileName,"r");

const int n=6;

int mx[n], r;

// чтение из файла for (int i=0;i

mx[i]=r;

} fclose(fp);

// печать:

for (int i=0;i

Пример. Чтение данных из файла в массив. Количество данных неизвестно. В программе файл открывается дважды: первый раз, чтобы подсчитать количество элементов, а второй раз – для считывания данных в динамический массив.

// Чтение данных из файла в массив // количество данных неизвестно FILE *fp;

char * fileName="d:\\temp\\dannn.txt";

fp=fopen(fileName,"r");

Pages:     | 1 |   ...   | 6 | 7 || 9 | 10 |   ...   | 11 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.