Главная страница
Навигация по странице:

  • 1.4 Базовые типы данных Языка Си

  • 1.4.2 Типизированные константы

  • 1.4.3.2 Вещественные типы

  • 1.4.6 Область видимости и время жизни переменных

  • 1.5 Основные операторы

  • День до сдачи работы мы справимся, и ты получишь Отлично по своему предмету! Только представь ты занимаешься своим любимым делом, пока твои лохиодногруппники теряют свои нервные клетки Проникнись Это бесценное ощущение Курсовая,


    Скачать 389.95 Kb.
    НазваниеДень до сдачи работы мы справимся, и ты получишь Отлично по своему предмету! Только представь ты занимаешься своим любимым делом, пока твои лохиодногруппники теряют свои нервные клетки Проникнись Это бесценное ощущение Курсовая,
    Дата04.07.2021
    Размер389.95 Kb.
    Формат файлаdocx
    Имя файлаUchebnoe_posobie_Osnovy_C.docx
    ТипРешение
    #223314
    страница3 из 9
    1   2   3   4   5   6   7   8   9

    1.3 Ввод-вывод

    Для решения задачи в какой-либо проблемной области необходимо написать программу, в которой должны быть команды, позволяющие:
    - выделять место для хранения данных;

    - вводить исходные данных;

    - обрабатывать исходные данные по алгоритму;

    - выводить выходные данные.

    Си содержит функции, необходимые для выполнения этих действий. Все функции будем рассматривать на примерах и начнем с функций ввода-вывода.
    1.3.1. Вывод

    Вывод осуществляется на экран, принтер, винчестер (гибкие диски), порт. Рассмотрим функции вывода на экран.

    Функция printf предназначена для этой цели. Формат: printf(<формат>[,аргумент1],...).

    Формат - это строка в двойных кавычках, которая выводится на экран. Перед выводом printf заменяет все объекты в строке в соответствии со спецификациями аргумента. Например, printf(" В %d М содержится %d cm\n", I,J); %d в строке формата - это спецификация аргумента.

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

    %d, используемое в спецификации, говорит о том, что ожидается некоторое целое число. Вот несколько других общеиспользуемых спецификаций формата:

    - %d целое число;

    - %u целое число без знака;

    - %ld длинное целое число;

    - %p значение указателя;

    - %f число с плавающей точкой;

    - %e число с плавающей точкой в экспоненциальной форме;

    - %c cимвол;

    - %s строка;

    - %x целое в шестнадцатеричном формате.

    Можно задать ширину поля, например %6d -поле шириной 6.

    Значение будет напечатано сдвинутым вправо (впереди пробелы), так что общая ширина поля равна 6.

    Для формата вещественных чисел можно указать дробную часть, например %8.4f - поле шириной 8, десятичная часть 4.

    В конце форматной строки можно поставить знаки:

    \n перевод строки;.

    \f (перевод формата или очистка экрана)

    \t (табуляция)

    \b (забой <-)

    \xhhh (вставка символа c кодом ASCII hhh, где hhh содержит от 1 до 3 16-ричных цифр)

    Для вывода можно использовать функции: puts и putchar.

    Функция puts выводит строку на экран. Например:

    #include

    main ()

    {

    puts("Привет, студент");

    }

    Функция putchar выводит на экран один символ.

    1.3.2 Ввод

    Ввод в Си в основном осуществляется с клавиатуры, из файла и порта.

    Функция scanf аналогична printf. Ее формат: scanf(<формата>[,аргумент1],...). В scanf используются те же спецификаторы формата, что и у функции printf. Необходимо отметить, что scanf имеет одну особенность: аргументы, следующие за строкой формата, должны быть адресами, а не значениями (это не распространяется на символьные переменные). Ранее в примерах мы видели, что при вводе целого числа записывалась функция следующим образом:

    scanf("%d", &a);

    & -операция адреса, которая передает scanf адреса.

    При вводе нескольких переменных через запятую можно использовать запятую внутри формата. Пример:

    scanf ("%d, %d", &a, &b);

    Теперь можно вводить, например 23,56.

    Имеются сложности с вводом строки символов из нескольких слов - введутся только данные до первого пробела. Для решения этой проблемы существует функция gets.

    #include

    main ()

    {

    char name [60];

    printf("Как вас зовут: ");

    gets (name);

    printf ("Привет, %s\n", name);

    }

    Функция gets читает все, что набирается до тех пор, пока не нажат Ввод.

    В С++ ввод-вывод может осуществляться не только с помощью функций, но и с помощью операций. Операция вывода << операция ввода >>.

    Формат вывода на экран:cout<< выражение.

    Формат ввода с клавиатуры:cin<< переменная.

    При использовании операций ввода-вывода необходимо включить в программу файл iostream.h.

    Пример:

    #include

    main()

    {

    int i;

    cout << "Целое число?: ";

    cin >> i;

    cout << " Квадрат числа: " << i*i << "\n";

    return 0;

    }

    Возможен ввод-вывод нескольких величин (через пробел).

    1.4 Базовые типы данных Языка Си

    1.4.1 Идентификаторы

    Имена, которые присваиваются константам, типам данных, переменным и функциям называются идентификаторами. В Си следующие правила создания идентификаторов: должны начинаться с буквы (a...z,A...Z) или с подчеркивания (_), остальная часть идентификатора должна состоять из букв, подчеркиваний и/или цифр(0...9).
    1.4.2 Типизированные константы

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

    Компилятор Си рассматривает буквы верхнего и нижнего регистра как различные символы.

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

    Константы представляются в виде целого десятичного, восьмиричного или шестнадцатиричного числа.

    Описание констант начинается с ключевого слова const, далее тип и значение, например const int Nalog=2.
    1.4.3 Переменные

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

    1.4.3.1 Целые типы

    Целые числа представляются целыми типами. Целый тип - это обобщенный тип, представление которого зависит от операционной системы и типа процессора.

    Рассмотрим основные типы целых чисел:


    Целый тип

    Размер

    Short int

    16 битовое целое

    Int

    16 битовое целое

    Unsigned long

    32 битовое целое без знака

    Long

    32 битовое целое


    Рассмотрим простой пример.

    #include

    #include

    main()

    {

    const int Nalog= 2;

    int Stavka;

    int Symma;

    int C;

    Stavka = 300;

    Symma = Stavka * Nalog;

    printf("Symma naloga = %d\n",Symma);

    C=getch();

    }

    В примере объявлены одна константа и две переменные целого типа.
    1.4.3.2 Вещественные типы

    Для хранения чисел с дробной частью используется вещественный тип.

    В C++ существуют следующие основные типы вещественных чисел:

    Вещественный тип

    Размер

    Float

    32 битовое плавающее число

    Double

    64 битовое плавающее число

    Long double

    80 битовое плавающее число


    Рассмотрим следующий пример.

    #include

    main()

    {

    const float Nalog= 0.7;

    int Stavka;

    float Symma;

    Stavka = 325;

    Symma = Stavka * Nalog;

    printf("Symma naloga = %8.4f\n",Symma);

    }

    В данном примере вещественный тип представлен переменной Symma.
    1.4.3.3 Символьные типы

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


    Символьный тип

    Размер

    Unsigner char

    8 бит без знака

    Char

    8 бит


    Рассмотрим пример:

    #include

    main()

    {

    char A;

    char B;

    char C;

    A = 'D';

    B = '!';

    printf("A= %c B= %c\n",A,B);

    C = '*';

    printf("C= %c\n",C);

    }

    В данном примере переменной A присвоено значение ‘D’, переменной B значение ‘!’, а переменной С присвоено значение символа ‘*’.
    1.4.4 Тип данных строка

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

    Рассмотрим пример.

    #include

    #include

    main()

    {

    char A[256]; /* длина может быть до 256 символов */

    char B[11];

    char C[24];

    strcpy(A,"IBM PC Pentium");

    strcpy(B,"Windows 95");

    strcpy(C,""); /* очистка переменной */ printf("A= %s\n",A);

    printf("B= %s\n",B);

    strcpy(C,B);

    printf("C= %s\n",C);

    }

    В данном примере представлены три строки символов A, B, C.

    По команде, например, strcpy (A,"IBM PC Pentium"); в строку A помещается текст IBM PC Pentium.

    Кроме рассмотренного примера, для определения строк можно использовать указатель на символы. Пример:

    #include

    #include

    main()

    {

    char *msg;

    msg = "Привет, студент";

    puts(msg);

    }

    Звездочка перед msg означает, что msg является указателем на символ - т.е. msg может хранить адрес символа. Однако, при этом память для размещения символов не выделяется.

    Команда msg = "Привет, студент " присваивает начальный адрес этой строки - (адрес символа П) переменной msg. Команда puts(msg) печатает символы до тех пор, пока она не встретит нулевой символ, обозначающий конец строки..
    1.4.5 Структуры

    Размещенная в памяти совокупность связанных между собой данных представляет структуру. В Си рассматриваются следующие структуры: массивы, записи и их комбинации.
    1.4.5.1 Массивы

    Именованная совокупность однородных данных называется массивом. Каждый элемент массива хранится в отдельной области памяти и имеет собственный номер (начиная с нуля).

    Рассмотрим пример.

    #include

    main()

    {

    int B[3];

    B[0] = 0;

    B[1] = 10; B[2] = 20; B[3] = 30;

    printf("B[0]= %d\n",B[0]);

    printf("B[1]= %d\n",B[1]);

    printf("B[2]= %d\n",B[2]);

    printf("B[3]= %d\n",B[3]);

    }

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

    Существуют многомерные массивы, например:

    int A[3][2];

    Массив A -двумерный массив ( состоит из четырех строк и трех столбцов):

    char A[3][3][3][3];

    Массив A - четырехмерный массив.

    Рассмотрим пример работы с двумерным массивом.

    #include

    main()

    {

    float B[4][3];

    B[0][0] = 0;

    B[1][1] = 1.1;

    B[2][1] = 1.2; B[3][1] = 1.3;

    B[1][2] = 2.1;

    B[2][2] = 2.2;

    B[3][2] = 2.3;

    printf("B[1,1]= %4.2f B[2,1]= %4.2f B[3,1]= %4.2f\n", B[1][1],B[2][1],B[3][1]);

    printf("B[1,2]= %4.2f B[2,2]= %4.2f B[3,2]= %4.2f\n", B[1][2],B[2][2],B[3][2]);

    }
    1.4.5.2 Записи

    В отличие от массивов запись позволяет хранить данные различных типов. Запись начинается после ключевого слова struct. Рассмотрим пример - в записи хранится информация о студентах: фамилия, год рождения, номер группы.

    #include

    #include

    typedef struct A {

    char Fio[31];

    int God;

    int Gruppa;

    };

    main()

    {

    struct A B;

    strcpy(B.Fio,"Ivanow G.I."); B.God = 1977;

    B.Gruppa = 384;

    printf("Fio = %s\n",B.Fio);

    printf("God = %d\n",B.God);

    printf("Gruppa = %d\n",B.Gruppa);

    }

    В рассмотренном примере запись имеет следующую структуру:

    struct A { /* A имя записи} */

    char Fio[31]; /* 1 поле записи */

    int God; /* 2 поле записи */

    int Gruppa; /* 3 поле записи */

    }

    Далее можем ввести структуру B аналогичную A по команде

    struct A B;

    Далее можем в поля помещать конкретные данные, но мы должны уточнить, что поля принадлежат переменной B нотацией с точкой (B.Fio:=”Ivanow G.I.”; и т.д.).

    С помощью ключа typedef структурам дается имя.

    Пример можно переписать следующим образом.

    #include

    #include

    typedef struct {

    char Fio[31];

    int God;

    int Gruppa;

    } A;

    main()

    {

    A B;

    strcpy(B.Fio,"Ivanow G.I.");

    B.God = 1977;

    B.Gruppa = 384;

    printf("Fio = %s\n",B.Fio);

    printf("God = %d\n",B.God);

    printf("Gruppa = %d\n",B.Gruppa);

    }

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

    #include

    #include

    typedef struct A {

    char Fio[31];

    int God;

    int Gruppa; };

    main()

    {

    A WGruppa[12];

    strcpy(WGruppa[1].Fio,"Ivanow G.I.");

    WGruppa[1].God = 1977;

    WGruppa[1].Gruppa = 384;

    strcpy(WGruppa[2].Fio,"Petrow R.G.");

    WGruppa[2].God = 1978;

    WGruppa[2].Gruppa = 384;

    printf("Fio1 = %s\n",WGruppa[1].Fio);

    printf("God1 = %d\n",WGruppa[1].God);

    printf("Gruppa1 = %d\n",WGruppa[1].Gruppa);

    printf("Fio2 = %s\n",WGruppa[2].Fio);

    printf("God2 = %d\n",WGruppa[2].God);

    printf("Gruppa2 = %d\n",WGruppa[2].Gruppa);

    }

    Первоначально мы определили структуру A, а затем использовали ее при объявлении структуры WGruppa, как массива состоящего из 12 записей структуры B.

    Теперь для адресации мы должны указать номер элемента массива и имя поля.

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

    #include

    #include

    typedef struct Adress {

    char City[31];

    char Street_Nd_Kw[61]; };

    typedef struct A {

    char Fio[31];

    int God;

    int Gruppa;

    Adress D_addr; };

    main()

    {

    A WGruppa[12];

    strcpy(WGruppa[1].Fio,"Ivanow G.I.");

    WGruppa[1].God = 1977;

    WGruppa[1].Gruppa = 384;

    strcpy(WGruppa[1].D_addr.City,"Shadrinsk"); strcpy(WGruppa[1].D_addr.Street_Nd_Kw,"Lenina 10 kw.1");

    strcpy(WGruppa[2].Fio,"Petrow R.G.");

    WGruppa[2].God = 1978;

    WGruppa[2].Gruppa = 384;

    strcpy(WGruppa[2].D_addr.City,"Kataisk"); strcpy(WGruppa[2].D_addr.Street_Nd_Kw,"Akulowa 1 kw.2");

    printf("Fio1 = %s\n",WGruppa[1].Fio);

    printf("God1 = %d\n",WGruppa[1].God);

    printf("Gruppa1 = %d\n",WGruppa[1].Gruppa);

    printf("City= %s\n",WGruppa[1].D_addr.City);

    printf("Street= %s\n",WGruppa[1].D_addr.Street_Nd_Kw);

    printf("Fio2 = %s\n",WGruppa[2].Fio);

    printf("God2 = %d\n",WGruppa[2].God);

    printf("Gruppa2 = %d\n",WGruppa[2].Gruppa);

    printf("City= %s\n",WGruppa[2].D_addr.City);

    printf("Street= %s\n",WGruppa[2].D_addr.Street_Nd_Kw);

    }
    1.4.6 Область видимости и время жизни переменных

    По области видимости переменные в Си можно разделить на три группы:

    1. Переменная, определенная во всех модулях (файлах) программы. Такая переменная определяется при помощи ключевого слова extern. Эта переменная будет видна во всех точках программы. Такая переменная является глобальной для всей программы.

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

    3. Переменная определенная в данной функции. Эта переменная может быть использована только в пределах данной функции. Такую переменную мы будем называть локальной.

    По времени жизни все переменные можно разделить на две группы:

    1. Переменные живущие в течении работы программы.

    2. Переменные уничтожающиеся после выхода из функции.

    Глобальные переменные относятся к первому типу по времени жизни. Локальные переменные уничтожаются по выходу из функции. В том случае, когда мы хотим сделать локальную переменную долгоживущей используется слово static. Локальные переменные имеющие такой тип живут начиная с момента первого вызова функции и до конца работы программы. Однако в смысле видимости эти переменные остаются локальными. Запись static int i=0; Означает, что переменная инициализируется нулем при первом входе в функцию, но при последующих входах в функцию ее значение сохраняется в зависимости от тех действий, которые над ней были произведены.

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

    И последнее замечание. Динамически выделенная память, где бы вы ее не выделяли живет до тех пор пока вы ее не освободили.
    1.5 Основные операторы
    Операция присваивания.

    Самой общей операцией является присваивание, например, с= a/b. В Си присваивание обозначается знаком равенства=, при этом значение справа от знака равенства присваивается переменной слева. Возможно, применять также последовательные присваивания, например: с = a = b.

    Арифметические операторы.

    В Си выполняются следующие группы арифметических операций:

    1.Бинарные: сложение(+), вычитание(-), умножение(*), деление(/), целочисленное деление(%) (для типа int получение остатка).

    2.Унарные: унарный плюс (+), унарный минус (-), адресация (&), косвенная адресация (*), определение размера памяти типа (sizeof).

    3.Логические: и (&&), или (!!), не (!=).

    4.Отношения:

    a)равно (==), не равно(!>);

    б) меньше чем (<), больше чем (>), меньше или равно (<=), больше или равно (>=);

    5.Приращения (++) и уменьшения (--). Например, i++ обозначает, что i=i+1, а i-- обозначает i=i-1.

    6.Побитовые операции - позволяют производить операции над битами.

    7.Комбинированные операции. В Турбо-Си существуют сокращения при написании выражений, содержащих многочисленные операции:

    a = a + b; сокращается до a += b;

    a = a - b; сокращается до a -= b;

    a = a * b; сокращается до a *= b;

    a = a / b; сокращается до a /= b;

    a = a % b; сокращается до a %= b;

    8.Адресные операции:

    1. Операция определения адреса (&) 2. Операция обращения по адресу (*).

    Операция & возвращает адрес данной переменной; если Х является переменной типа int, то &Х является адресом (расположения в памяти) этой переменной. С другой стороны, если msg является указателем на тип char, то *msg является символом, на который указывает msg. Рассмотрим пример:

    #include

    main()

    {

    int X;

    char *msg;

    X = 6 + 1;

    msg = "Привет\n";

    printf(" X = %d &X = %p \n",X,&X);

    printf("*msg = %c msg = %p \n", *msg, msg);

    }

    При печати в первой функции печатается два значения: значение X 7 и адрес X (назначаемый компилятором). Во второй функции также печатается два значения: символ, на который указывает msg (П), и значение msg, которое является адресом этого символа (также назначен компилятором).

    Старшинство операций в Си соответствует старшинству операций в математике.

    Оператор запятая.

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

    char X,Y;

    (X = Y, Y = getch())

    присваивает переменной X значение Y, затем считывает символ, вводимый с клавиатуры, и запоминает его в Y. Результатом всего выражения, в итоге, будет значение введенного с клавиатуры символа.

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

    Оператор If... дает возможность в зависимости от условия выполнять ту или иную ветвь программы. Синтаксис оператора следующий:

    If условие выражение1 else выражение2;

    Условие должно давать результат в виде логического значения истинности или ложности. Выражение1 будет выполняться если условие истинно. Выражение2 будет выполняться если условие ложно.

    Существует сокращенный вариант оператора:

    If условие выражение1

    Пример. Определить, является ли введенное число днем недели, т.е. входит ли число в диапазон от 1 до 7.

    #include

    int A;

    main()

    {

    printf("? ");

    scanf("%d",&A);

    if ((A < 1) || (A > 7))

    printf("Error %d\n",A);

    else printf("OK %d\n",A);

    }

    Выражение условия (A<1) || (A>7) будет давать TRUE, если выполняется A<1 или A>7 - в этом случае выполняется ветка printf('Error ',A);, иначе ветка printf('OK ',A);.

    Существует другой вариант записи оператора If ... Пример:

    #include

    main()

    {

    int y,t;

    printf("? ");

    scanf("%d",&t);

    y=(t>0)? t*10: t-10; /* if t>0 y=t*10 else y=t-10;*/

    printf("OK %d\n",y);

    }

    В данном варианте вид оператора показан в комментариях.

    Оператор switch... case используется в случае, когда необходимо анализировать переменную и в зависимости от ее значения производить те или иные действия. Рассмотрим пример. С клавиатуры вводятся буквы латинского алфавиты. В зависимости от буквы произвести те или иные действия.

    #include

    char A;

    main()

    {

    printf("? ");

    scanf("%c",&A);

    switch (A) {

    case 'c': printf(" smoll %c\n",A); break; /* выход из блока */

    case 'F':

    case 'G': printf(" big %c\n",A);

    break;

    default: printf("Error %c\n",A);

    }

    }

    В данном примере если введен символ с, то выполняется printf(" smoll %c\n",A);, если вводится заглавные буквы F или G, то выполняется printf(" big %c\n",A);, если не один из рассмотренных символов не вводится, то выполняется printf("Error %c\n",A);.

    Для повторения некоторого множества команд несколько раз можно использовать оператор do... while. Рассмотрим пример.

    #include

    main()

    {

    int A;

    do {

    printf("Zifra? ");

    scanf("%d",&A);

    printf("Error %d\n",A);

    } while (!(A == 9));

    printf("OK %d\n",A);

    }

    С клавиатуры вводится число. Выполняется оператор printf("Error %d\n",A);. Далее идет анализ - равно число 9 или нет, если не равно, снова выполняется тело цикла:

    printf("Zifra? ");

    scanf("%d",&A);

    printf("Error %d\n",A).

    Если число равно 9, то выполняется оператор printf("OK %d\n",A); и работа цикла заканчивается.

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

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

    Оператор while... в отличие от do... while вначале анализирует условие, а затем выполняет тело цикла.

    Пример.

    #include

    main()

    {

    int A;

    A = 0;

    while (A != 9)

    {

    printf("Zifra? ");

    scanf("%d",&A);

    printf("Error %d\n",A);

    }

    printf("OK %d\n",A);

    }

    В данном примере инициализирована переменная A:=0;. Это сделано, потому что вначале идет анализ равна она 9 или нет. Если не равна, то выполняется тело цикла. Смысл рассматриваемого оператора заключается в следующем:

    «Пока истинно условие выполняй тело цикла».

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

    #include

    int A;

    main()

    {

    for (A = 1; A <= 5; A++) /* A++ означает A=A-1 */

    printf("Zifra %d\n",A);

    }

    В этом примере A хранит состояние счетчика цикла. Первоначально A:=1. Выполняется оператор printf("Zifra %d\n",A). Далее значение A увеличивается на единицу. Идет анализ A<=5 или нет. Если A больше 5, то цикл заканчивает работу. Если нет, то снова выполняется оператор printf("Zifra %d\n",A).

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

    #include

    int A;

    main()

    {

    for (A = 5; A >= 1; A--) /* A-- означает A=A-1 */

    printf("Zifra %d\n",A);

    }

    Существует множество модификаций оператора for..., например:

    - пустой оператор - для временной задержки:

    for (n=1;n <=10000;n++)

    ; /* пустой оператор */

    - использование различного шага:

    for (n=1;n <=230;n=n+10)

    - изменение переменных:

    for (x=2;n*n <=476;n=5*x++)

    Рассмотрим пример, в котором инициализируются две переменные и каждая из которых, изменяется после итерации цикла:

    #include

    #define f 30

    #define n 19

    main()

    {

    int y,t;

    for (y = 1,t=f; y<=16; y++,t+=n) /*t+=n означает t=t+n*/ printf(" %3d %7d\n",y,t);

    }

    Далее рассмотрим, операторы ветвления (операторы перехода из одной части программы в другую).

    Оператор goto позволяет передавать управление на любую строку программы. Для этой цели используется метка. Пример.

    #include

    #include

    main()

    {

    char A;

    label_1:/* метка */ printf("? \n");

    cin>>A;

    if (A != 'y') goto label_1; }

    Для прерывания цикла по некоторому условию можно использовать оператор break. Пример.

    #include

    #include

    char A;

    int I;

    main()

    {

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

    {

    printf("? \n");

    cin >>A;

    i (A == 'y') break;

    }

    }

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

    #include

    #include

    char A;

    int I;

    main()

    {

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

    {

    printf("? \n");

    cin >>A;

    if (A == 'y') continue;

    printf("Работает %c\n",A);

    }

    }

    Для прерывания программы также используются операторы return() и exit().
    1.6. Препроцессор
    Препроцессор языка Си позволяет перед началом трансляции включать в программу фрагменты программ, написанных отдельно от основной.

    Директива #define.

    Директива #define может появляться в любом месте программы, а даваемое ею определение имеет силу от места до конца программы.

    #include

    #include

    #define TRI 3

    #define OTWET TRI*TRI

    #define OT printf("ОТВЕТ равен %d.\n",OTWET)

    #define jd cin >>C;

    main( )

    {

    int C;

    OT;

    jd;

    }

    После выполнения программы получится:

    ОТВЕТ равен 9

    В первой строке программы TRI - это макроопределение и оно равно 3, где 3 - строка замещения.

    Во второй строке макроопределение OTWET имеет строку замещения TRI*TRI и т.д. Каждая строка состоит из трех частей. Первой стоит директива #define, далее идет макроопределение. Макроопределение не должно содержать внутри себя пробелы. И, наконец, идет строка (называемая "строкой замещения"), которую представляет макроопределение. Когда препроцессор находит в программе одно из макроопределений, он заменяет его строкой замещения. Этот процесс прохождения от макроопределения до заключительной строки замещения называется "макрорасширением".

    Директива #include.

    Когда препроцессор "распознает" директиву #include, он ищет следующее за ней имя файла и включает его в текущую программу. Директива бывает в двух видах:

    #include имя файла в угловых скобках

    #include "my.h" имя файла в двойных кавычках

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

    Директивы: #undef, #ifdef, #else, #endif

    Эти директивы позволяют приостановить действие более ранних определений.

    Директива #undef отменяет самое последнее определение поименованного макроопределения.

    #define TRI 3

    #define F 5

    #undef TRI /* TRI теперь не определен */

    #define F 10 /* F переопределен как 10 */

    #undef F /* F снова равен 5 */

    #undef F /* F теперь не определен */

    Рассмотрим еще пример.

    #ifdef OTW

    #include "otw.h" /* выполнится, если OTW определен */

    #define ST 10

    #else

    #include "w.h" /* выполнится, если OTW не определен */

    #define ST 20

    #endif

    Директива ifdef сообщает, что если последующий идентификатор OTW определяется препроцессором, то выполняются все последующие директивы вплоть до первого появления #else или #endif. Когда в программе есть #else, то программа от #else до #endif будет выполняться, если идентификатор не определен.
    1.7 Программы. Функции
    Как мы рассматривали раньше, программа на Си имеет корневой сегмент, начинающийся с директив препроцессора и ключевого слова main.

    Далее идет собственно программа, начинающаяся с открывающейся фигурной скобки { и заканчивающаяся закрывающейся фигурной скобкой }.

    Часто используемые участки программы выделяются в функции. Каждая функция также начинается с директив препроцессора и имени и скобок { }.

    Рассмотрим пример программы рисования лестницы.

    #include

    main()

    {

    printf("|----|\n");

    printf("|----|\n");

    printf("|----|\n");

    }

    А теперь напишем эту программу с использованием функции Lestniza.

    #include

    Lestniza(void)

    {

    printf("|----|\n");

    }

    main()

    {

    Lestniza();

    Lestniza();

    Lestniza();

    }

    Как видно из программы, обращение к функции осуществляется три раза. Для преодоления этого недостатка переработаем программу и введем формальные и фактические аргументы:

    #include

    int C;

    Lestniza(int B)/* B - формальный аргумент */

    {

    int A;

    for (A = 1; A <= B; A++)

    printf("|----|\n");

    }

    main()

    {

    Lestniza(3); /* 3 -фактический аргумент */

    }

    В данной функции B является формальным аргументом (конечная величина оператора for to). Для присвоение ей конкретного значения используется фактический аргумент, который передается функции при ее вызове в основной программе.

    Если в функцию передается несколько параметров, то они должны передаваться в том порядке, в каком записаны в функции.

    Рассмотрим функции, возвращающее свое значение на примере возведения числа в квадрат.

    #include

    float Kwadrat(float A)

    {

    return A * A;

    }

    float B;

    main()

    {

    printf("? \n");

    scanf("%f",&B);

    printf("Kwadrat = %8.2f\n",Kwadrat(B));

    }

    Как видно из примера - имя функции Kwadrat - она вычисляет квадрат числа. В строке printf("Kwadrat = %8.2f\n",Kwadrat(B)); эта функция вызывается - на вход подается значение (введенное число), а в результате получаем результат - квадрат числа, который возвращается в программу по команде return.

    Рассмотрим еще один вариант работы с функцией, возвращающей значение без команды return.

    #include

    Kwadrat(float A, float *B)

    {

    *B = A * A;

    }

    float C, D;

    main()

    {

    printf("? \n");

    scanf("%f",&C);

    Kwadrat(C,&D);

    printf("Kwadrat = %8.2f\n",D);

    }
    1   2   3   4   5   6   7   8   9


    написать администратору сайта