Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Задача 4.2. Номер столбца из положительных элементов





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

 

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


Рис. 4.3. Блок-схема алгоритма решения задачи 4.2

 

Эта логика реализуется с помощью переменной-флага all_posit, которая перед началом просмотра каждого столбца устанавливается в значение true, а при нахождении отрицательного элемента «опрокидывается» в false. Если все элементы столбца положительны, флаг не опрокинется и останется истинным, что будет являться признаком присутствия в матрице искомого столбца.

 

Если столбец найден, просматривать матрицу дальше не имеет смысла, поэтому выполняется выход из цикла и вывод результата.

 

#include < iostream.h> #include < iomanip.h> int main () { int nrow, ncol; cout < < " Введите количество строк и столбцов: "; cin > > nrow > > ncol; // ввод размерности массива int i, j; int **a = new int *[nrow]; // выделение памяти под массив for (i = 0; i < nrow; i++) a[i] = new int [ncol]; cout < < " Введите элементы массива: " < < endl; for (i = 0; i < nrow; i++) for (j = 0; j < ncol; j++) cin > > a[i][j]; // ввод массива for (i = 0; i < nrow; i++) { for (j = 0; j < ncol; j++) cout < < setw(4) < < a[i][j] < < " "; cout < < endl; } int num = -1; bool all_posit; for (j = 0; j < ncol; j++) { // просмотр по столбцам all_posit = true; for (i = 0; i < nrow; i++) // анализ элементов столбца if (a[i][j] < 0) { all_posit < < false; break; } if (all_posit) { num = j; break; } } if (-1 == num) cout < < " Столбцов нет " < < endl; else cout < < " Номер столбца: " < < num < < endl; return 0; }

 

В программе необходимо предусмотреть случай, когда ни один столбец не удовлетворяет условию. Для этого переменной num, в которой будет храниться номер искомого столбца, присваивается начальное значение, не входящее в множество значений, допустимых для индекса, например -1. Перед выводом результата его значение анализируется1. Если оно после просмотра матрицы сохранилось неизменным, то есть осталось равным -1, то столбцов, удовлетворяющих заданному условию, в матрице нет.

 

Можно обойтись без анализа переменной num, да и вообще без этой переменной, если вывести номер столбца сразу после его определения, после чего завершить программу. Этот вариант приведен ниже. Заодно продемонстрированы простейшие способы работы с файлами.

 

СОВЕТ

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

 

 

#include < fstream.h> #include < iomanip.h> int main () { ifstream fin (" input.txt", ios:: in | ios:: nocreate); if (! fin) { cout < < " Файл input.txt не найден." < < endl; return 1; } ofstream fout (" output.txt "); if (! fout) { cout < < " Невозможно открыть файл для записи." < < endl; return 1; } int nrow. ncol; fin > > nrow > > ncol; int i, j; int **a = new int *[nrow]; for(i = 0; i < nrow; i++) a[i] = new int [ncol]; for(i = 0; i < nrow; i++) { for (j = 0; j < ncol; j++) fin > > a[i][j]; for (i = 0; i < nrow; i++) { for (j = 0; j < ncol; j++) fout < < setw(4) < < a[i][i] < < " "; fout < < endl; } bool all_posit; for (j = 0; j < ncol; j++) { all posit = true; for (i = 0; i < nrow; i++) if (a[i][j] < 0) { allj_posit = false: break; } if (all_posit) { fout < < " Номер столбца: " < < j; cout < < " Работа завершена" < < endl; return 0: } } fout < < " Столбцов нет "; cout < < " Работа завершена" < < endl; return 0; }

 

Ввод размерности массива и его элементов выполняется из файла input.txt, расположенного в том же каталоге, что и программа, а результаты выводятся в файл output.txt. В программе определены объект fin класса входных файловых потоков и объект fout класса выходных файловых потоков. Файловые потоки описаны в заголовочном файле < fstream.h>. Работа с этими объектами аналогична работе со стандартными объектами cin и cout, то есть можно пользоваться теми же операциями помещения в поток «и извлечения из потока».

 

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

 

ifstream fin(" c: \\prim\\cpp\\input.txt", ios:: in | ios:: nocreate);

 

После определения объектов проверяется успешность их создания. Это особенно важно делать для входных файлов, чтобы исключить вероятность ошибки в имени или местоположении файла. На следующем семинаре мы рассмотрим файловые потоки более подробно.

 

Если программа завершается успешно, то на экран выводится сообщение «Работа завершена». Благодаря этому пользователь вашей программы поймет, что она все же что-то сделала. Еще более гуманным было бы вывести дополнительное сообщение типа «Результаты смотрите в файле output.txt».

 

Входной файл input.txt можно создать в любом текстовом редакторе. Он, естественно, должен существовать до первого запуска программы. На расположение и формат исходных данных в файле никаких ограничений не накладывается.

 







Дата добавления: 2014-11-10; просмотров: 1007. Нарушение авторских прав; Мы поможем в написании вашей работы!




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


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...


Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...


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

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

Образование соседних чисел Фрагмент: Программная задача: показать образование числа 4 и числа 3 друг из друга...

Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...

ФАКТОРЫ, ВЛИЯЮЩИЕ НА ИЗНОС ДЕТАЛЕЙ, И МЕТОДЫ СНИЖЕНИИ СКОРОСТИ ИЗНАШИВАНИЯ Кроме названных причин разрушений и износов, знание которых можно использовать в системе технического обслуживания и ремонта машин для повышения их долговечности, немаловажное значение имеют знания о причинах разрушения деталей в результате старения...

Различие эмпиризма и рационализма Родоначальником эмпиризма стал английский философ Ф. Бэкон. Основной тезис эмпиризма гласит: в разуме нет ничего такого...

Индекс гингивита (PMA) (Schour, Massler, 1948) Для оценки тяжести гингивита (а в последующем и ре­гистрации динамики процесса) используют папиллярно-маргинально-альвеолярный индекс (РМА)...

Studopedia.info - Студопедия - 2014-2025 год . (0.01 сек.) русская версия | украинская версия