Программирование >>  Структурное программирование 

1 ... 90 91 92 [ 93 ] 94 95 96 ... 342


В нашем следующем примере (рис. 4.10) числа читаются из массива и графически представляются в форме таблицы полосок или гистограммы - печатается каждое число, а затем строка, содержащая столько же звездочек. Строки из звездочек рисуются с помощью вложенного цикла for. Обратите внимание на использование endl, чтобы закончить гистограмму.

который увеличивает элемент массива два. Если answer равен 2, responses[an-swer] равен 6, так что ++frequency[responses[answer]]; интерпретируется как оператор

++frequency[6] ;

который увеличивает элемент массива шесть и т.д. Заметим, что независимо от числа ответов, полученных в опросе, для суммирования результатов достаточно лишь массива с одиннадцатью элементами (при игнорировании элемента нуль). Если данные содержат неверные значения, такие как 13, программа будет пытаться прибавить 1 к frequency[13]. Это выходило бы за границы массива. C-f-l- не проверяет границ массивов, чтобы предупредить компьютер о ссылках на несуществующие элементы. Таким образом, выполняемая программа может выйти за пределы любого конца массива без предупреждения. Программист должен иметь гарантию, что все ссылки на массив находятся внутри границ массива. С-Ы- - гибкий язык. В главе 8 С-Ь-Ь будет расширен реализацией массива как определяемого пользователем типа с помощью классов. Наше новое определение массива позволит выполнять многие операции, которые не являются стандартом для массивов, встроенных в С-Ь-Ь. Например, мы сможем непосредственно сравнивать массивы, присваивать один массив другому, вводить и выводить массивы целиком с помощью cin и cout, автоматически присваивать массивам начальные значения, предотвращать доступ к элементам массива за границами массива и изменять диапазон индексов, так чтобы не требовалось, чтобы первый элемент массива был элемент 0.

Типичная ошибка программирования 4.6

Ссылка на элемент, находящийся вне границ массива.

Хороший стиль программирования 4.2

При использовании циклов с массивом индекс массива никогда не должен быть меньше нуля и должен всегда быть меньше, чем общее количество элементов массива (меньше, чем размер массива). Удостоверьтесь, что условия завершения цикла предотвращают обращение к элементам, выходящим за пределы этого диапазона.

Хороший стиль программирования 4.3

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

Замечание по мобильности 4.1

Эффекты (обычно серьезные) ссылок на элементы, выходящие за границы массива, сиаемно зависимы.



Программа печати гистограммы iinclude <iostream.h> Iinclude <iomanip.h>

main () {

const int arraySize = 10;

int n[arraySize ] = (19, 3, 15, 7, 11, 9, 13, 5, 17, 1};

cout << Элемент << setw (13) << Значение

<< setw (17) << Гистограм1ла << endl; for (int i = 0; i < arraySize ; i++) {

cout setw(7) i setw(13) n[i]

for (int j = 1; j <= n[i]; j++)

cout * ; cout << endl; }

return 0;

печать одной строки

Элемент О 1 2 3 4 5 6 7 8 9

Значение 19

3 15

7 11

9 13

5 17

Гистограмма

*******************

***************

*******

***********

*********

*************

*****

***************** *

Рис. 4.10. Программа печати гистограммы

В главе 3 мы обещали, что покажем более элегантный метод написания программы игры в кости, приведенной на рис. 3.8. Проблема заключалась в том, чтобы сделать 6000 бросков шестигранной кости для проверки, вырабатывает ли генератор случайных чисел действительно случайные числа. Вариант программы с использованием массивов показан на рис. 4.11.

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

Массиву символов можно задать начальные значения, используя литеральную константу. Например, объявление

char stringl[ ] = first ;

присваивает элементам массива stringl в качестве начальных значений отдельные символы строки first . Размер массива stringl в предыдущем объявлении, определяется компилятором на основе длины строки. Важно заметить, что строка first содержит пять символов плюс специальный символ оконча-



const int arraySize = 7;

int face, frequency[arraySize ] = (0};

srand(time(NULL));

for (int roll = 1; roll <= 6000; roll++) { face = randO % 6 + 1;

++frequency[face]; замена 20-строчного

оператора switch на рис. 3.10

cout << Грань setw(17) Частота << endl;

for (face = 1; face < arraySize ; face++) игнорируется

элемент О

cout << setw(4) << face

setw(17) frequency[face] << endl;

return 0;

Грань Частота

1 1037

2 987

3 1013

4 1028

5 952

6 983

Рис. 4.11. Программа бросания кости, использующая массивы вместо switch

ния строки, называемый нулевым символом. Таким образом, массив stringl на самом деле содержит шесть элементов. Нулевой символ представляется символьной константой \0. Все строки заканчиваются этим символом. Символьный массив, представляющий строку, должен всегда объявляться достаточно большим для того, чтобы в него можно было поместить количество символов в строке и завершающий нулевой символ.

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

char stringl[ ] = {f , i, г, s, t, \0}

Поскольку строка является массивом символов, мы можем получить доступ к отдельным символам строки, используя индексную запись массива. Например, stringl[0] - это символ f, а stringl[3] - это символ s.

Бросание шестигранной кости 6000 раз

iclude <iostream.h>

iclude <iomanip.h>

include <stdlib.h>

#include <time.h>



1 ... 90 91 92 [ 93 ] 94 95 96 ... 342

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика