Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Вложенные циклы

Читайте также:
  1. Виды циклов в языке Паскаль. Итерационные циклы
  2. Вложенные операторы with
  3. Вложенные циклы
  4. Вложенные циклы. структурированные типы данных - массивы. объявление и использование массивов в программе. одномерные и многомерные массивы.
  5. вопрос. Основные циклы пьес Шоу, их характеристика.
  6. Вопрос. Составные части глобального круговорота вещества. Биогеохимические циклы(C.N.P.S).
  7. Геракл туралы мифтер циклын тарқатып жазыңыз.
  8. Долгие и короткие циклы в истории России. 1.
  9. Жизненые циклы паразитов

Любой цикл может содержать внутри себя один или несколько других циклов. Такая структура называется вложенными циклами.

Для программирования структуры вложенных циклов используются операторы цикла FOR, записанные внутри тела цикла другого оператора FOR (или, как говорят, внутри области действия другого оператора FOR). При этом необходимо выполнять основное требование вложения циклов: все операторы области действия внутреннего цикла должны целиком располагаться внутри области действия внешнего цикла, т. е. циклы не должны пересекаться. Несколько вложенных циклов могут заканчиваться одним и тем же оператором.

 

Пример инициализации массива

string students[10] = {

"Иванов", "Петров", "Сидоров",

"Ахмедов", "Ерошкин", "Выхин",

"Андеев", "Вин Дизель", "Картошкин", "Чубайс"

};

Описание синтаксиса

Массив создается почти так же, как и обычная переменная. Для хранения десяти фамилий нам нужен массив, состоящий из 10 элементов. Количество элементов массива задается при его объявлении и заключается в квадратные скобки.

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

Попробуем вывести наш массив на экран с помощью оператора cout.

#include <iostream>

#include <string>

 

int main()

{

std::string students[10] = {

"Иванов", "Петров", "Сидоров",

"Ахмедов", "Ерошкин", "Выхин",

"Андеев", "Вин Дизель", "Картошкин", "Чубайс"

};

std::cout << students << std::endl; // Пытаемся вывести весь массив непосредственно

return 0;

}

Скомпилируйте этот код и посмотрите, на результат работы программы. Готово? А теперь запустите программу еще раз и сравните с предыдущим результатом. В моей операционной системе вывод был следующим:

· Первый вывод: 0x7ffff8b85820

· Второй вывод: 0x7fff7a335f90

· Третий вывод: 0x7ffff847eb40

Мы видим, что выводится адрес этого массива в оперативной памяти, а никакие не «Иванов» и «Петров».

Дело в том, что при создании переменной, ей выделяется определенное место в памяти. Если мы объявляем переменную типа int, то на машинном уровне она описывается двумя параметрами — ее адресом и размером хранимых данных.

Массивы в памяти хранятся таким же образом. Массив типа int из 10 элементов описывается с помощью адреса его первого элемента и количества байт, которое может вместить этот массив. Если для хранения одного целого числа выделяется 4 байта, то для массива из десяти целых чисел будет выделено 40 байт.

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

Попробуем вывести первый элемент массива — фамилию студента Иванова.

#include <iostream>

#include <string>

 

int main()

{

std::string students[10] = {

"Иванов", "Петров", "Сидоров",

"Ахмедов", "Ерошкин", "Выхин",

"Андеев", "Вин Дизель", "Картошкин", "Чубайс"

};

std::cout << students[0] << std::endl;

return 0;

}

Смотрим, компилируем, запускаем. Убедились, что вывелся именно «Иванов». Заметьте, что нумерация элементов массива в C++ начинается с нуля. Следовательно, фамилия первого студента находится вstudents[0], а фамилия последнего — в students[9].

В большинстве языков программирования нумерация элементов массива также начинается с нуля.

Попробуем вывести список всех студентов. Но сначала подумаем, а что если бы вместо группы из десяти студентов, была бы кафедра их ста, факультет из тысячи, или даже весь университет? Ну не будем же мы писать десятки тысяч строк с cout?

Конечно же нет! Мы возьмем на вооружение циклы, о которых был написан предыдущий урок.

Вывод элементов массива через цикл

#include <iostream>

#include <string>

 

int main()

{

std::string students[10] = {

"Иванов", "Петров", "Сидоров",

"Ахмедов", "Ерошкин", "Выхин",

"Андеев", "Вин Дизель", "Картошкин", "Чубайс"

};

for (int i = 0; i < 10; i++) {

std::cout << students[i] << std::endl;

}

 

return 0;

}

Если бы нам пришлось выводить массив из нескольких тысяч фамилий, то мы бы просто увеличили конечное значение счетчика цикла — строку for (...; i < 10; ...) заменили наfor (...; i < 10000; ...).

Заметьте что счетчик нашего цикла начинается с нуля, а заканчивается девяткой. Если вместо оператора строгого неравенства — i < 10 использовать оператор «меньше, либо равно» — i <= 10, то на последней итерации программа обратится к несуществующему элементу массива — students[10]. Это может привести к ошибкам сегментации и аварийному завершению программы. Будьте внимательны — подобные ошибки бывает сложно отловить.

Массив, как и любую переменную можно не заполнять значениями при объявлении.

 

19Пример построения функции

#include <iostream>

using namespace std;

 

void function_name ()

{

std::cout << "Hello, world" << std::endl;

}

 

int main()

{

function_name(); // Вызов функции

return 0;

}

 

 

Функции — один из самых важных компонентов языка C++.

· Любая функция имеет тип, также, как и любая переменная.

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

· Если функция не возвращает никакого значения, то она должна иметь тип void (такие функции иногда называют процедурами)

· При объявлении функции, после ее типа должно находиться имя функции и две круглые скобки — открывающая и закрывающая, внутри которых могут находиться один или несколько аргументов функции, которых также может не быть вообще.

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

· В конце тела функции обязательно ставится закрывающая фигурная скобка.

 

 

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

/* В этой программе используется прототип функции

чтобы обеспечить тщательную проверку типов. */

 

void sqr_it(int *i); /* прототип */

 

int main(void)

{

int x;

 

x = 10;

sqr_it(x); /* несоответствие типов */

 

return 0;

}

 

void sqr_it(int *i)

{

*i = *i * *i;

}

 

20Указатель — это переменная, хранящая в себе адрес ячейки оперативной памяти, например 0x100.

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

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

Ниже приведен конкретный пример обращения к переменным через указатель и напрямую.

Пример использования статических переменных

#include <iostream>

using namespace std;

 

int main()

{

int a; // Объявление статической переменной

int b = 5; // Инициализация статической переменной b

 

a = 10;

b = a + b;

cout << "b is " << b << endl;

return 0;

}

 

 

Указатели широко используются в C++. В чем то, именно их наличие сделало этот язык более удобным для системного программирования. Но стоит отметить, что это одна из наиболее сложных для освоения возможностей C++. Идея работы с указателями состоит в том, что пользователь работает с адресом ячейки памяти и имеет возможность динамически создавать и уничтожать переменные.

Как правило, при обработке оператора объявления переменной тип имя_переменной; компилятор автоматически выделяет память под переменнуюимя_переменной в соответствии с указаннымтипом:

 

1 2 char C='$'; //Будет выделена под символьную переменную С,//и ей присвоено стартовое значение

 

Доступ к объявленной переменной осуществляется по ее имени. При этом все обращения к переменной меняются на адрес ячейки памяти, в которой хранится ее значение:

 

1 2 cout<<C; //из ячейки памяти с именем C будет извлечено значение//и выведено на экран

 

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

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

Указатель — это переменная, значением которой является адрес памяти, по которому хранится объект определенного типа (другая переменная). Например, если Cэто переменная типа char, а P —указатель на C, значит в Pнаходится адрес, по которому в памяти компьютера хранится значение переменной C.

Как и любая переменная, указатель должен быть объявлен. При объявлении указателей всегда указывается тип объекта, который будет хранится по данному адресу:

тип имя_переменной;

Например:

 

1 2 3 int *p //по адресу, записанному в переменной p,//будет хранится переменная типа int//или, другими словами, p указывает на тип данных int

 

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

 

1 2 float *x, y, *z; //описаны указатели на вещественное число - x и z//а также вещественная переменная y

 

Операции * и & при работе с указателями

Операция получения адреса обозначается знаком &, а операция разадресации *. Первая возвращает адрес своего операнда. Например:

 

1 2 3 4 float a; //объявлена вещественная переменная a float *adr_a; //объявлен указатель на тип float adr_a = &a; //оператор записывает в переменную adr_a//адрес переменной a

 

Операция разадресации * возвращает значение переменной, хранящееся в по заданному адресу, то есть выполняет действие, обратное операции &:

 

1 2 3 4 float a; //объявлена вещественная переменная a float *adr_a; //объявлен указатель на тип float a = *adr_a; //оператор записывает в переменную a//вещественное значение, хранящиеся по адресу adr_a

 

Присваивание указателей

Значение одного указателя можно присвоить другому. Если указатели одного типа, то для этого применяют обычную операцию присваивания . Рассмотрим ее на примере:

 

1 2 3 4 5 6 7 8 9 10 11 12 #include "stdafx.h"#include <iostream> using namespace std; int main() {setlocale (LC_ALL, "Rus"); float PI=3.14159, *p1, *p2; p1=p2=&PI; cout<<"По адресу p1="<<p1<<" хранится *p1="<<*p1<<"\n"; cout<<"По адресу p2="<<p2<<" хранится *p2="<<*p2<<"\n"; system ("pause"); return 0; }

 

23Форма представленияодной и той же информации может быть различной. Это зависит от цели, которую вы перед собой поставили. С подобными операциями вы сталкиваетесь на уроках математики и физики, когда представляете решение в разной форме. Например, решение задачи: "Найти значение математического выражения y = 5x+ 3, при x = -3; -2; -1; 0; 1; 2; 3" можно представить в табличной или графической форме. Для этого вы пользуетесь визуальными средствами представления информации: числами, таблицей, рисунком.

Таким образом, информацию можно представить в различной форме:

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

На уроках математики вы используете специальный язык, в основе которого - цифры, знаки арифметических действий и отношений. Они составляют алфавит языка математики.

На уроках физики при рассмотрении какого-либо физического явления вы используете характерные для данного языка специальные символы, из которых составляете формулы. Формула - это слово на языке физики.

На уроках химии вы также используете определенные символы, знаки, объединяя их в "слова" данного языка.

Существует язык глухонемых, где символы языка - определенные знаки, выражаемые мимикой лица и движениями рук.

 

Основу любого языка составляет алфавит - конечный набор знаков (символов) любой природы, из которых формируется сообщение.

Языки делятся на естественные (разговорные) и формальные. Алфавит естественных языков зависит от национальных традиций. Формальные языки встречаются в специальных областях человеческой деятельности (математике, физике, химии и т. д.). В мире насчитывается около 10 000 разных языков, диалектов, наречий. Многие разговорные языки произошли от одного и того же языка. Например, от латинского языка образовались французский, испанский, итальянский и другие языки.


Дата добавления: 2015-02-16; просмотров: 4 | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2020 год. (0.039 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав