Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Форма представления одного данного

Формат

Формат

if (<выражение>)

<оператор 1>;

[else

<оператор 2>; ]

Конструкция работает предельно просто: если условие не равно нулю, то выполняется оператор_1, в противном случае – оператор_2. Обратите внимание, что оператор_1 и оператор_2 должны представлять собой только одно выражение. Как вы уже догадались, так как условие должно возвращать некоторое значение, то оно не может быть составным.

Примеры:

if (a>b)

c=a;

else

c=b;

 

· Обход if (x*x + y*y > r*r) z=0; /* без else */

 

·

 

if (x<0)

y=x+1;

else

y=1–x;

 

Вложенные if.

· if (x > y)

if (z = = 0)

x = 5;

else

x = –5;

else

if (z > 10)

y = 5;

else

y = –5;

 

·

if (x < 0)

y = x*x–5;

else

if (x<=5)

y = sqrt(x)+3;

else

y=x–7;

 

Пустой оператор. Не выполняет никакого действия.

Формат:;

 

if (x > y)

if (z = = w)

if(w<p) y = 1;

else p = q;

else; // при x>y && z!=w переход к оператору с меткой m1

else x = 4;

m1: z = 5;

 

 

5.4 Составной оператор

Употребляется везде, где стандарт языка Си предусматривает один оператор, а для решении задачи требуется несколько.

 

Формат { <оператор>; [<оператор>;]... }

 

Пример:

Задача: x = max (a, b) y = min(a, b)

if (a>b) {

x = a;

y = b; }

else { x = b;

y = a; }

 

 

5.5 Циклы

 

 

5.5.1. Цикл while

 

Формат: while (e) /* e–условие продолжения цикла */

<оператор>; /* Тело цикла */

Все требования у условию и к выражению такие же, как и в конструкции ветвления.

Эквивалентная схема

label: if (!e) goto next;

S;

goto label;

next:...........

 

Пример: Дано: a[i], i=1...100. Найти сумму(a[i]>0) и сумму(a[i]<0).

pol = otr = i = 0;

while (i <= 100){

if (a[i] > 0) pol += a[i];

if (a[i] < 0) otr += a[i];

i++; }

 

Напечатать слова "Hello world" 100 раз.

int c; c = 100; while (c--) printf ("Hello world\n");

Понятие истины в Си растяжимо: истинно все, что не равно нулю. В частности, 100 - это истина. А выражение c– –, стоящее в условии (помните постфиксную форму инкремента?), вернет значение переменной с, а затем уменьшит его на единицу. При выполнении цикла в сотый раз условие вернет 1, а в переменной с окажется 0. После этого условие выполнится в 101-й раз, вернет 0, запишет в с –1, и, так как 0 – это ложь, цикл выполняться больше не будет.

 

 

5.5.2 Цикл for

 

е1 – присваивание начального значения управляющей переменной.

е2 – проверка выполнения условия продолжения цикла.

е3 – изменение значения управляющей переменной.

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

е2 и е3 перевычисляются при каждом проходе цикла è for это цикл с переменными границами!

 

for наиболее универсальный цикл в языке Си (и в других алгоритмических языках).

 

Формат for ([e1]; [e2]; [e3])

S;

Эквивалентная схема

e1;

while (e2)

{ S; e3; }

 

Пример:

1. Дано: a[i], i=1...100. Найти сумму(a[i]>0) и сумму(a[i]<0).

pol = otr = 0;

for (i = 0; i<100; i++) {

if (a[i]>0) pol+=a[i];

if (a[i]<0) otr+=a[i];

}

2. Определить количество цифр натурального числа L.

for (k=0; L!=0; L/=10)

k++;

 

Пример: for (; e2;) S; à while (e2) S;

for (;;) S; à while (1) S;

 

 

3. Найти 1–й отрицательный элемент массива. Если его нет, то 0.

for (i=0; i<100 && a[i] > = 0; i++);

if (i= =100) {

y = 0; }

else {y = a[i]; }

 

 

5.5.3 Цикл do

 

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

do {

< оператор >;

} while (e);

 

Эквивалентная схема

label: <оператор>;

if (e) goto label;

 

Пример:

Дано: a[i], i=1...100. Найти сумму(a[i]) и произведение(a[i]).

sum = i = 0;

pr=1;

do { sum + = a[i];

pr*=a[i];

i++;

} while (i<100);

 

 

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

 

В качестве <тела_цикла> в любом цикле может выступать другой цикл. Следует помнить только о составном операторе.

· Умножение матриц

for (i=0; i<m; i++) {

for (j=0; j<l; j++) {

c[i][j] = 0;

for (k=0; k<n; k++) {

c[i][j] + = a[i][k]*b[k][j]; } } }

 

· Сортировка массива методом "пузырька"

pr=1;

while (pr) {

pr=0;

for (i=0; i<n–1; i++) {

if (a[i]>a[i+1]) {

b = a[i];

a[i] = a[i+1];

a[i+1] = b;

pr = 1; } }

}

 

5.6 Управляемые переходы

5.6.1 Оператор break

 

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

Формат break;

Эквивалентная схема

for (e1; e2; e3) { for (e1; e2; e3) {

........................

if (e4) break; if (e4) goto exit;

........................

} }

................ exit:...

Пример:

Дано x[i], i=1...30. Найти длину 1–й подпоследовательности положительных элементов.

for (pr = kol = i = 0; i<30; i++) {

if (x[i] > 0) {

kol++;

pr = 1; }

if (x[i]<=0 && pr) break; }

 

 

5.6.2 Оператор continue

 

Формат continue

Эквивалентная схема

for (e1; e2; e3) { for (e1; e2; e3) {

........................

if (e4) continue; if (e4) goto next;

........................

} next:; }

 

ЗАМЕЧАНИЕ. Почти всегда можно обойтись.

 

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

if (a[i]<=0) continue; if (a[i]>0) { /* Обработка a[i]>0 */

/* Обработка a[i]>0 */ … } … } }

 

 

5.7 Оператор switch

 

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

Формат

switch (e) {

case c_e1: [<оператор_1>;][break;]

case c_e2: [<оператор_2>;][break;]

...................

case c_en: [<оператор_n>;][break;]

[default: <оператор_n+1>;]

}

Как работает эта конструкция? Как вы можете догадаться, она ищет строку "case значение_переменной_e" и исполняет участок кода от нее до конца блока switch или до зарезервированного слова break. Если соответствий не найдено, исполняется блок default.

Присутствие в формате break придает больше гибкости конструкции.

Еще одно замечание: в качестве меток case могут выступать только целочисленные константы. Поэтому если вам необходимо сравнивать значение с переменной или с дробной величиной - вам придется пользоваться конструкцией if.

На пример: switch (a) {

case 1: b = 5; // строка без break case 2: printf ("a = 1 или a = 2\n"); break; case 3: printf ("a = 3\n"); }

Как он будет себя вести? Если a = 1, то переменная b получит значение 5, а затем будет выведена строка "a = 1 или a = 2". Если же a = 2, то будет выведена так же строка. Таким образом, одно действие включает в себя другое, при этом в коде нет повторяющихся участков.

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

На пример: switch (a) { case 1: case 2: printf ("a = 1 или a = 2\n"); break; case 3: case 4: printf ("a = 3 или a = 4\n"); break; }

 

Пример:

switch (symb) {

case '+': <сложить>; break;

case '–': <вычесть>; break;

case '*': <умножить>; break;

case '/': <разделить>; break;

case '%': <найти остаток>; break;

default: <поместить в стек>; }

 

 

5.8 Основные операции с массивами и матрицами

 

1) Суммирование элементов одномерного массива a[i], i = 1,n.

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

s += a[i];

 

2) Суммирование элементов матрицы a[i][j], i,j = 1,n.

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

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

s += a[i][j]; }

 

3) Суммирование двух массивов (матриц) одинакового размера.

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

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

c[i][j] = a[i][j]+b[i][j]; }

 

4) Вычислить сумму элементов каждой строки матрицы b[i][j], размером nm. Результат записать в виде вектора d[i].

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

s=0;

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

s += b[i][j];

d[i]=s; }

 

5) Выполнить транспонирование матрицы а[i][j], т.е. заменить строки матрицы ее столбцами, а столбцы строками.

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

for (j=0; j<m; j++)

b[i][j] = a[j][i]; }

 

Для квадратной матрицы.

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

for (j=i+1; j<n; j++) {

p=a[i][j];

a[i][j]=a[j][i]; }

a[j][i] = p; }

 

6) Умножить матрицу а[i][j], размером nm, на матрицу b[i][j], размером km. Другими словами вычислить:

i=1,n; j=1,m;

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

for (j=0; j<m; j++) {

s=0;

for (l=0; l<k; l++)

s += a[i][j]*b[l][j];

}

c[i][j] = s }

 

8) Удалить k-й элемент из массива а[i], размером n.

i=k,n–1 –сдвигаем хвост массива на одну позицию влево.

n = n–1; /*n– –*/

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

a[i] = a[i+1];

 

9) Включить в k-ю позицию массива элемент.

i=n; n–1;…;k – передвигаем хвост массива на одну позицию вправо. Перемещение начинаем с конца, иначе весь хвост будет заполнен элементом a[k].

for (i=n; i>k; i– –)

a[i+1]=a[i];

a[k]=b;

n=n+1 /*n++*/

 

10) Включить в массив а[i], размером n элемент b. Сохранить упорядоченность массива по возрастанию.

i=0;

met: if (i>n) {

a[i+1] = b;

n=n+1; }

if (b >= a[i]) {

i = i+1;

goto met }

for (j=n; j>i; j– –)

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

a[i]=b;

n=n+1; /*n++*/

 

11) Удалить из матрицы строку с номером k.

n=n–1; /*n– –*/

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

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

b[i][j]=b[i+1][j]; }

 

12) Включить в матрицу строку, заданную вектором с[i].

for (i=n; i>k; i– –) {

for (j=1; j<m; j++)

b[i+1][j] = b[i][j]; }

for (j=0; j<m; j++)

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

n++;

 

13) Перестановка строк матрицы с номерами i и j с использованием вспомогательной переменная.

for (k=0; k<m; k++) {

p=a[i][k];

a[i][k]=a[j][k];

a[j][k]=p; }

Используется вспомогательный массив.

for (k=0; k<m; k++) {

c[k]=a[i][k];

for (k=0; k<m; k++) {

a[i][k]=a[j][k]; }

a[j][k]=c[k];


Глава 6. ВВОД – ВЫВОД данных

 

Ввод–вывод – это передача данных между переменными программы(ОП) и внешней памятью(ВП).

В Си предусмотрен только форматный обмен.

<stdio.h> – файл прототипа.

Ввод:

 

 

Вывод:

Буфер имеет конечный размер и считывание из него происходит только после нажатия клавиши <Enter>.

Формат основных функций

{scanf | printf}(<управляющая строка>[, <список_данных>]);

 

<управляющая строка>:= “[<произвольный текст>][<спецификации>]”

<список_данных>:= <имя_переменной> [, <имя_переменной> [, …] ]

 

Элементы списка данных scanf() – адреса переменных, значения которых задаются, поэтому необходимо использовать операцию &(нахождение адреса).

Возвращаемые значения: printf ()– число выводимых символов (байтов), scanf() – число введенных скалярных значений.

6.1 Управляющая строка

Содержит спецификации для функций ввода-вывода.

Формат ОДНОЙ спецификации

% [ <флаги> ] [W] [. D] [l] <тип>

% [признаки] [ширина_поля] [.точность ] [модификатор] с_n.

 

Флаги для printf (для scanf не используются):

– данное прижимается к левой границе поля вывода;

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

 

W – размер поля данного в символах (байтах).

D – обычно характеризует точность представления значения при выводе, ПРИ ВВОДЕ НЕ ИСПОЛЬЗУЕТСЯ (количество цифр, которые необходимо вывести справа от десятичной точки для типов float и double).

Модификаторы:

l – модификатор "длинных"(long для целых, double для чисел с плавающей точкой), указывает, что соответствующий элемент имеет тип long.

h – модификатор “коротких”, указывает, что соответствующий элемент имеет тип short int.

6.1.1 Спецификация d (целые десятичные цифры)

 

ВВОД Формат спецификации

% [W] [l] d

W – максимальное число считываемых символов.

l – модификатор для long.

Пример.

Внешнее представление Спецификация Значение в памяти
165<пробел> d  
+165<Enter> d  
  2 d  
  1 d  
  l d  
– 431921 4 l d – 431
+ 431921<пробел> 10 l d  

 

ВЫВОД Формат спецификации

% [<флаги>] [W] [.D] [l] d

D – минимальное число выводимых символов.

Пример.

Значение в памяти Спецификация Внешнее представление
  d  
  + d + 2475
  <пробел> d <пробел> 2475
– 2475 d –2475
– 2475 +d –2475
–2475 <пробел>d –2475
–2475 3d –2475
  10d _ _ _ _ _ _ 2475
  +10d _ _ _ _ _+2475
  –10d 2475_ _ _ _ _ _
  –+10d +2475_ _ _ _ _
  10.5d – – – – – 02475
–24 10.5d _ _ _ _ – 00012
–24 .5d –00024
  5.0d _ _ _ _ 3
–478126 10ld _ _ _–478126
–478126 –10ld –478126_ _ _
  +–10ld +478126_ _ _

 

6.1.2. Спецификация f (вещественные числа с плавающей точкой)

 

ВВОД Формат спецификации

% [W] [l] f

l – для double.

[ + | – ] [ a ] [.b ] [<порядок>]

Порядок – [ e | E ] [ + | – ] <целое без знака>

Длина мантиссы >= одной цифры.

Пример:

Внешнее представление Спецификация Значение в памяти
–2.347e–5 f –2.347 e–5
–236.485 f –2.36485e+2
2e10 f 2e10
.345 f 0.345
–2. F –2.0
–94.56e–5 lf –9.456e–4
–94.56e+5 lf –9.456e+6

 

ВЫВОД (нормальная форма)

Формат спецификации % [W] [.D] [l] f

D – число знаков после.

Внешнее представление: [–] X...X. X...

По умолчанию D = 6. При D = 0 точка не выводится.

Если число дробных разрядов > D, то результат округляется.

Пример.

Значение в памяти Спецификация Внешнее представление
–385.476 f –385.476000
2. f 2.000000
1e–7 f 0.000000
1e10 f 10000000000.000000
–385.476 10f –385.476000
385.476 10f 385.476000
385.476 15f _ _ _ _ _385.476000
-385.476 15f _ _ _ _-385.476000
2.5 10.4f _ _ _ _2.5000
–6.48756 10.4f _ _ _–6.4876
0.000346 10.5f _ _ _0.00035
–0.34844 6.4f –0.3484
38.56 .0f  
38.45 .0f  

 

6.1.3 Спецификация е (вещественные числа в экспоненциальной форме с плавающей точкой).

 

ВВОД Полностью аналогичен спецификации f.

ВЫВОД (показательная форма)

Формат спецификации % [W] [.D] [l] { e|E }

D – количество значащих цифр мантиссы.

По умолчанию D=6. При D=1 точка не выводится.

Внешнее представление: [–] X. X...{e|E}<порядок>

Пример.

Значение в памяти Спецификация Внешнее представление
2.3 e 2.30000e+00
2.3 5e 2.300000e+00
237.486 10.4 e 2.3749e+02
237.486 10.4E 2.3749E+02
–96.56e–105 15.5e –9.65600e–104
2.37e25 10.1e _ _ _2.4e+25
–24.866e–10 .4e –2.487e–09

 

 

6.1.4 Спецификация g.

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

D – число значащих цифр мантиссы. Конечные нули не выводятся.

 

Универсальный формат. f à при 10**(–4) <= |x| < 10**D

Пример.

Значение в памяти Спецификация Внешнее представление
0.000485456 .5g 0.00048546
0.000000123456 .5g 1.2346e–07
4.456789e–5 .5g 4.4568e–05
4.456789 .5g 4.4568
4.456 e 4 .5g  
4.456 e 6 .5g 4.456e+06
0.4456 .5g 0.4456
4.456 e6 .5G 4.456E+06

 

 

6.1.5 Вывод символьной информации.

ВВОД не рассматриваем (рассмотреть самостоятельно).

ВЫВОД: 2 способа.

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

Пример:

printf ("Число успешных сеансов составляет %d % % \n", kol);

printf("Рост: %.1f[см] Вес: %.3f[кг] \n", height, weight);

На экране

Число успешных сеансов составляет 72%

Рост: 181.5[см] Вес: 75.600[кг]

· Спецификация % [w] c – значением аргумента является символ.

Пример:

printf ("L = %d %5c M = %d \n", l, ' ', m);

На экране

L = 15– – – – –M = 12

 

 

6.2 Функции getchar(), putchar(), getch()

 

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

Прототип функции int getch (void); объявлен в файле <conio.h>).

Пример: char ch;

if ((ch = getch ()) = = 27) printf ("Вы нажали Escape\n");

В данном случае с клавиатуры читается один символ, заносится в переменную ch и проверяется на соответствие коду клавиши Esc (27) – и все это одним выражением.

Пример: char ch;

ch = getch();

printf(“Символ %c имеет код %d\n”, ch, ch);

 

 

2. Функция getchar () считывает очередной символ из стандартного входного потока (с клавиатуры) и копирует этот символ в стандартный выходной поток (на экран).

Прототип функции int getchar (void); объявлен в файле <conio.h>).

Пример: #include <stdio.h>

void main(void)

{ int c;

/* Note that getchar reads from stdin and is line buffered; this means it will not return until you press ENTER. */

while ((c = getchar())!= '\n')

printf("%c", c); }

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

 

3. Функция putchar() записывает символ в стандартный поток вывода (на экран).

Прототип функции int putchar (int c); объявлен в файле <conio.h>).

Пример: char ch;

printf ("Введите предложение")' while ((ch = getch ())! = '\n') putchar (ch);
10.8 Ввод – вывод массивов

 

Ввод двумерного массива

 

printf ("ВВОД МАССИВА \n");

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

for (j = 0; j < 10; j++) {

scanf (" %f", &a[i][j]);

}

}

Вывод двумерного массива

 

printf (" % 32c Исходный массив \n", ' '); /* строка напечатается посередине */

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

printf ("\n");

for(j = 0; j<10; j++) { /* по строкам */

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

}

}


Глава 7. Блоки и процедуры

7.1 Блоки

 

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

Такие объекты называют ЛОКАЛИЗОВАННЫМИ в блоке или просто ЛОКАЛЬНЫМИ данными. Блок выполняется в естественном порядке следования операторов.

<== предыдущая лекция | следующая лекция ==>
Логические бинарные операции | Заключительный пример
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 247; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.204 сек.