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

  • Одномерные массивы

  • Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П


    Скачать 17.38 Mb.
    НазваниеБорис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
    АнкорMS Visual C.pdf
    Дата04.08.2018
    Размер17.38 Mb.
    Формат файлаpdf
    Имя файлаMS Visual C.pdf
    ТипДокументы
    #22453
    страница6 из 37
    1   2   3   4   5   6   7   8   9   ...   37
    Тип Размер памяти
    1 байт char
    , unsigned char
    , signed char
    1 байт short
    , unsigned short
    2 байта int
    , unsigned int
    4 байта
    8, 16, 32, 64 или 128 битов зависит от значения n
    ) long
    , unsigned long
    4 байта float
    4 байта double
    8 байтов long double1 8 байтов long long
    8 байтов
    Накапливать по единице мы можем в любой числовой переменной, а не только в переменной типа int
    . Для обеспечения цикличности ввода символов в этой программе использован оператор цикла for
    , работу которого мы ранее рассматривали.

    46 Часть
    I. Изучение языка С/С++
    В его заголовочной части имеются три выражения инициализирующее выражение (
    nc=0
    ) — в этом выражении задаются начальные значения переменных, которые будут участвовать в цикле (в нашем случае — переменная nc
    ); выражение, определяющее условие окончания цикла (
    getchar() !=eof
    ) — в нашем случае цикл окончится, когда будет введен символ конца файла, те. комбинация клавиш +; выражение, определяющее изменение переменной, по которой, как говорят, идет цикл" — в нашем случае Поскольку все удалось разместить в заголовочной части, тов телеоператора нет необходимости. Но формат оператора нужно соблюсти. Поэтому тело for все- таки задано, но задано так называемым "пустым оператором" — точкой с запятой, которая стоит сама по себе. Работа программы будет происходить так сначала сработает первое заголовочное выражение и переменная цикла nc обнулится. Затем начнет проверяться на истинность ложность второе заголовочное выражение. Но чтобы его проверить, надо выполнить функцию getchar()
    , те. нажать клавишу и ввести символ. Только после этого getchar()
    получит значение, и это значение будет сравниваться с признаком конца файла. Если проверяемое выражение истинно, то начнет выполняться тело оператора Поскольку оно пусто, то управление передастся на вычисление третьего заголовочного выражения nc++
    . Для одного введенного символа в nc добавится одна единица. После этого управление передастся на вычисление второго заголовочного выражения, те. придется ввести следующий символ, который будет проверенна признак конца файла. Если введенный символ не соответствует комбинации клавиш +, то снова будет выполняться тело и т. д. В конце концов, когда мы нажмем +, второе заголовочное выражение нарушится, и оператор for будет пропущен, управление передастся наследующий за телом for оператор. После этого начнет выполняться оператор вывода printf()
    . Мы привели в программе два таких оператора, чтобы показать различие в форматах вывода переменной типа double
    , которая всегда выдается по формату f
    . Если формат задан как
    %0.f
    , то дробная часть, которая является свойством чисел с плавающей точкой, будет отброшена и число выведется как целое. Если же задать формат в виде
    %f
    , не указав количество цифр в дробной части, то после точки выведется столько цифр, сколько определено по умолчанию. Рис 2.3. Результат работы программы листинга 2.4
    Глава
    2. Программы для работы с
    символьными данными Результат работы программы представлен на рис. 2.3. Отметим, что программа подсчитывает и вспомогательные символы. Подсчет количества строк в файле

    Строки файла строк в языке С разделяются символом
    \n
    , поэтому программа ввода строк с клавиатуры и подсчета их количества будет выглядеть так, как показано в листинге 2.5. Листинг 2.5

    // 2.5_2011.cpp
    #include "stdafx.h"
    #include для getchar(),putchar(),printf()
    #include для _getch() using namespace System;
    #define eof -1 признак конца файла int main()
    { int c,nl; nl=0; printf("Enter your string and press and >\n"); while((c=getchar()) !=eof) if(c=='\n')
    { nl++;
    } printf("String's number is: %d\n",nl);
    _getch();
    } Здесь новое по сравнению с предыдущими подобными программами только то, что появилась операция
    ==
    (равно) и новый оператор if
    — это оператор условного перехода, изменяющий последовательное (сверху вниз) выполнение операторов программы в зависимости от истинности/ложности условия (оно записывается вкруг- лых скобках в заголовочной части оператора и может представлять собой выражение. Если условие истинно, то выполняется тело оператора, которое обладает точно такими же свойствами, что и тела операторов while и for
    : если в теле всего один оператор, то этот оператор может не заключаться в фигурные скобки, в противном случае фигурные скобки обязательны. В нашем случае тело состоит из од
    Глава
    2. Программы для работы с
    символьными данными
    using namespace System;
    #define eof -1 признак конца файла
    #define yes 1 // для придания значения переменной in
    #define no 0 // для придания значения переменной in int main()
    { int c; для ввода символа int nc; для подсчета количества введенных символов int nl; счетчик строк int nw; счетчик слов int in; флажок слежения затем, находится ли в данный момент программа внутри слова или нет nc=nl=nw=0; обнуление счетчиков in=no; // до ввода находимся вне слова printf("Enter your strings and press >\n"); while((c=getchar()) !=eof)
    { if(c != '\n') если символ — не конец строки nc++; какой бы символ ни ввели (кроме Ctrl+z и '\n'), его надо учитывать в счетчике else иначе. (если введенный символ — конец строки) nl++; Здесь си поэтому сколько раз нажали
    , столько будет и строк if(c==' ' || c=='\n' || c=='\t') если символ хотя бы один из. in=no; сколько бы раз ни нажимали клавиши "пробел","конец строки, "табуляция, всегда будем находиться вне слова else if(in==no) сюда попадаем только тогда, когда нажали любую клавишу, кроме пробела, и конца строки
    { in=yes; если до этого мы были вне слова (in==no), то сейчас попали на начало слова nw++; и слово надо учесть в счетчике
    } else // иначе. если (in != no)
    ; эта часть выполняется, когда мы, находясь внутри слова (in !=no), ввели любой символ, кроме пробела, знака табуляции и знака конца строки. В этом случае подсчет слов не ведется, а программа возвращается на ввод следующего символа
    } // закрывающая скобка оператора while() printf("Strings.....=%d\n",nl); printf("Words......=%d\n",nw); printf("Characters..=%d\n",nc);
    _getch(); Вводит символ, но без эхо-сопровождения (задерживает отображение результатов расчетов на экране) */
    } закрывающая скобка функции main()

    50 Часть
    I. Изучение языка С/С++
    Весь ход работы программы ясен из подробных комментариев. Стоит обратить внимание на некоторые нововведения

    nc=nl=nw=0;
    Так можно писать, потому что операция "присвоить (=)" выполняется справа налево. Поэтому сначала выполнится nw=0
    , потом выражение уже равное нулю, затем выполнится nc=nl
    ; появился оператор else
    . Это необязательная часть оператора if
    . Если условие в скобках if ложно и нет части else
    , то тело оператора if не выполняется, а начинает работать следующий за if оператор. Если есть необязательная часть else и условие if ложно, то выполняется тело оператора else
    (тело else обладает такими же свойствами, как и тело if
    ). Если условие if истинно, то выполняется тело этого оператора, а оператор else пропускается появилась комбинация else if
    . Она работает точно также, как и оператор if
    : если в ее скобках условие выполняется, то выполняется ее тело, в противном случае тело пропускается появилась логическая операция
    ||
    (или, или операция дизъюнкции. Это бинарная операция, результат которой истинен, когда истинен хотя бы один из операндов. В противоположность ей существует бинарная логическая операция и, или операция конъюнкции. Ее результат истинен только тогда, когда оба операнда истинны. Если хотя бы один из них ложен, то ложен и результату последнего оператора else тело состоит из одного (пустого) оператора. Этот оператор else можно было бы опустить (он поставлен для более ясного понимания картины. Результат расчетов приведен на рис. 2.5. Рис 2.5. Результат работы программы листинга 2.6
    ГЛАВА Работа с массивами данных
    Одномерные массивы
    Создадим программу, которая вводит файл с клавиатуры и подсчитывает, сколько разв нем встречается каждая из цифр от 0 до 9. Если использовать тот опыт, который мы получили в предыдущих главах, то для составления такой программы нам потребуется объявить десять счетчиков, в каждом из которых станем накапливать данные о том, сколько раз встретилась каждая цифра. Первый счетчик — для накапливания данных о количестве имеющихся в файле нулей, второй — для единиц и т. д. А представим себе, что надо подсчитать количество каких-то объектов, которых, скажем, сто, и каждый может встречаться в файле разное количество раз. Надо было бы объявить сто счетчиков Это очень неудобно. Для нашей цели удобнее воспользоваться конструкцией языка C, которая называется "массив. Массив — это множество однотипных данных, объединенных под одним именем. Объявляется массив данных так тип данных в массиве имя массива количество элементов массива Последнее значение должно быть целым числом без знака. Например, массив из
    100 целых чисел можно объявить как int m[100]
    ; массив символов — как char Так как элементы массива располагаются в памяти последовательно друг за другом, то массив символов — это нечто иное, как строка символов. Причем в языке С принято, что у строки символов обязательно есть признак конца — символ с кодом
    \0
    . Если мысами формируем символьный массив, то сами же должны позаботиться, чтобы его последним элементом был символ
    \0
    , иначе такую строку, полученную с помощью массива, никогда не распознает ни одна стандартная программа. Как "доставать" элементы из описанной выше конструкции Если имеем, например, массив чисел int то любой его элемент — это m[i];
    , где i
    — номер элемента

    52 Часть
    I. Изучение языка С/С++
    Видим, что нумерация элементов начинается с нуля порядковый номер первого элемента массива — 0, второго — 1 и т. д. Порядковый номер элемента массива называют индексом. Элемент массива называют переменной с индексами. Если у такой переменной один индекс (в нашем случае именно таки есть, то массив таких переменных называют одномерным, если более одного индекса, то многомерным (двумерным, трехмерными т.д.). Часто количество индексов в массиве называют длиной массива
    или размер-
    ностью
    Чтобы массив инициализировать, те. придать его элементам какие-то значения, надо придать соответствующие значения каждому элементу массива. Если имеем массив int m[2];
    , то следует написать m[0]=1; Этот же эффект получим, если напишем int Для символьного массива char s[3];
    можно писать либо так s[0]='a'; s[1]='b'; либо так s[3]={ 'либо даже так В одинарных кавычках 'записывают символы, в двойных кавычках

    строки символов, потому что последний символ строки символов

    признак конца строки '\0'
    : когда мы пишем строку в двойных кавычках, компилятор поэтому признаку сам формирует признак конца строки

    символ '\0'. Поэтому 'это один символа "два символа собственно символ b и признак конца строки
    \
    0, сформированный компилятором, когда он распознал запись "Коль скоро мы заговорили о символах, то сделаем еще одно замечание. Если в переменной находится символ цифры (точнее — код цифры, то выражение сдает значение самого числа, код которого находится в Действительно таблица кодов ASCII построена так, что коды всех символов английского алфавита расположены в ней по возрастанию. За кодом нуля идет код единицы (те. разность между кодом нуля и кодом единицы равна единице. За кодом единицы следует код двойки. Разность между кодом двойки и кодом единицы тоже равна единице. Но разность между кодом двойки и кодом нуля равна двум и т. д. Следовательно, разность между кодом числа и кодом нуля равна числу оставим программу, подсчитывающую количество нулей в строке символов, количество единиц и т. д. Наша программа будет выглядеть так, как показано в листинге Глава
    3. Работа с массивами данных Листинг 3.1
    // 3.1_2011.cpp
    #include "stdafx.h"
    #include для getchar(),putchar(),printf()
    #include для _getch() using namespace System;
    #define eof -1 признак конца файла
    #define maxind 10 количество элементов массива int main()
    { int c; для ввода символа int nd[maxind]; для подсчета количества обнаруженных в файле цифр в nd[0] будет накапливаться количество встреченных нулей, в nd[1] — единиц, в nd[2] — двоек и т. д int i; for(i=0; i and >\n"); while((c=getchar()) !=eof) if(c >= '0' && c <= '9')
    ++nd[c-'0']; накопление в счетчике printf("Number of digits are:\n"); for(i=0; i _getch();
    } // от main() Оператором
    #define мы определили символическую константу maxind
    , с помощью которой задаем (и легко можем изменять) размерность массива nd[]
    , элементами которого мы воспользовались в качестве счетчиков. Признаком конца файла служит нажатие комбинации клавиш +. Вначале все счетчики (те. элементы массива) обнуляются, чтобы в них накапливать по единичке, если встретится соответствующая цифра. Обнуление происходит в цикле с помощью оператора Цикл завершится, если нарушится условие продолжения цикла номер элемента массива (им является значение переменной i
    ) станет равным количеству элементов. Максимальный индекс всегда на единицу меньше количества элементов массива, указанного при объявлении массива, т.
    к.
    нумерация элементов идет с нуля.
    Далее идет уже знакомый нам цикл ввода символов, в котором проверяется, входит ли код каждого введенного символа в диапазон кодов от нуля до девятки. Если код

    54 Часть
    I. Изучение языка С/С++
    введенного символа входит в диапазон кодов цифр, те. соответствует искомым цифрам, тов соответствующий элемент массива nd[]
    добавляется единица. Вспомним, что коды цифр идут по возрастанию, и что (поскольку коды

    это числа) мы можем выполнять над ними операцию "минус" или операции отношения (
    >, >=, <, <=,
    !=, ==
    ). Заметим, что тело оператора while содержит всего один оператор (
    if
    ), и потому не ограничено фигурными скобками. После обнаружения символа конца файла (комбинация клавиш +) происходит поэлементный вывод содержимого массива на устройство вывода. Здесь (также, как и при инициализации) организован цикл с помощью оператора for
    , телом которого является функция Результаты работы программы приведены на рис. 3.1. Рис 3.1. Результат работы программы листинга Многомерные массивы
    Массивы размерности большей, чем 1, объявляются также, как и одинарной размерности, но справа (в квадратных скобках) к объявленному количеству элементов одинарной размерности добавляется количество элементов для следующей размерности и т. д. Например, двумерный массив целых чисел объявляется как int В виде такого массива можно объявить прямоугольную матрицу чисел. Говорят, что это массив десяти строк чисел по 20 чисел в каждой строке или массив из десяти строки двадцати столбцов. Обращаться к элементам такого массива следует, указывая номера строки столбцов. Например m[3][8];
    int i=3,j=8,k;
    k=m[i][j];
    Глава
    3. Работа с массивами данных На примере двумерного массива покажем, как надо инициализировать такой массив (те. придавать его элементам начальные значения. Допустим, мы хотим составить программу расчета зарплаты работника. Для этой задачи нам понадобится справочник "Количество дней по каждому месяцу в високосном и невисокосном году. Такой справочник можно представить в виде двумерного массива int в котором элементами первой размерности будут две строки одна будет содержать данные по месяцам невисокосного года, а вторая — по месяцам високосного. Элементами второй размерности будет собственно количество дней в каждом из двенадцати месяцев. К тому же (т. к. элементы в массивах нумеруются с нуля) для удобства пользования нашим массивом введем еще один искусственный элемент, равный нулю, и поместим его на нулевое место во второй размерности. Это обеспечит более приемлемое обращение к массиву, т. к. не надо каждый раз помнить, что индексы массива идут с нуля. Например, величина m[2][2]
    будет тогда означать "количество дней високосного года в феврале. Массив можно записать int m[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
    0,31,29,31,30,31,30,31,31,30,31,30,31}; Можно объявлять не только числовые, но и символьные массивы (и не только такие — об этом мы узнаем в следующих главах. Например, символьный массив char s[20][50]; задает нечто иное, как массив из двадцати символьных строк, в каждой из которых по 50 символов. Переменное число символов в такой конструкции задать нельзя, т. к. нельзя будет определить положение элемента массива, которое вычисляется исходя из постоянного количества элементов в строках и столбцах.

    56 Часть
    I. Изучение языка С/С++
    ГЛАВА Создание и использование
    1   2   3   4   5   6   7   8   9   ...   37

    48 Часть
    I. Изучение языка С/С++
    ного оператора nl++
    , который выполняется всякий раз, когда введен не символ конца строки. В противном случае тело if не выполняется. Для простоты понимания мы ввели фигурные скобки там, где их можно опустить, выделяя тем самым тело оператора. Тело оператора while тоже состоит из одного оператора if
    (неважно, сколько операторов включает тело if
    ), поэтому оператор while записан без фигурных скобок. Программа работает так обнуляется счетчик количества вводимых строк (
    nl
    ), начинает выполняться оператор цикла while
    , обеспечивающий ввод с клавиатуры потока символов (вычисляется, как обычно, выражение в заголовочной части while
    , чтобы проверить условие на истинность/ложность, что требует нового ввода символа. Среди потока символов встречаются символы
    \n
    , сигнализирующие об окончании строки когда мы набираем строки в консольном окне, мы заканчиваем их ввод символом . Как только такой символ обнаруживается с помощью оператора, в счетчик nl
    , расположенный в теле if
    , добавляется единица. Когда после последней строки, завершающейся символом
    \n
    , мы нажмем комбинацию клавиш (символ конца ввода, ввод строк завершится. Условие выполнения оператора while нарушится, и управление будет передано на оператор, следующий за его телом. Это будет оператор вывода printf()
    . Результат работы программы представлен на рис. 2.4. Рис 2.4. Результат работы программы листинга Подсчет количества слов в файле

    Договоримся, что слово — это любая последовательность символов, не содержащая пробелов, символов табуляции (
    \t
    ) и новой строки (
    \n
    ). Наряду с количеством слов программа будет подсчитывать количество символов и строк. Текст программы приведен в листинге 2.6. Листинг 2.6
    // 2.6_2011.cpp
    #include "stdafx.h"
    #include для getchar(),putchar(), printf()
    #include для getch()


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