Logo GenDocs.ru


Поиск по сайту:  


Лекции по информатике - файл all lec.doc


Лекции по информатике
скачать (398.8 kb.)

Доступные файлы (1):

all lec.doc1495kb.21.01.2007 21:18скачать

содержание

all lec.doc

1   ...   6   7   8   9   10   11   12   13   14
Реклама MarketGid:


^ Оператор получения адреса &

Вы уже знаете, что для каждой переменной, используемой в программе, отводится определенный объем памяти, который зависит от типа переменной. Каждый элемент памяти пронумерован от 0 и далее. Если компьютер имеет 2 Мегабайта оперативной памяти, элементы будут пронумерованы от 0 до 2097151. Эти номера и называют адресами элементов памяти.

При ссылке на переменную (например, при выводе ее значения на экран) используется имя переменной. Можно также сослаться и на ее адрес, если поставить символ амперсанда (&) перед именем переменной, скажем, так: &count. Символ & называется оператором получения адреса. Он указывает Си, что вас в настоящий момент интересует адрес элемента памяти, где зарезервировано место для переменной, а не значение переменной, хранящееся в этом элементе.

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

Вводя числовые или символьные данные, следует указывать в списке данных функции scanf() адрес переменной, а не просто ее имя:
main()

{

float amount;

scanf("%f", &amount);

}
В этом примере функция scanf() вводит число с плавающей точкой и вносит его в область памяти, зарезервированную для переменной amount. Как только число помещается в эту область памяти, оно автоматически становится значением переменной.

На время работы функции scanf(), выполнение программы приостанавливается, и программа ожидает ввода данных. Ввод заканчивается нажатием клавиши Enter.

Принцип работы с данными функции scanf() в корне отличается от работы функций gets() и getchar(). Для того чтобы понять, что именно происходит при вводе с помощью scanf(), необходимо детально рассмотреть эти отличия.

Когда данные вводятся при помощи функции gets(), все символы, которые были набраны на клавиатуре до нажатия Enter, становятся значением переменной. Когда символ вводится с помощью функции getchar(), нажатие клавиши автоматически приводит к присвоению соответствующего символа переменной.

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

Принято говорить, что scanf() получает данные из входного потока. Входным потоком называется последовательность символов, поступающих из некоторого источника. В случае функции scanf() источником служит клавиатура. После нажатия клавиши Enter все данные, которые были введены к этому времени, передаются функции scanf() в виде пока еще бессмысленного набора символов, в том же порядке, в каком их набирали. Затем scanf() определяет, какие символы соответствуют типу, заданному указателем формата, а какие следует игнорировать. Указатели формата называют преобразователями символов, так как они берут исходные символы из входного потока и преобразуют их в данные, относящиеся к определенному типу.

Функция scanf() игнорирует не содержащие информации знаки: пробелы, символы табуляции, символы новой строки, кроме тех случаев, когда текущий тип данных определен как char. Рассмотрим программу:
main()

{

int count;

puts("Пожалуйста, введите число: ");

scanf("%d", &count);

printf("Число равно %d", count);

}
Перед тем как ввести число, вы можете нажимать на клавишу пробела столько, сколько хотите— Си будет игнорировать пробелы, в ожидании первого значимого символа. Затем Си попытается преобразовать символы в соответствии с указателями формата в строке формата функции scanf(). Если эти символы соответствуют формату (в данном случае— если это цифры), они будут внесены в переменную. Ввод данных прекратится, если встретится символ, формат которого не соответствует ожидаемому, то есть он не является цифрой.

Какие символы программа расценивает как «подходящие», зависит от указателей формата. Если стоит указатель %d, то «подходящими» являются только цифры и знак «минус». Если поставить указатель %x, то соответствующими формату окажутся символы 0123456789ABCDE, так как все они используются при записи чисел в шестнадцатеричной системе счисления. Если же стоит указатель %c, принимаются любые символы, даже пробел внутри входного потока функция scanf() в этом случае не игнорирует. Если написать инструкцию:
char letter;

scanf("%c", &letter);
и нажать клавишу пробела в начале последовательности значимых символов, scanf() присвоит переменной значение пробел, игнорируя последующие символы. Поэтому, имея дело с типом char, нельзя помещать пробелы перед другими символами.
^

Выбор соответствующих средств ввода данных


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

Примечание: рассмотренные выше функции вызываются из библиотеки stdio.h.

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

Поэтому функцию scanf() следует использовать с осторожностью. Лучше всего вводить только один набор данных с одной функцией и использовать подсказки, четко объясняющие пользователю, какой именно ввод от него ожидается.
^

Ввод в Си++


Компиляторы языка Си++ поддерживают функции gets(), getchar() и scanf(), о которых мы говорили в этой главе. Кроме того, Си++ имеет собственное многоцелевое средство ввода для всех типов данных. Стандартный поток ввода cin в сочетании с двумя символами «больше» (>>), которые называются оператором извлечения*, служит для считывания данных с клавиатуры. Программа
int count;

cin >> count;
вносит целочисленные данные с клавиатуры в значение переменной count. Стандартный поток ввода cin не требует указания адреса переменной для числовых и символьных данных, указывается только имя переменной.

При использовании cin нет необходимости определять формат с помощью указателей формата. Поток ввода cin имеет возможность определять тип данных самостоятельно на основании вводимой информации. Это свойство называется перегрузкой. Из-за этой особенности оператора cin большинство программистов предпочитают использовать именно его, а не функцию scanf().

Возможно, первое время вы будете испытывать затруднения в использовании операторов извлечения >> и вставки. Оператор извлечения >> изображен в виде стрелки, направленной в сторону переменной. Это означает, что данные поступают к ней в виде ввода. Когда вы применяете cin для ввода данных, пользуйтесь оператором, который как бы указывает направление к переменной.

Оператор вставки << изображен в виде стрелки, направленной от переменной. Это значит, что данные выводятся из переменной на экран. Со стандартным потоком вывода cout используйте, соответственно, тот оператор, который как бы указывает направление от переменной.
^

Управляющие структуры

Структуры выбора (if / else)



Программы, которые принимают решения, выполняют условную обработку. Другими словами, на основании результата одного или нескольких Условий программа будет выполнять определенные операторы.

Инструкция if используется в тех случаях, когда необходимо решить, должна ли быть выполнена конкретная инструкция программы (if по-английски значит «если»). Структура if выглядит следующим образом:
if (condition)

instruction;
Этой записью мы говорим: «Если некоторое условие выполняется (является истинным), инструкция должна быть выполнена».

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

* условие заключается в круглые скобки;

* точку с запятой ставят не после условия, а только в конце инструкции;

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




Условия

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


Оператор

Значение

Пример

==

равно

if (tax == 0.06)

>

больше

if (hours > 40)

<

меньше

if (hours < 40)

>=

больше или равно

if (salary >= 10000)

<=

меньше или равно

if (cost <= limit)

!=

не равно

if (count != 1)


Обратите внимание: когда вы хотите узнать, равны ли два значения друг другу, то должны использовать оператор отношения, состоящий из двух знаков равенства (==) подряд. Если поставить только один знак равенства, компилятор сгенерирует предупреждение, или, реже, ошибку. Единичный знак равенства (=) используется для обозначения присваивания значения переменной.

Простейшая инструкция с использованием if выглядит примерно так:
if (time > 11)

puts("Уже поздно, ступайте домой.");
Здесь говорится: «Если значение переменной time больше 11, тогда следующее сообщение должно быть выведено на дисплей». Если значение переменной time окажется меньше 11, сообщение не появится.
^ Составные инструкции

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

Сама по себе инструкция if используется в тех случаях, когда важно выполнить некие действия при истинности определенного условия. Возможна ситуация, когда при истинности условия должен быть выполнен один набор инструкций, а в противном случае— другой. Допустим, мы хотим, чтобы в тех случаях, когда цена какого-либо товара ниже той, для которой установлен налог на предметы роскоши, программа генерировала сообщение: «Для данного наименования налог на предметы роскоши не установлен». Это можно сделать с помощью двух инструкций if:
if (cost > 40000.00)

{

luxury = cost * 0.005;

printf("Размер налога на предметы роскоши для \

данного наименования составляет %.2f", luxury);

}

if (cost < 40000.00)

puts("Для данного наименования налог \

на предметы роскоши не установлен");
Но есть более эффективный способ. Можно объединить обе инструкции в одну, пользуясь тем, что есть только два возможных случая в использовании одной и той же переменной: либо цена товара больше 40 тысяч долларов, либо цена товара меньше или равна указанной сумме. Если одно из условий не выполняется, следовательно, выполняется второе условие, так что можно скомбинировать их, используя ключевое слово else (которое переводится как «иначе»):
if (condition)

instruction;

else

instruction;
Здесь сказано: «Если условие истинное, то должна быть выполнена команда, являющаяся частью инструкции if, иначе надо выполнить инструкцию, следующую за else». Инструкция, помещенная после ключевого слова else, выполняется только в том случае, если условие оказалось ложным. Если возникает необходимость выполнить в этом случае несколько инструкций, можно использовать составную инструкцию, заключив ее в фигурные скобки точно так же, как для if. Точка с запятой ставится в конце каждой инструкции и не ставится после ключевого слова else.
^ Логические операторы

Как вы уже могли заметить в приведенных выше примерах, инструкция if проверяет выполнение условия только для одной переменной и одного значения. Значит, в инструкции можно ввести только одно условие с целью проверки его истинности. На самом деле часто возникает необходимость проверить в условии более одного значения. Есть три логических оператора: ИЛИ (||), И (&&) и отрицания (!). Оператор ИЛИ означает, что для выполнения инструкции if достаточно истинности одного из двух (или обоих вместе) заданных условий. Оператор И указывает на то, что должны быть истинными оба условия одновременно. Оператор отрицания означает, что инструкция if выполняется, если некое условие оказалось ложным.
^ Вложенные инструкции if

Конструкция if...else может содержать инструкции любого типа. Они могут включать ввод и вывод значений, выполнение математических операций или вызов собственных функций. Но инструкция в условии может оказаться и другой инструкцией if. В этом случае она будет называться вложенной инструкцией. Ниже приведен пример, где одна инструкция if вложена в другую:
if (income > 100000)

if (status == 'S')

taxrate = 0.35;
Второе условие проверяется только в том случае, если выполнено первое, так что значение переменной taxrate присваивается только при выполнении обоих условий. Ту же самую логическую конструкцию можно было записать следующим образом:
if (income > 100000 && status == 'S')

taxrate = 0.35;
Обе инструкции выполняют одну и ту же задачу, но второй способ записи, с использованием оператора &&, кажется более ясным, так как нет необходимости расшифровывать смысл второй инструкции if.
^

Структуры выбора (switch/case/default)


Если в программе следует учесть больше трех возможных вариантов, конструкция с вложенными инструкциями if...else может оказаться очень запутанной. В таких случаях в качестве альтернативы используется переключатель switch. Переключатель switch представляет собой структуру, построенную по принципу меню, и содержит все возможные варианты условий и инструкции, которые следует выполнить в каждом конкретном случае. Пример подобной конструкции приведен ниже.
main()

{

int answer;

puts("Си это: \n");

puts("1. Язык, на котором

говорят на юге Франции\n");

puts("2. Язык, который используется только

для написания \

больших компьютерных программ\n");

puts("3. Компилирующий язык, легко

совместимый с любыми системами\n");

puts("4. Ничего из перечисленного\n");

puts("Введите номер ответа\n");

answer = getchar();

putchar('\n');

switch (answer)

{

case '1':

puts("К сожалению, Вы ошиблись, \

на юге Франции говорят на языке Паскаль\n");

break;

case '2':

puts("Вы ошибаетесь,

язык Си используют для написания программ\n");

puts("любых типов и размеров\n");

break;

case '3':

puts("Очень хорошо, Вы

дали правильный ответ\n");

puts("Си является

компилирующим языком и может использоваться\n");

puts("с

любыми компьютерными системами\n");

break;

case '4':

puts("К сожалению,

Вы ошибаетесь, правильный ответ - номер 3\n");

break;

default:

puts("Вы ввели символ,

не соответствующий \

ни одному из номеров ответа\n");

}
В круглых скобках после переключателя switch находится переменная типа int или char, следом расположен блок инструкций, заключенных в фигурные скобки, которые содержат ряд ветвей case. Каждая ветвь case выполняет инструкции, основываясь на возможном значении переменной. Это значение должно быть представлено в виде целого числа или символа, заключенного в одинарные кавычки, либо в виде имени целочисленной или символьной константы.

Ветвь case '1':, например, предписывает программе выполнить следующие ниже инструкции, если значение переменной переключателя switch соответствует символу '1'. Если значение переменной отличается от единицы, компилятор переходит к проверке условия второй ветви case.

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

Если значение переменной не удовлетворяет условиям ни одной из ветвей case, выполняется ветвь, помеченная инструкцией default. Это дает возможность учесть все возможные варианты ввода. После инструкции default нет необходимости ставить break, поскольку она всегда является последней в процедуре выполнения switch. Имеет смысл включать default даже тогда, когда вы полагаете, что учли все возможные условия и все возможные случаи ввода значений.

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

case 'y': puts ("Вы ответили \"Да\"");

break;

case 'N':

case 'n': puts ("Вы ответили \"Нет\"");

break;


^

Структуры повторения (циклы)


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

Язык Си и Си++ имеет три структуры, известные под названием циклов, которые используются для управления повторами:

цикл for;

цикл do...while;

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

Использование цикла for


Цикл for используется в том случае, когда известно точное количество повторов, которое нужно выполнить.
for (инициализация цикла (начальное значение); выражение-условие (повторять, пока выполняется условие); список выражений (приращение значения))

{

тело_цикла

}
В приведенной ниже программе цикл for используется для того, чтобы вывести на экран монитора числа от 1 до 10, расположенные друг под другом.
main()

{

int repeat;

for (repeat = 1; repeat <= 10; repeat++)

printf("%d\n", repeat);

}
Этот цикл управляется переменной repeat, которая называется индексом*. Индексу можно присвоить любое имя, но значение переменной обязательно должно быть целым числом. Выражение в круглых скобках после for делится на три составляющие:


repeat=1

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

repeat <= 10

задает условие повтора цикла до тех пор, пока значение переменной repeat остается меньше или равно 10

repeat++

приращение значения переменной repeat после каждого повтора цикла


Когда программа начнет выполнение цикла, она присвоит переменной repeat начальное значение, равное 1. Затем будет проверено, является ли истинным условие, что значение переменной меньше или равно 10. Если условие истинное, начнется выполнение инструкции, связанной с циклом, то есть вывод на экран значения переменной.

После выполнения инструкции произойдет увеличение значения переменной на единицу и снова будет проведена проверка истинности условия. Так как условие все еще является истинным, цикл будет выполнен во второй раз, отображая на дисплее текущее значение переменной. Этот процесс будет повторяться до тех пор, пока значение переменной не вырастет до 11. Как только это произойдет, условие repeat <= 10 уже не будет истинным, так что выполнение инструкции прекратится и цикл завершится.

Если один цикл for выполняется внутри другого, принято говорить, что мы имеем дело с вложенным циклом. Внутренний цикл целиком выполняется во время каждого повторения внешнего цикла. Вложенные циклы for можно представить себе как двухмерные, а единичный— как одномерный.
^

Использование цикла do...while (постусловие)


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

операция_1;

операция_2;

……………

операция_n;

} while (тестовое_условие);
Выполнение инструкций, заключенных в фигурные скобки, повторяется до тех пор, пока является истинным условие, указанное в while. Правильность условия проверяется только в конце цикла, так что, даже если условие с самого начала не было истинным, цикл будет выполнен, по меньшей мере, один раз.

Используя цикл do...while, следует указывать условие так, чтобы выполнение его не оказалось бесконечным.

Цикл do...while часто используется для того, чтобы повторять программу до тех пор, пока пользователь не решит закончить ввод:
main()

{

int temp;

float celsius;

char repeat;

do

{

printf("Введите значение температуры: ");

scanf("%d", &temp);

celsius = (5.0 / 9.0) * (temp - 32);

printf("%d градусов по

Фаренгейту соответствует %6.2f по Цельсию\n",

temp, celsius);

printf("Желаете ввести еще значение?");

repeat = getchar();

putchar('\n');

}

while (repeat == 'y' || repeat == 'Y');

}
В этом примере практически весь текст программы, исключая определение переменных, входит в большой блок do...while. Цикл будет повторяться до тех пор, пока в ответ на запрос будет вводиться символ Y или y. Обратите внимание, что инструкция, выводящая на экран запрос о продолжении работы, является последней инструкцией в блоке.

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

^

Использование цикла while (предусловие)


Цикл while используется в том случае, когда не известно точное число повторов и при этом нет необходимости, чтобы цикл непременно был выполнен хотя бы один раз.
while (тестовое выражение)

{ оператор 1;

оператор 2;

……………

оператор n;

}


Так же, как и цикл do, цикл while выполняется до тех пор, пока является истинным условие, но в отличие от конструкции do...while, условие проверяется до начала выполнения цикла, даже если цикл выполняется первый раз. Если условие окажется ложным, цикл не будет выполнен ни разу.

^

Операторы передачи управления

Оператор безусловного перехода goto


Этот оператор организует переход на строку с так называемой меткой (произвольно выбранный идентификатор).

В примере оператор goto передает управление оператору, стоящему за меткой alpha, при достижении переменной i величины, превышающей m.
#include <iostream.h>

void main ()

{

int n=10;

int m=4;

int s=0;

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

{

s+=i;

if (i>m) goto alpha;

}

alpha: cout<<”\ns= ”<<s;

}
Результат:

s=15.
Использование goto в практике программирования настоятельно не рекомендуется, т.к. он затрудняет понимание программ и возможность их модификации.

^

Оператор break


Оператор break передает управление на первый оператор, стоящий после цикла.
#include <iostream.h>

void main ()

{

int t=1;

int s=0;

while (t<10)

{s+=t;

if (s>20) break:

t++;

}

cout<<”\nsum= ”<<s;

}
Результат:

sum=21.

^

Оператор continue


C помощью этого оператора завершается текущая итерация и начинается проверка условия дальнейшего продолжения цикла.
Сумма только отрицательных чисел:
#include <iostream.h>

main()

{

int sum, i, n, ch;

sum=0;

cin>>n;

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

{

cin>>ch;

if(ch>=0) continue;

sum+=ch;

}

cout<<sum;

return 0;

}

1   ...   6   7   8   9   10   11   12   13   14

Реклама:





Скачать файл (398.8 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru