Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язки программирования.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
2 Мб
Скачать

Лексемы

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

В ряде случаев лексемы могут быть поняты компилятором неверно, например, x–––y будет воспринято как (x––)–(y), а не как (x)–(––y).

Для исключения неоднозначности рекомендуется использовать скобки.

1.3.6. Комментарии

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

Формат комментария: /*-символ*/, например, /*Это комментарий */.

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

В C++ комментарий может начинаться значком //, а заканчиваться символом новой строки. Такой стиль комментария взят из языка BCPL, например,

// Это комментарий в языке C++

Комментарии – используются для документирования программы. // — далее все игнорируется до конца строки. /* Текст */ — в любом месте программы /* Строка 1 — для комментария любой длины строка 2 строка 3 */

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

/* комментарии к программе */

/* начало алгоритма */

или

/* комментарии можно записать в следующем виде, однако надо

быть осторожным, чтобы внутри последовательности, которая игнорируется компилятором,не попались операторы программы, которые также будут игнорироваться */

2 Условный оператор языка С. Привести примеры использования.

IF

Стандартная форма оператора if следующая: if (выражение) оператор; else оператор; где оператор может быть или простым, или составным. (Надо помнить, что в С составной оператор -это группа операторов, заключенных в фигурные скобки.) Оператор else не обязателен. Стандартная форма оператора if с составными операторами следующая: if (выражение) { последовательность операторов } else { последовательность операторов }

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

Рассмотрим следующую программу, являющуюся простейшим вариантом игры «угадай число». Она печатает сообщение «**Rignt**», когда игрок угадывает число. # inсlude <stdio.h > /* программа "угадай число" */ int main(void) { int magic = 123; /* искомое число */ int guess; printf ("Enter your guess: "); scanf ("%d", &guess); if (guess == magic) printf("** Right **"); return 0; } Программа использует оператор строгого равенства (==) для определения того, угадал игрок число или нет. Если угадал, то сообщение выводится на экран.

Рассмотрим следующую версию данной программы, иллюстрирующую использование оператора else для вывода сообщения о неправильном числе: #include <stdio.h> /* программа "угадай число 2" */ int main(void) { int magic = 123; /* искомое число */ int guess; printf("Enter your guess: "); scanf("%d",&guess); if (guess =  magic) printf("** Right..**"); else printf(".. Wrong .."); return 0; }

3)Операторы цикла языка С. Приведите примеры.

В С и других современных языках программирования циклы позволяют выполнять набор инструкций до тех пор, пока не выполнится некоторое условие.     В языке Си известны три вида операторов цикла: for, while, do-while. Рассмотрим подробнее каждый из указанных циклов. 

FOR

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

Стандартный вид цикла for следующий: for (инициализация; условие; увеличение) оператор; Оператор for имеет три главные части:

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

  2. Условие - это место, где находится выражение, определяющее условие работы цикла.

  3. Увеличение - это место, где определяется характер изменения переменной цикла на каждой итерации.

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

В нижеприведенном простом примере осуществляется вывод чисел от 1 до 100 включительно: #include <stdio.h> int main(void) { int x; for(x=1; x<=100; x++) printf("%d ", x); return 0; } В программе переменная x изначально установлена в 1. Поскольку х меньше 100, вызывается printf(), после чего х увеличивается на 1 и проверяется условие: по-прежнему ли х меньше либо равно 100. Данный процесс продолжается до тех пор, пока х не станет больше 100, и в этот момент цикл прервется. В данном примере х является переменной цикла, которая изменяется и проверяется на каждой итерации цикла.

Ниже приведен пример цикла for, повторяющего несколько операторов: for(x=100; х!=65; х-=5) { z = sqrt(х); printf("The square root of %d, %f", x, z) ; } Как sqrt(), так и printf(), вызываются и выполняются, пока х не равно 65. Обратим внимание, что в цикле переменная х уменьшается: сначала она получает значение 100 и на каждой итерации Цикла происходит уменьшение на 5.

Важно понять, что в цикле for проверка условия выполняется в самом начале. Это означает, что код в цикле может вообще не выполняться, если условие изначально ложно. Например: Х = 10; for (у = 10; у! =х; ++у) printf ("%d", у); printf("%d", у); Данный цикл никогда не выполняется, поскольку х и у равны между собой на момент начала цикла. Поскольку условие ложно, не выполняется ни тело цикла, ни часть увеличения. Следовательно, у по-прежнему будет содержать значение 10 и в результате вывода мы получим на экране число 10.

WHILE

Следующий итерационный оператор, доступный в С, - это while. Его стандартный вид следующий while (условие) оператор; где оператор - это или пустой, или простой, или составной оператор. Условием может любое выражение, имеющее в качестве истины ненулевое значение. Цикл выполняется, пока условие истинно. Когда условие становится ложным, выполняется строка, следующая за циклом. Следующий пример показывает процедуру, обрабатывающую ввод с клавиатуры, работающую пока не будет введен символ А: void wait_for_char(void) { char ch; ch = '\0'; /* инициализация ch */ while(ch!='A') ch = getchar (); } Сначала ch устанавливается в 0, Цикл while начинается с проверки ch на равенство А. Поскольку ch инициализировано нулем, проверка выдаст истину и цикл начнется. При каждом нажатии клавиши на клавиатуре условие проверяется повторно. Если введено А, условие становится ложным и цикл прекращается.

Как и цикл for, цикл while сначала выполняет проверку, то есть тело цикла может вообще не выполняться. Благодаря этому можно не выполнять отдельные проверки перед циклом. Хорошей иллюстрацией этого является функция pad(), добавляющая пробелы к концу строки до достижения предопределенной длины. Если строка уже имеет необходимую длину, то пробелы не будут добавляться: /* Добавляет пробелы к концу строки */ void pad (char *s, int length) { int l; l = strlen(s); /* определение длины */ while (l<length)  {   s[l] = ' '; /* вставка пробела */    l++;   } s [ l ] = '\0'; /* строки должны заканчиваться нулем */ } Аргументами pad() являются s - указатель на удлиняемую строку и length - желаемая длина s. Если строка s имеет длину, равную или больше length, то код внутри цикла не будет выполняться. Если длина строки s меньше чем length, то pad() добавляет требуемое число пробелов к строке. Функция strlen(), являющаяся частью стандартной библиотеки, возвращает длину строки.

Когда необходимо несколько различных условий для окончания цикла while, как правило, используют одну переменную, являющуюся результатом действия этих условий, причем значение этой переменной может устанавливаться в различных частях цикла. Например: void func1 (void) { int working; working = 1; /* т.е. истина */ while(working)  {   working=process1();    if(working)       working=process2();    if(working)       working=process3();   } } Здесь любая из трех подпрограмм может вернуть ложь и вызвать остановку цикла. В теле цикла может и не быть никаких операторов. Например: while ((ch = getchar()) != 'А'); просто зацикливается до тех пор, пока с клавиатуры не введется буква А. Если нет уверенности в использовании оператора присваивания внутри проверки выражения цикла while, надо помнить, что знак равенства на самом деле просто оператор, вычисляющий значение стоящего справа операнда.

DO/WHILE

В противоположность циклам for и while, сначала проверяющим условие, цикл do/while проверяет условие в конце. То есть, цикл do/while всегда выполняется, по крайней мере, один раз. Стандартный вид цикла do/while следующий: do { последовательность операторов; } while (условие);

Хотя в фигурных скобках нет необходимости при наличии одного оператора, они обычно используются для улучшения читабельности и устранения недоразумений (у читателя, а не у компилятора) по поводу цикла while. Данный цикл do/while осуществляет чтение чисел с клавиатуры до тех пор, пока одно из них не станет меньше либо равно 100: do { scanf ("%d", &num); } while (num > 100);

Возможно, наиболее типичным использованием цикла do/while является процедура выбора пунктов меню. Когда набран корректный ответ, она возвращает значение функции. Неправильный ответ приводит к повторному вводу. Следующий пример являет собой улучшенную версию меню программы проверки орфографии: void menu(void) { char ch; printf("1. Check Spellirig\n"); printf("2. Correct Spelling Errors\n"); printf("3. Display Spelling Errors\n"); printf("    Enter your choice: "); do { ch = getche(); /* чтение клавиатуры */ switch(ch)           { case '1' :      check_spelling ();    break; case '2' :      correct_errors ();    break; case '3' :      display_errors();     break;           }       }       while(ch!='1' && ch!='2' && ch!='3'); } В случае функции меню необходимо выполнить ее, по крайней мере, один раз. После отображения опций программа зацикливается до тех пор, пока не будет осуществлен корректный выбор.

Кроме того, существуют так же операторы завершения цикла, то есть выхода из цикла независимо от истинности условия выхода (в языке Си — break) и операторы пропуска итерации (в языке Си — continue).

4)Массивы в языке С. Объявление и инициализация. Привести примеры.