Структура программы на языке си
ЭЛЕМЕНТЫ ЯЗЫКА СИ
Под элементами языка понимается набор его базовых конструкций, используемых при написании программ.
Элементы языка Си:
1. АЛФАВИТ - это набор допустимых символов языка:
ü прописные и строчные латинские буквы (a-z, А-Z);
ü арабские цифры (0-9);
ü знаки пунктуации (. , , , ! , ‘ , “ , ; , ? );
ü специальные символы ( #, \, /, +, -, *, _, % и др.);
ü скобки: ( ), { }, [ ].
При формировании строковых и символьных данных можно использовать буквы русского алфавита. В текстах программ допускаются комментарии и пробелы.
Комментарии - это текст, поясняющий назначение переменных и действия программы. Комментарий ограничивается одним из двух способов:
а) /*Это комментарий*/ - может занимать несколько строк
б) // Это тоже комментарий - одна строка
Комментарии воспринимаются компилятором языка, как пробельные символы и игнорируются. Внутри комментариев нельзя использовать сочетание символов */, т.е. комментарии не могут быть вложенными.
Комментарии могут быть следующих видов:
1) после заголовка главной функции – общая информация о программе: ее назначение, входные данные и результаты, метод решения задачи, ФИО программиста, дата написания программы и т.д.;
2) если есть несколько функций, то комментарий должен быть для каждой из них; он может также определять начало и завершение определенной функционально законченной программы;
3) при объявлении данных функции – пояснения назначения используемых в ней переменных;
4) пояснения логически сложных частей программы, содержащих разветвления, циклы.
Однако количество комментариев не должно быть чрезмерным.
Буквы и цифры используются при формировании констант, меток, идентификаторов и ключевых слов.
2. ИДЕНТИФИКАТОРЫ - это последовательность латинских букв, цифр и символа подчеркивания, начинающаяся с буквы или символа подчеркивания. Идентификаторы могут иметь произвольную длину, но используются в программе только первые 32. В идентификаторе прописные и строчные буквы различаются, т.е. name, Name и NAME являются различными. Как правило, в языке Си в именах переменных используется только строчные буквы, а для именованных констант - заглавные.
3. КЛЮЧЕВЫЕ (служебные, зарезервированные) СЛОВА - это идентификаторы, которые имеют специальное значение для компилятора и не могут быть идентификаторами переменных и данных пользователя.
auto | автоматический | int | целое |
break | завершить | long | длинное |
case | вариант | register | регистровый |
char | символьный | return | возврат |
const | константа | short | короткий |
continue | продолжить | signed | знаковый |
default | по умолчанию | sizeof | размер |
do | выполнить | static | статический |
double | двойной точности | struct | структура |
else | иначе | switch | переключатель |
enum | перечисляемый | typedef | определение типа |
extern | внешний | union | объединение |
float | плавающее | unsigned | беззнаковый |
for | для | void | пустой |
goto | перейти | volatile | изменчивый |
if | если | while | пока |
4. МЕТКИ. Любой оператор в программе может быть помечен меткой. Метка ставится перед оператором и отделяется от него двоеточием. Метка в Си – это идентификатор. Метки, использованные в теле функции, локальны в ней. Область действия метки - функция. Поэтому в разных функциях можно использовать одинаковые метки.
Примеры меток: vvod, vivod, vhod
ВЫРАЖЕНИЯ
Основное назначение программы состоит в выполнении действий, необходимых для решения поставленной задачи. Решение любой задачи представляет собой процесс формирования результатов из заданных исходных данных. Правила формирования новых значений задаются с помощью выражений.
Во всех языках программирования под выражением подразумевается конструкция, составленная из операндов (констант, переменных, функций), операций и круглых скобок, с помощью которых можно задать требуемый порядок выполнения операций. Выражение определяет порядок вычисления некоторого значения.
В языке Си используются следующие типы выражений: арифметические, логические, условные и над адресами. Тип выражения определяется типом результата, то есть значением, которое формируется при выполнении последней операции выражения. Результатом выполнения выражения может быть значение одного из допустимых типов: арифметического (целого или вещественного) или символьного. Тип результата определяется как типом операндов, так и типом операций, выполненных над операндами.
Если есть вложенные скобки, то вычисление выражения начинается с самых внутренних скобок. Внутри скобок и если в выражении не используются круглые скобки, последовательность выполнения операций определяется с учетом относительного приоритета операций.
Все операции в Си разделены по приоритетам на 16 категорий. Операции одной категории имеют один и тот же приоритет.
Приоритет | Операция | Комментарий | Порядок выполнения |
(), [] | Скобки | ||
Все унарные (кроме постфиксных) | |||
++ | Увеличение операнда на единицу | ← | |
- - | Уменьшение операнда на единицу | ← | |
- | Изменение знака | ← | |
* | Определение значения по адресу | ← | |
& | Определение адреса | ← | |
! | Логическое отрицание | ← | |
~ | Поразрядное логическое отрицание** | ← | |
(тип) | Явное преобразование типа | ← | |
sizeof | Определение размера | ← | |
Бинарные арифметические | |||
* | Умножение | → | |
/ | Деление | → | |
% | Остаток от деления** | → | |
+ | Сложение | → | |
- | Вычитание | → | |
<< | Сдвиг влево** | → | |
>> | Сдвиг вправо** | → | |
< | Меньше | → | |
< = | Меньше или равно | → | |
> | Больше | → | |
> = | Больше или равно | → | |
== != | Равно Не равно | → → | |
Поразрядные операции | |||
& | Поразрядное И** | → | |
^ | Поразрядное исключающее ИЛИ** | → | |
| | Поразрядное ИЛИ** | → | |
Логические | |||
&& | Логическое И | → | |
|| | Логическое ИЛИ | ← | |
Условная | |||
? | Условная | → | |
Присваивание и постиксные бинарные | |||
= | Простое присваивание | ← | |
* = | Умножение с присваиванием | ← | |
/ = | Деление с присваиванием | ← | |
% = | Остаток от деления с присваиванием** | ← | |
+ = | Суммирование с присваиванием | ← | |
- = | Вычитание с присваиванием | ← | |
<< = | Сдвиг влево с присваиванием | ← | |
>> = | Сдвиг вправо с присваиванием | ← | |
Постфиксные унарные | |||
++ | Увеличение операнда на единицу | ← | |
- - | Уменьшение операнда на единицу | ← | |
Операция Запятая | |||
, | Последовательность выполнения | ← |
П р и м е ч а н и я:
** -операция определена только для данных целого типа;
→- порядок выполнения операции одного приоритета слева направо;
← -порядок выполнения одного приоритета справа налево
Последовательность вычисления функций в выражениях Си не задана.
Порядок вычисления выражения всегда можно отрегулировать скобками, их можно ставить сколько угодно, но здесь важно соблюдать золотую середину. При большом количестве скобок снижается наглядность выражения и легко ошибиться. Если выражение со скобками выглядит корректно, то компилятор может отследить только парность скобок, но не правильность их расстановки.
При рассмотрении выражений различных типов определяют по каждому типу:
- допустимые операции;
- стандартные функции, допустимые для данных определенного типа.
Арифметические выражения
Арифметические выражения – аналог алгебраических выражений математики. Они используются:
1) в операторах присваивания;
2) в качестве фактических параметров функций;
3) в операторах заголовка цикла.
Арифметические операции:
Операция | Назначение | Тип операнда | Тип результата |
+ | Плюс (сложение) | Целый, вещественный | Совпадает с типом операнда |
- | Унарный минус (вычитание) | Целый, вещественный | Совпадает с типом операнда |
* | Умножение | Целый, вещественный | В соответствии с иерархией типов |
/ | Деление | Целый, вещественный | В соответствии с иерархией типов |
% | Остаток от деления (деление по модулю) | Целый | Целый |
++ | Инкремент (увеличение на 1) | Целый, вещественный | Совпадает с типом операнда |
-- | Декремент (уменьшение на 1) | Целый, вещественный | Совпадает с типом операнда |
Приоритет: 1) ++, -- 2) – 3) *, /, % 4) +, -
Сложение, вычитание и умножение значений выполняются как обычно.
Операция «деление по модулю» применяется только к данным целого типа, знак совпадает со знаком первого из операндов.
Операция деления дает результат с плавающей точкой, если хотя бы один из операндов является вещественным, если оба операнда целые, то результат тоже будет целым - произойдет отбрасывание дробной части (аналогично функции DIV в Паскале).
Например:
5/2= 2 5/2.0=2.5 5.0/2=2.5 (13+6)/2*3=27
Пример:
Пусть дан фрагмент программы. Определить значения переменных.
int i=5,j=3,k,k1,k2;
float f1=2.5,f2=0.5,q,q1;
k=i+j;
k1=i/j;
k2=-i%j;
q=f1/f2;
q1=f1/i;
В одном выражении могут быть операнды различных типов. Если арифметическая операция выполняется над двумя операндами различных типов, то они сначала преобразуются к одному и тому же общему типу в соответствии со схемой иерархии типов, и результат выполнения операции будет того же типа. Схема иерархии типов определяет тип результата: это более высокий тип одного из двух операндов. Самый высокий тип операнда – double.
В арифметических выражениях операндами могут быть переменные целого типа и типа char, так как на машинном уровне и те, и другие имеют одинаковое целое представление. Поэтому для данных типа char применимы все операции, операндами которых могут быть целые int.
Double float
Long int char, short, enum
Функция вывода printf( )
Функция printf() (print format – форматная печать) осуществляет преобразование и печать данных в соответствии с указанным форматом представления данных.
Синтаксис записи:
printf ("формат", аргумент1,…,аргумент n);
где аргументы - это выводимые на печать значения, которые могут быть константами, переменными или выражениями. Список аргументов может отсутствовать.
формат - символьная строка, содержащая объекты трех типов:
обычные символы, которые просто копируются в выходной поток;
управляющие символы – влияют на расположение на экране выводимых знаков. Признаком управляющего символа является значок \ .
Функция ввода scanf()
Функция scanf( ) (форматный ввод) осуществляет ввод данных с клавиатуры и преобразование их во внутреннее представление в соответствии с типом величин.
Синтаксис записи:
scanf ("формат", аргумент 1,...,аргумент n);
Форматная строка и список аргументов присутствуют обязательно.
где аргументы – это перечень вводимых переменных, причем перед именеми каждой переменной обязательно указывается символ &(это знак операции «взятия адреса переменной»).
формат - символьная строка, которая может содержать символы трех типов:
1. Пробелы, символы табуляции, символ перехода на новую строку, которые компилятором игнорируются.
2. Обычные символы. В этом случае пользователь программы должен набрать на клавиатуре перед задаваемым значением указанную перед форматом последовательность исмволов, иначе ввод прекратится при первом же несовпадающем символе.
3. Спецификации преобразования – указывают необходимые преобразования вводимых данных для очередного аргумента.
В спецификации преобразования указывается символ % и символ преобразования.
Например:
scanf("%d%f",&a,&b);
Составить программу для ввода и вывода своего любимого числа и своего возраста.
#include <stdio.h>
main()
{
int chislo;
float voz;
рrintf ("Введите Ваше любимое число =>");
scanf ("%d",&chislo);
рrintf ("\nСколько Вам лет? ");
scanf ("%f",&voz);
рrintf("\nВам %4.1f лет",vоz);
printf("\nВаше любимое число %d",chislo);
}
ОПЕРАТОРЫ ЯЗЫКА СИ
Оператором в Си называют любое выражение, вслед за которым стоит точка с запятой. Операторы управляют процессом вычисления в программе и задают ход выполнения программ. Все операторы принято группировать в следующие классы: присваивания, вызов функции, ветвления и цикла. Отличительная особенность языка Си: присваивание реализовано не как оператор, а как операция.
ПУСТОЙ ОПЕРАТОР
Синтаксис оператора:
;
Оператор может появиться в любом месте программы, где по синтаксису требуется оператор. Выполнение пустого оператора не изменяет состояние программы.
Он может использоваться:
1) для установки метки (например, чтобы пометить закрывающуюся фигурную скобку составного оператора, который не является оператором, нужно поставить перед ней помеченный пустой оператор);
2) после ключевого слова else оператора if, вложенного в другой if, внешний по отношению к данному;
3) после оператора заголовка цикла, когда действия, которые должны быть выполнены в теле цикла, помещаются в заголовок цикла.
СОСТАВНОЙ ОПЕРАТОР
Составной оператор – это блок, ограниченный фигурными скобками. Он может содержать объявление переменных, которые будут действовать только в пределах этого блока, и выполняемые операторы любого типа (перед закрывающейся фигурной скобкой точку с запятой надо ставить обязательно).
Синтаксис оператора:
{
[объявление;]
[операторы;]
}
Используется в программе там, где по синтаксису требуется один оператор, а нужно выполнить несколько действий. Например, его можно использовать для ограничения операторов тела функции, для ограничения групп операторов в условных операторах и в операторах циклов.
В составном операторе могут быть другие составные операторы. Любой оператор внутри составного оператора может быть помечен меткой. Передача управления внутрь составного оператора возможна, но если составной оператор содержит объявление переменных и их инициализацию, то при входе в блок по метке, эта инициализация не будет выполнена, и значение переменных будет неопределено.
ОПЕРАТОР ПЕРЕХОДА
Оператор goto передает управление непосредственно на оператор, помеченный меткой.
Синтаксис оператора:
goto метка;
где метка – это идентификатор.
Например:
goto m1; …..
m1: a=b; …...
Область действия метки ограничивается функцией, которой она определена. Из этого следует: 1) каждая метка должна быть отлична от других меток той же самой функции; 2) нельзя передавать управление оператором goto в другую функцию.
Помеченный оператор выполняется сразу после выполнения оператора goto. Если оператор с данной меткой отсутствует или существует более одного оператора, помеченных одной и той же меткой, то это приводит к ошибочному результату.
Не рекомендуется переход внутрь операторов: составного, условного, варианта, цикла.
Для программирования ветвлений в языке Си используют условную
операцию ?, условный оператор if и оператор выбора варианта switch.
УСЛОВНЫЙ ОПЕРАТОР
Синтаксис оператора:
if (выражение) оператор1;
[else оператор2;]
где выражение – это некоторое условие, содержащее операции отношения и логические операции. Значение выражения приводится к целому и интерпретируется в соответствии с правилом: =0 – ложь, ¹0– истина. Выражение обязательно записывается в круглых скобках.
Перед ключевым словом else точка с запятой:
- ставится, если оператор 1 простой;
- не ставится, если оператор 1 – составной оператор.
Условный оператор служит для вычислений по одной из двух ветвей в зависимости от значения выражения. Сначала вычисляется выражение, и если оно истинно, то выполняется <оператор 1>, если ложно, то выполняется <оператор 2>, непосредственно следующий за ключевым словом else.
Если значение выражения ложно, а конструкция else отсутствует, то управление передается на оператор, следующий в программе за оператором if.
Например:
if (i>0)
y=x/i;
else { y=1;
i++; }
На месте оператора 1 и 2 может быть оператор if. В этом случае имеет место вложенный условный оператор.
Например:
if (x<100)
{ y=0;
z=5; }
else if (x<1000)
y=1;
else if (x<2000)
y=2;
else y=3;
При вложенности операторов if рекомендуется для ясности программы использовать фигурные скобки, ограничивающие операторы 1 и 2. Если фигурные скобки отсутствуют, то ключевое слово else будет относиться к ближайшему оператору if, у которого отсутствует конструкция else.
Пример 1. if (i>j) if (j>0) x=1; else x=2; /* else ассоциируется с внутренним if */ | Пример 2. if (i>j) { if (j>0) x=1; } else x=2; /* else ассоциируется с внешним if */ |
ОПЕРАТОР ВЫБОРА ВАРИАНТА
Синтаксис оператора:
switch (выражение целого или символьного типа)
{ case константное выражение 1: оператор1;[break;]
case константное выражение 2: оператор 2;[break;]
. . . . . . .
case константное выражение N: оператор N;[break;]
[default: оператор;]
}
Оператор switchслужит для выбора одного из нескольких вариантов; он проверяет совпадения значения выражения в скобках с одним из заданных константных выражений во всех вариантах caseи передаёт управление оператору, который соответствует значению какого-либо из выражений. Каждый вариант caseможет быть помечен целой или символьной постоянной или выражением. Операторы, связанные с меткой defaultвыполняются в том случае, если ни одна из констант не равна значению выражения. Вариант defaultнеобязательно указывать в операторе и не обязательно последним. Если ни одно из константных выражений не соответствует значению выражения и вариант defaultотсутствует, то оператор switch не выполняет никаких действий.
Ключевое слово caseвместе с константным выражением служит просто меткой. Если будут выполнены операторы для некоторого варианта, то далее выполняются операторы всех последующих вариантов до тех пор, пока не встретится оператор break. Это позволяет связать одну последовательность операторов с несколькими.
Если действия двух вариантов совпадают, то эти варианты могут быть объединены, в этом случае оператор switch имеет вид:
switch (выражение целого символьного типа)
{ case константное выражение 1:
case константное выражение 2: оператор1;[break;]
[default: оператор;]
}
ОПЕРАТОР РАЗРЫВА
Синтаксис оператора:
break;
Оператор разрыва прерывает выполнение операторов цикла или оператора switch, в которых он появляется. Управление передаётся оператору, следующему за прерванным оператором. Если операторы цикла вложены, то break вызывает непременное прекращение того цикла в котором он находится. Появление break вне перечисленных операторах приводит к ошибке.
ОПЕРАТОРЫ ЦИКЛА
Циклы используют в случае, если некоторые действия надо выполнить многократно, каждый раз с новыми данными. В Си имеются операторы цикла while, do while и for.
ОПЕРАТОР ПРОДОЛЖЕНИЯ
Синтаксис оператора:
continue;
Оператор продолжения может использоваться в операторах цикла, предназначен для перехода за последний оператор тела цикла, т.е. на корректировку параметров цикла for (вычисляется выражение приращения) или на анализ конца циклов while и dowhile(происходит вычисление условного выражения).
ОПЕРАТОР ЦИКЛА С ПАРАМЕТРОМ (С ШАГОМ)
Оператор цикла с параметром используется, если заранее известно начальное значение параметра (параметров) цикла, условие его завершения и коррекция – выражение (выражения) для изменения параметра (параметров) цикла.
Синтаксис оператора:
for ([начальное значение];[условное выражение];[выражение приращения])
оператор;
где
- начальное значение – список операторов, инициирующих начальные значения; выполняется один раз, до начала выполнения тела цикла; как правило, используется для установки начальных значений параметров цикла;
- условное выражение – список операторов и выражений для проверки конца цикла; конец цикла обычно определяется на основе анализа значения параметра цикла; выполняется перед каждым выполнением тела цикла; если значение последнего выражения истинно (≠0), тело цикла выполняется, а если ложно (=0) – завершается;
- выражение приращения – список операторов и (или) выражений для корректировки параметров цикла; выполняется после каждого выполнения тела цикла;
- оператор – простой или составной оператор тела цикла.
Правила выполнения цикла for:
1) производится вычисление начального выражения;
2) выполняется условное выражение и производится его оценка:
а) если оно истинно (≠0), то выполняется тело цикла;
б) если оно ложно (=0), то выполнение цикла завершается;
если оно ложно до первого выполнения тела цикла, то тело цикла не выполняется ни разу;
3) после выполнения тела цикла выполняется выражение приращения и осуществляется переход к п.2;
4) появление в любом месте тела цикла оператора continue дает переход к выполнению выражения приращения, т.е. к п.3;
5) появление в любом месте тела цикла оператора break вызывает переход к оператору, следующему после оператора цикла;
после выхода из цикла по оператору break или goto параметр цикла сохраняет значение, при котором произошло завершение выполнения цикла;
6) после нормального завершения цикла значение параметра цикла равно значению, которое привело к завершению выполнения цикла.
7) если начальное значение и (или) условное выражение отсутствуют, их ; должны остаться в операторе заголовка цикла;
Например:
for( ; ; ) for(i=1; ;i++) - бесконечныециклы, которые могут завершиться только при выполнении в его теле операторов break, goto, return.
Пример оператора цикла for:
for (i=0; i<10; i++)
c+=i;
С помощью сокращенной формы оператора forможно реализовать временную задержку процесса выполнения программы. Например, для ограничения времени ожидания ответа пользователя - for (n=1; n<=10000; n++);
Этот цикл считает значения nот 1до10000,ничего больше не делая. Символ ; после заголовка цикла – это пустой оператор.
Любой список заголовка может содержать оператор запятая, т.е. несколько операторов и выражений, разделенных запятыми, которые выполняются слева направо. Таким образом, оператор цикла for может иметь как бы несколько параметров цикла, изменяющихся одновременно. Чаще всего начальное выражение и выражение приращения – операторы присваивания или обращение к функциям (если их нет, то параметр цикла как бы не рассматривается); а условное выражение содержит выражение отношения или логическое выражение (если его нет (остается только ; ), то считается что условие проверки конца цикла истинно, при этом цикл не может быть завершен по условию конца цикла в заголовке цикла, а только по операторам break, goto, return.
ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ
Оператор цикла с предусловием (анализ конца цикла производится до выполнения операторов тела цикла) используется, когда количество повторений операторов тела цикла заранее не известно и определяется в процессе выполнения цикла.
Синтаксис оператора:
while (выражение)
оператор;
где
выражение – выражение любого типа;
оператор - простой или составной оператор тела цикла, он должен включать оператор изменения операндов логического выражения.
Вначале вычисляется выражение (условие), если оно истинно, то выполняется тело цикла, и выражение вычисляется снова; если ложно – тело цикла не выполняется. Цикл продолжается до тех пор, пока значение выражения не станет ложным и управление сразу передаётся следующему оператору. Если выражение ложно изначально, то тело цикла не будет выполнено ни разу.
Например:
i=20;
while (i>=1)
{x=i;
i - -;
}
МАССИВЫ В ЯЗЫКЕ СИ
Массив – это совокупность однотипных элементов, занимающих непрерывную область памяти.Элементы массива образуют последовательность, упорядоченную по номерам их элементов. С массивом связаны следующие его свойства: имя, тип, размерность.
Синтаксис объявления массива:
тип_элементов имя_массива [константное_выражение];
где
константное выражение определяет размер массива, т.е количество элементов массива. Например:
1) int a[10];
объявлен одномерный массив с именем a, содержащий 10 элементов целого типа.
2) float b[3][3]
объявлен двумерный массив b, состоящий из 3 строк и 3 столбцов, т.е.
из 9 элементов вещественного типа.
В отличие от языка Паскаль в языке Си нельзя определять произвольные диапазоны для индексов. Размер массива, указанный в объявлении, всегда на единицу больше максимального значения индекса.
Для обращения к элементам массива используется имя массива, после которого в квадратных скобках стоит индекс в виде выражения определяющего значение индекса - порядкового номера элементов массива. Индексов в квадратных скобках может быть столько, сколько измерений в массиве. Каждый индекс указывается в своих скобках. Значения индекса должны лежать в диапазоне от 0 до величины на единицу меньшей, чем размер массива указанный при его объявлении.
Например: a[0], а[1], а[2], а[3], а[4], а[5], а[6], а[7], а[8], а[9].
b[0][0], b[0][1], …, b[3][3]
В памяти элементы массива располагаются так, что при переходе от элемента к элементу наиболее быстро меняется самый правый индекс массива. Т.е. матрица располагается в памяти по строкам. Между элементами массива в памяти разрывыф отсутствуют. Операций над массивами в Си нет. Пересылка элементов одного массива в другой может быть реализована только поэлементно, с помощью цикла. Над элементами массива допускаются те же операции, что и над скалярными переменными того же типа. Форматный ввод-вывод значений элементов массива можно производить только поэлементно.
Пример 1. Ввод с клавиатуры и вывод на экран одномерного массива.
while(1)//открытие беск.цикла для проверки размерности
{
printf("Ведите размерность вектора:");
scanf("%d",&r);
if((r>0)&&(r<=R)) break;
printf("Размерность вне диапазона,повторите ввод\n");
} //закрытие беск.цикла для проверки размерности
printf("\n\t Введите вектор\n");// ввод вектора
for(i=0;i<r;i++)
{
printf("a[%d]=>",i);
scanf("%f",&a[i]);
} //конец ввода вектора
printf("\n\t Исходный вектор \n");//вывод вектора
for(i=0;i<r;i++)
printf("%5.2f",a[i]);
printf("\n");//конец вывода вектора
Пример 2. Ввод с клавиатуры и вывод на экран двумерного массива.
while(1)
{
printf("Введите размерность матрицы по строкам:");
scanf("%d",&ri);
if ((ri>0)&&(ri<=R)) break;
printf("Размерность вне диапазона, повторите ввод\n");
}
while(1)
{
printf("Введите размерность матрицы по столбцам:");
scanf("%d",&rj);
if ((rj>0)&&(rj<=R)) break;
printf("Размерность вне диапазона, повторите ввод\n");
}
printf("\n\t Введите матрицу\n");
for(i=0;i<ri;i++)
for(j=0;j<rj;j++)
{
printf("a[%d][%d]=> ",i,j);
scanf("%f",&a[i][j]);
}
printf("\n\t Исходная матрица \n");
for(i=0;i<ri;i++)
{
for(j=0;j<rj;j++)
printf("%5.2f ",a[i][j]);
printf("\n");
}
При объявлении массива можно указывать инициализацию массива, т.е присвоить значение каждому элементу массива.
Например:
float a[5] = {1, 0.5, 3, 2.1, 6};
int b[2][2] = {1,2,3,4}
int m[6] = {5, 3, 2}; - будет создан массив из шести элементов. Первые три элемента получат инициализированные значения. Значения остальных будут либо неопределенными, либо разны нулю, если массив внешний или статический.
Размер массива может не указываться, если при объявлении производится инициализация значений элементов.
Например: int p[] = {2, 4, 6, 10, 1};
Строки (СИМВОЛЬНЫЕ МАССИВЫ)
В языке Си нет специально определенного строкового типа данных (как в Паскале). Символьные строки организуются, как массивы символов, т.о. на длину строки в Си нет ограничения. В этом состоит их важное преимущество перед строками в Паскале, где размер строки не может превышать 255.
Каждый символ строки хранится в отдельном байте ОП. В конце каждой строки компилятор помещает нулевой символ \0 (null – в явном виде он не отображается), поэтому каждая строка занимает на 1 байт ОП больше, чем символы в строке. По этой же причине строка, содержащая один символ, не совпадает с символьной константой.
Строка– это последовательность символов, заключенных в кавычки. Строка может содержать любые символы алфавита, кроме кавычек, символа \ и символа конца строки \n (переход на новую строку). Для размещения в строке данных символов необходимо перед ними разместить символ \ .
Например: “Он сказал: \”Привет!\””
Каждая строковая константа, даже если она идентична другой строковой константе, сохраняется в отдельном месте памяти.
Если две строковые константы записаны одна за другой, то во время компиляции компилятор объединяет их:
“Hello, “, “Friends” => “Hello, Friends”
Такой механизм предоставляет удобное средство для записи длинных строковых констант.
Строка описывается, как символьный массив.
Синтаксис описания:
char имя строки [максимальный размер];
например: char str[20];
Одновременно с описанием строка может инициализироваться. Возможны два способа инициализации строки:
1) с помощью строковой константы (последовательности символов, заключенной в кавычки):
При таком способе инициализации в конце строки компилятор сам ставит символ \0.
char s[10] = “строка”; - начальное значение задавать необязательно
под строку s будет выделено 10 байт памяти, из них первые 7 получат значения при инициализации (седьмой – нулевой символ).
char s[] = ”строка”; -начальное значение обязательно
будет сформирована строка s из 7 символов.
2) в виде списка символов (элементов массива):
char s[10] = {‘c’,‘т’,’р’,’о’,’к’,’а’,‘\0’}; -описание равнозначно первому.
Символьный массив можно определить без нулевого символа в конце:
char s[10] = {‘c’,‘т’,’р’,’о’,’к’,’а’};
но это приведет к проблемам с обработкой такой строки, так как будет отсутствовать ориентир на ее окончание.
Отдельные символы строки идентифицируются индексированными именами, например: s[0]=’c’, s[5]=’a’
Инициализация двумерного символьного массива строками:
char b[4][30]=Тексты в кавычках эквивалентны
{скобочной записи:
“Результаты сессии”,{{…},{…},…};
“_________________”,
“ ФИО | Оценки “,
“ ________________”
};
Ввод-вывод символьных строк
Прототипы функций находятся в библиотеке стандартного ввода-вывода stdio.h.
gets(); Аргументом функций указывается имя строки. | чтение строки, введенной с клавиатуры Функция gets() читает строку из стандартного потока ввода stdin (высокоуровневый ввод-вывод) и помещает её по адресу, задаваемому параметром функции. Ввод строки заканчивается при обнаружении символа новой строки \n, который заменяется на нулевой символ \0. |
puts(); Аргументом функций указывается имя строки. | вывод строки на экран Функцияputs() записывает строку, адрес которой определяется значением параметра в круглых скобках, в стандартный поток вывода stdout. При выводе, завершающий \0 заменяется символом новой строки, то есть после вывода строки на экран курсор переходит в начало следующей строки. |
getchar(); getc(); | ввод одного символа с клавиатуры Например: ch = getchar (); присваивание переменной символьного типа ch очередного символа, полученного из стандартного ввода. |
putchar(); putc(); | вывод одного символа на экран Например: putchar (ch); выводит символ ch на экран. |
getch(); | ввод одного символа с клавиатуры без отображения его на экране |
Пример: Ввести с клавиатуры строку символов и вывести ее на печать.
1 способ. | 2 способ. |
# include <stdio.h> void main() { char str[100]; printf("Введите строку:\n"); gets(str); printf("Введенная строка\n "); puts(str); } | # include <stdio.h> void main() { char str[100]; printf("Введите строку:\n"); scanf("%s", &str); printf("Введенная строка\n "); printf("%s\n", str); } |
Ввод и вывод строки можно оформить в цикле:
3 способ. | 4 способ. |
# include <stdio.h> void main() { char str[100]; int i; printf("Введите строку:\n"); for(i=0; i<10; i++) str[i]=getchar(); printf("Введенная строка\n "); for(i=0; i<10; i++) putсhar(str[i]); } | # include <stdio.h> void main() { char str[100]; int i; printf("Введите строку:\n"); for(i=0; i<10; i++) scanf(“%c”, &str[i]); printf("Введенная строка\n "); for(i=0; i<10; i++) printf(“%c”, str[i]); } |
ОБРАБОТКА СТРОК
Обработка строк обычно связана с перебором всех символов от начала до конца. Признаком конца такого перебора является обнаружение нулевого символа.
При манипулировании со строками система не контролирует выход фактической длины строки за пределы максимально допустимого размера, задаваемого при описании. В случае ошибки дополнительные символы будут записаны поверх информации, которая располагается вслед за полем, отведенном для строки.
Для избегания ошибки рекомендуется следить за выходом строки за предусмотренные пределы, вводя достаточные размеры строк при их описании.
Для использования функций обработки строк необходимо подключить в программе библиотеку string.h (и stdlib.h).
Функция | Назначение | Тип возвращаемого результата |
strlen(str); | Определение длины строки str (завершающий символ \0 не учитывается). | int |
strrev(str); | Инвертирование (реверс, переворот) строки str. | сhar |