КАТЕГОРИИ: Архитектура-(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. Пример.
ВЫВОД Формат спецификации % [<флаги>] [W] [.D] [l] d D – минимальное число выводимых символов. Пример.
6.1.2. Спецификация f (вещественные числа с плавающей точкой)
ВВОД Формат спецификации % [W] [l] f l – для double. [ + | – ] [ a ] [.b ] [<порядок>] Порядок – [ e | E ] [ + | – ] <целое без знака> Длина мантиссы >= одной цифры. Пример:
ВЫВОД (нормальная форма) Формат спецификации % [W] [.D] [l] f D – число знаков после. Внешнее представление: [–] X...X. X... По умолчанию D = 6. При D = 0 точка не выводится. Если число дробных разрядов > D, то результат округляется. Пример.
6.1.3 Спецификация е (вещественные числа в экспоненциальной форме с плавающей точкой).
ВВОД Полностью аналогичен спецификации f. ВЫВОД (показательная форма) Формат спецификации % [W] [.D] [l] { e|E } D – количество значащих цифр мантиссы. По умолчанию D=6. При D=1 точка не выводится. Внешнее представление: [–] X. X...{e|E}<порядок> Пример.
6.1.4 Спецификация g. Спецификация используется как е и f, но исключает вывод незначащих нулей. Удобно, когда нельзя предсказать диапазон выводимых значений. D – число значащих цифр мантиссы. Конечные нули не выводятся.
Универсальный формат. f à при 10**(–4) <= |x| < 10**D Пример.
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; Просмотров: 267; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |