русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Массивы указателей


Дата добавления: 2013-12-23; просмотров: 1044; Нарушение авторских прав


Массив указателей — это такой массив, элементы которого являются указателями на другие объекты. Эти объекты, в свою очередь, могут быть указателями. Можно иметь массив указателей, которые ссылаются на другие указатели.

Концепция массива указателей на указатели широко используется для аргументов командной строки argc и argv.

Следующая программа находит наибольшее и наименьшее значение, введенное из командной строки. Аргументы командной строки могут быть только числами, перед которыми вводится команда, определяющая поиск наименьшего (-s,-S) или наибольшего значения (-l, -L).

#include <iostream.h>

#include <process.h> // exit()

#include <stdiib.h> // atoi()

#define IFIND_LARGEST 1

#define IFIND_SMALLEST 0

int main(int argc, char *argv[])

{

char *psz;

int ihow_many;

int iwhich_extreme=0;

int irange_boundary= 32767;

if(argc < 2) {

cout << "\nYou need to enter an -S,-s,-L,-i"

<< " and at least one integer value";

// Вам нужно ввести -S,-s,-L,-l и хотя бы одно число

exit(1);

}

while(--argc > 0 && (*++argv)[0] == '-') {

for(psz=argv[0]+1; *psz != '\0'; psz++) {

switch(*psz) {

case 's':

case 'S':

iwhich_extreme=IFIND_SMALLEST;

irange_boundary=32767;

break;

case 'l':

case 'L':

iwhich_extreme=IFIND_LARGEST;

irange_boundary=0;

break;

default:

cout << "unknown argument "<< *psz << endl; // неизвестный

exit(1); // аргумент

}

}

}

if(argc==0) {

cout << "Please enter at least one number\n";

// Введите хотя бы одно число

exit(1);

}

ihow_many=argc;

while (argc--) {

int present_value;

present_vaiue=atoi(*(argv++));

if(iwhich_extreme==IFIND_LARGEST && present_value > irange_boundary)



irange_boundary=present_value;

if(iwhich_extreme==IFIND_SMALLEST && present_value < irange boundary)

irange boundary=present_value;

}

cout << "The ";

cout << ((iwhich_extreme) ? "largest" : "smallest");

// Самое большее / меньшее

cout << " of the " << ihow many << " value(s) input is " <<

irange_boundary << endl;

// из . . . введенных значений является . . .

return(0);

}

Список возможных комбинаций команд:

10argcgv

10argcgv 98

10argcgv 98 21

10argcgv -s 98

10argcgv -S 98 21

10argcgv -1 14

10argcgv -L 14 67

argc — это целое число, равное количеству отдельных элементов или аргументов, появляющихся в командной строке. Переменная argv ссылается на массив указателей на символьные строки.

ПРИМЕЧАНИЕ

Переменная argv не является константой. Это переменная, значение которой можно изменять, и это является ключом к пониманию того, как она используется. Первый элемент массива, argv[0], является указателем на строку символов, которая содержит имя программы.

Первый оператор if анализирует значение argc, Если оно меньше двух, то это означает, что пользователь ввел только имя программы без каких бы то ни было ключей. Поскольку это означает, что пользователь не знаком с опциями ключей, то программа перечисляет на экране правильные опции и затем завершается (выполняется функция exit()).

В цикле while слева направо проверяются аргументы, при этом сначала декрементируется argc. Если значение argc остается положительным, то анализируется правая часть логического выражения.

Сначала в правой части этого логического выражения инкрементируется указатель массива argv (++argv), при этом пропускается первый элемент массива, то есть имя программы, и указатель ссылается на второй его элемент. После операции инкремента, указатель используется для ссылки (*++argv) на нулевое смещение ((*++argv)[0]) первого элемента адресуемой строки. Если полученный символ равен "-", то программа определяет, что далее, возможно, следует ключ, например, -s или -L.

Начальное значение цикла for определяется текущим значением указателя argv, который инкрементируется для ссылки на второй элемент массива. Поскольку второй элемент массива argv является указателем на символьную строку, этот указатель может иметь индекс (argv[0]), Полное выражение, argv[0]+l, указывает на второй символ второй строки, на которую ссылается текущий адрес, хранящийся в argv. Этот второй элемент следует непосредственно за символом командного ключа "-". После того, как программа вычислит адрес этого символа, она запоминает адрес в переменной psz. Цикл for повторяется до тех пор, пока символ, на который указывает *psz, не станет равным null.

Далее в программе анализируется ключ, указывающий на то, какое значение хочет получить пользователь: наименьшее или наибольшее. В зависимости от значения ключа, переменной iwhich_extreme присваивается значение соответствующей константы, в каждом операторе case инициализируется переменная irange_boundary, которой задается соответствующее значение для последующих сравнений. Если же пользователь ввел недопустимый ключ, например -d, то по опции default об этом выводится сообщение.

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

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

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

Функция atoi() преобразует каждый оставшийся аргумент в целое число и запоминает результат в переменной present_value ("текущее значение"). Чтобы цикл while не выполнялся, если в командной строке имеется только одно число, счетчик там уже декрементирован.

Следующие два оператора if обновляют переменную irange_boundary с учетом того, какое значение ищется по требованию пользователя: наименьшее или наибольшее. Печатается результат выполнения программы; при этом используется интересная комбинация строковых литералов и условной операции.




<== предыдущая лекция | следующая лекция ==>
Инициализация указателей | Прототипы функций


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.062 сек.