WWW.DISSERS.RU

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

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


Pages:     | 1 |   ...   | 2 | 3 || 5 | 6 |   ...   | 11 |

С помощью оператора, (запятая) можем добавить и отображение подсказки при вводе int x;

double y=0;

while (cout<<"\n x= ", cin>>x, x!=0) y += 1/(double)x;

cout<<"\n y = "<

Пример. Чтение всей информации из файла.

int i,t;

int x[10];

f=fopen("c:\\tmp\\dannye.txt","r");

i = 0;

while (!feof(f)) { fscanf(f,"%d",&t);

x[i]=t;

cout<<"\n x="<

} fclose(f);

Цикл с постусловием Цикл с постусловием реализует вариант цикла, в котором сначала выполняется тело цикла и только затем вычисляется условие продолжения цикла. Если значение условия равно нулю (что соответствует false), цикл завершается, если же значение условия отлично от нуля, то снова выполняется тело цикла с последующей проверкой условия. В любом случае, тело цикла выполнится хотя бы один раз. В C/C++ оператор цикла с постусловием имеет вид do оператор while ( условие продолжения );

Условие продолжение и оператор подчинены тем же правилам, что и аналогичные блоки уже рассмотренных операторов цикла.

Пример. Хорошо известный из школьного курса математики способ приближенного вычисления квадратного корня из числа.

// Квадратный корень из числа a #include #include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { double a,x,y,eps,d;

eps=1.e-6; // точность вычислений cout<<"\n a= (a>0) \n"; cin>>a;

if (a<=0) return 1;

x=a;

do{ y=0.5*(x+a/x);

d=fabs(x-y);

x=y;

cout<<"\n x= "<

} while (d>eps);

cout<<'\n';

return 0;

} Пример. Вычисление машинного эпсилон (machine epsilon). Название взято из книги Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений. – М.: Мир, 1980, стр. 26. Машинное эпсилон – наименьшее число с плавающей точкой, т.ч. 1>1, где – плавающее сложение. В книге также приведен алгоритм вычисления этого числа.

// машинное эпсилон float eps1, eps=1;

do{ eps *= 0.5;

eps1 = eps+1;

} while (eps1>1);

cout<<"\n eps = "<

Инструкция break С инструкцией break уже встречались в разделе, посвященному оператору switch.

Инструкция break прерывает выполнение операторов цикла for, while, do while, а также оператора выбора switch. Программа продолжает работу с оператора, следующего за блоком цикла или инструкции выбора.

Инструкция continue Инструкция continue завершает текущую итерацию цикла и передает управление на вычисление условия, после чего цикл может продолжиться. В отличие от инструкции break, завершающей выполнение всего цикла, инструкция continue завершает выполнение только текущей итерации.

Пример. Операторы break и continue. Разницу между этими операторами иллюстрирует пример (достаточно убрать комментарии с break, а continue, наоборот, закомментировать). В приведенном варианте (с break) вычисления в цикле прервутся при i=3, а в варианте с continue цикл выполнится полностью, но будут пропущены значения i, равные 3, 6, 9.

#include using namespace std;

int main() { int i;

for (i=1;i<10;i++){ if((i%3)==0) break;

// continue;

cout <<" i= "<

} return 0;

} Результаты программы для варианта с continue:

Инструкция goto Инструкция goto обеспечивает безусловный переход к другой инструкции внутри той же функции, поэтому современная практика программирования выступает против ее применения.

Синтаксис оператора goto:

goto метка;

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

Пример. Вычисление машинного эпсилон. Предложенный код совпадает с приведенным в указанной ранее книге (где код был написан на Фортране, где без goto обойтись трудно).

// машинное эпсилон double eps1, eps=1;

label1: eps *= 0.5;

eps1 = eps+1;

if (eps1>1) goto label1;

cout<<"\n eps = "<

Оператор goto используют редко, более того, стандартной рекомендацией является полное исключение этого оператора из программ на C++ (см., напр., Голуб А. Правила программирования на Си и Си++, стр. 128).

Инструкция return Инструкция return обеспечивает выход из функции и имеет следующий синтаксис return выражение;

В функциях, имеющих тип void, оператор return используется без значения. Значение выражения является возвращаемым значением функции.

Функция может содержать любое количество операторов return.

Массивы Массив – это набор данных одного типа и объединенных общим именем. Массив создается оператором объявления.

Type arrayName[arraySize];

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

Пример. Создаются два массива a и b. Массив b состоит из тех же данных, что и a, но записанных в обратном порядке.

const int N=10;

int a[N];

int b[N];

for (int i=0;i

for (int i=0;i

cout<<"\n a: ";

for (int i=0;icout<<"\n b: ";

for (int i=0;i

Выражение arraySize, задающее количество элементов в объявлении массива, должно быть константой (как в примере.), или выражением, значение которого известно во время компиляции. Если необходимо создать массив, число элементов которого будет установлено только во время выполнения программы, то должны использоваться либо функция malloc() или оператор new, – это будет показано в разделе Динамические массивы.



Доступ к элементам массива осуществляется с помощью индекса:

a[0], a[1], a[2] и т.д. Индекс помещается в квадратных скобках после имени массива. Индекс первого элемента любого массива равен нулю. В качестве индекса можно применять любое числовое значение, – оно будет преобразовано в целое число.

Пример. Заполнение массива числами, введенными с клавиатуры.

// Ввод чисел с клавиатуры const int N=5;

int u[N];

for (int i=0; i

for (int i=0;i

Пример. Тот же пример ввода элементов массива с клавиатуры, но с использованием функций только языка C.

// Ввод чисел с клавиатуры #include #define N int main() { int u[N]; int i;

for (i=0; i

} printf("\n u: ");

for (i=0;i

return 0;

} Пример. Заполнение массива случайными числами. Используем функцию rand(), генерирующую целые числа от 0 до RAND_MAX (константа, определенная в stdlib.h). Для изменения диапазона используем операцию получения остатка (%), в примере выбран диапазон от 1 до 10.

#include #include // объявление rand() using namespace std;

const int N=10;

int main() { int d[N];

for (int i=0; i

cout<<"\n d: ";

for (int i=0;i

cout<<"\n";

return 0;

} Объем памяти, занятой элементами массива, можно определить с помощью функции sizeof() по формуле количество_байтов = sizeof(тип) размер_массива Пример. Вычисление объема памяти, занятой массивом.

const int N=10;

float x[N];

int size_x = sizeof(float) * N;

cout<<"\n Memory size for x ="<

Важная особенность языка C/C++ – отсутствует контроль соблюдения границ массива. Такая проверка – обязанность программиста.

Пример. Несоблюдение границ массива. В программе сделана попытка выполнить обращение к массиву, указав в качестве индекса значение, превышающее его границу. Программа успешно прошла компиляцию, и на допущенную в программе ошибку не было указано.

Элементу присвоено значение соседней с массивом области памяти.

// Несоблюдение границ const int N=10;

int v[N];

cout<<"\n v: ";

for (int i=0;i

cout<<' '<

} // индекс за границей массива:

cout<<"\n v[20]: "<

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

Пример. Присвоение значений одного массива другому.

const int N=10;

int a[N], b[N];

for (int i=0;i

// массиву b присваиваются значения массива a for (int i=0;i

Пример. Сравнение двух массивов на равенство элементов.

// Сравнение массивов const int N=10;

int a[N], b[N];

for (int i=0;i

// проверяем равны ли массивы a и b bool p=1;

for (int i=0;i

if (p) cout<<"\n a=b \n";

else cout<<"\n a!=b \n";

Пример. Можно улучшить код и избежать лишних проверок. Если условие продолжения цикла заменить условием (i

// Сравнение массивов const int N=10;

int a[N], b[N];

for (int i=0;i

} // проверяем, равны ли массивы a и b bool p=1;

for (int i=0;(i

cout<<"\n a: ";

for (int i=0;icout<<"\n b: ";

for (int i=0;i

cout<<"\n";

if (p) cout<<"\n a=b \n";

else cout<<"\n a!=b \n";

Сложнее проверить содержат ли массивы одни и те же данные, т.е.

массивы совпадут после перестановки элементов в одном из них.

Пример. Совпадение данных.

const int N=10;

int a[N], b[N];

for (int i=0;i

} // проверяем, все ли элементы массива a есть в b bool q=1; // проверочный флаг for (int i=0;(i

for (int j=0;j

break; // к следующему индексу i } } if (q) cout<<"\n |a| = |b| \n";

else cout<<"\n |a| != |b| \n";

cout<<"\n a: ";

for (int i=0;icout<<"\n b: ";

for (int i=0;i

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

#include // объявление rand() … … … … … … … … … // Совпадение случайных данных const int N=100;

int a[N], b[N];

for (int i=0;i

for (int i=0;i

… … … … … … … … … Распространенной операцией с массивами является слияние двух и более массивов в один результирующий массив.

Пример. Слияние двух массивов.

// Слияние двух массивов const int N=10;





const int M=12;

int a[N], b[M], c[N+M];

// инициализация массивов for (int i=0;i

for (int i=0;i

// образуем массив присоединением массива b к a int k=0;

for (int i=0;i

for (int i=0;i

// вывод результатов cout<<"\n a: ";

for (int i=0;icout<<"\n b: ";

for (int i=0;i

cout<<"\n c: ";

for (int i=0;i

cout<<"\n";

Пример. Слияние двух упорядоченных массивов a[0]a[1]…a[N] и b[0]b[1]…b[N].

// Слияние двух упорядоченных массивов const int N=9;

const int M=11;

int a[N], b[M], c[N+M];

// инициализация массивов for (int i=0;i

for (int i=0;i

int i,j,k;

i=j=k=0;

while ((i

else c[k++] = b[j++];

// остаток массива a:

while (i

// остаток массива b:

while (j

При объявлении массива можно использовать инициализаторы.

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

Пример. Инициализация массивов целых чисел и массива чисел с плавающей точкой.

// инициализация int a[5]={0,1,2,3,4};

int b[5]={0,1};

double x[7]={0.1,1.e-1,10,1.e+1,1e1};

Количество значений в инициализаторе не должно быть больше размера массива. Если значений в инициализаторе меньше, остальным элементам массива присваивается 0. Каждая константа должна иметь тип, совместимый с типом массива.

Массивы типа char можно инициализировать строковыми константами.

Пример. Инициализация массива типа char. Поскольку строки заканчиваются символом '\0', граница массива должна быть на единицу больше длины слова. Поэтому для хранения слова "february", состоящего из 8 символов, потребовался массив из 9 элементов.

// инициализация char char login[8] = {'j','a','n','u','a','r','y','\0'};

char password[9]="february";

cout<<'\n'<

cout<<'\n'<

Инициализацию в объявлении массива удобно использовать при реализации численных методов.

Пример. Вычисление значения многочлена u(x) x4 3x3 6x2 10x 16 при x 4.

методом Горнера.

#include "stdafx.h" #include #include using namespace std;

const int n=4;

int main(int argc, _TCHAR* argv[]) { double a[n+1]={16.0,-10.0,6.0,-3.0,1.0};

double u,x;

int k;

// Вычисление значения многочлена for (x = 4,u = a[n],k=n-1;k>=0;k--) u = u*x + a[k];

cout<<"\n u("<

return 0;

} Если при объявлении массива используется инициализатор, можно не указывать размер массива – подсчет будет произведен компилятором.

Масивы, объявленные без указания границы изменения индекса, называют безразмерными.

Пример.

// безразмерные массивы int a[]={1,2,3,4,5};

for (int i=0;i<5;i++) cout<<' '<

char s[]="November";

cout<<'\n'<

Использование безразмерных символьных массивов значительно упрощает их инициализацию, т.к. не нужно подсчитывать количество символов, – проще написать char s[]="November", чем char s[9]= "November". При обработке строк, как правило, знать границу символьного массива не нужно – каждая строка заканчивается символом '\0', что и используют при обработке строк. В следующем примере показано, как границу можно найти.

Пример. Вычисление границы безразмерного символьного массива.

// безразмерные символьные массивы char s[]="November";

int l_s=0; // l_s - длина строки s while (s[l_s++] !='\0');

cout<<"\nLength "<

Пример. Вычисление суммы элементов безразмерного числового массива. Количество элементов массива найдено с помощью функции sizeof().

// безразмерные числовые массивы double x[]={1.0,2,3.0,4.,5e1,6.6,0.7,80};

int l_x = sizeof(x)/sizeof(double); /* количество элементов массива x */ cout<<"\n Size x = "<

double s_x=0;

for (int i=0;i

cout<<"\nSumma x = "<

Строки Единственный вид строки в языке C – это массив типа char, содержащий в качестве последнего элемента символ '\0' (нулевой терминатор, нулевой символ). Вместо символа '\0' можно использовать число 0.

Пример. Объявление и инициализация строк в C.

char month[4]={'M','a','y','\0'};

char Month[4]={'M','a','y',0};

char password[9]="february";

char fio[4]="FIO";

char Fio[4]={'F','I','O','\0'};//fio==Fio char s[]="November";

Пример. Объявление и инициализация строк, содержащих символы кириллицы – на каждый символ в строке нужно 2 байта.

char fio_r[7]="ФИО";

char Fio_r[]={'Ф','И','О','\0'};

char month_r[4]={'М','а','й','\0'};

char Month_r[7]="Май";

Пример. Объявление и инициализация длинных строк. Строковые константы, разделенные пробелом, рассматриваются как одна строка. Об этом нужно вспомнить при записи строки, не умещающейся на экране.

// Длинные строки char str_E1[47]= "ABCDEFGHIJKLMNOPRSTUVWZabcdefghijklmnoprstuvwz";

char str_E2[47]="ABCDEFGHIJKLMNOPRSTUVWZ" "abcdefghijklmnoprstuvwz";

// - строки str_E1 и str_E2 совпадают cout<

cout<

Pages:     | 1 |   ...   | 2 | 3 || 5 | 6 |   ...   | 11 |










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

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