Искусство программирования на Си (984073), страница 52
Текст из файла (страница 52)
Однако при наличии функции, которые дают эаз обозначениях функций матричной библиотеки частичграммирования) является устранение ошибок. Попыта- мажнасгь безопасно осуществлять такие операции, прагеепгп 1евдсп взввассп"; но используются осмыслснныс названия Однако в матесмся установить значение ошибки, которое програмсаве ИОЬЬАДС: граммисг мажет отказаться ат самостоятельного выпал- мист может проверить (листинг )7.2). Это лгожно геввгв "ИОЬЬ агдввевв ! неких таких опасных задач.
магической литературе по матрицам очень распргктпанено использованис однобуквенных индексов типа ), ) и К, сделать с использованием статической переменной дегав1сг Какие специализированные подпрограммы ввода/ гесвгп ИОЬЬ! поэтому вполне естественно, что и в матричной библиопииеггсог)е, которую можно установить, переустановить вывода необхолимы для обеспечения целей матричной тскс используются такие жс однобуквенныс инлексьь или проверить с полюшью функций ш яе!Еег(), библиотски? Это функции для размсшсния структур зп геяе(гег() и еггсог)е().
Имеется также функция МАТК)Х Т, для запуска их из файлов, из одно- или ИНИцИаЛИЗацИя МатрИц ИЗ МаССИВОВ гп егппвеО, которая возврашаст строку описания злс двумерных массивов или лля того, чтобы приравнять пх Матричная библиотека имеет две функции для инициединичной матрице. Функции для вывода включают в ализации структуры М МАТК1Х из массивов; одну— себя функцию для распечатывания результатов в яЫоп( Использование статических переменных с областью види- гегвгп ввеггсоде! л:ш задания из одномерных массивов, а другую — из или для записи в файл значений в формате СзЧ (сопзп1амасти файла (типа пзп\еггсог)е) создает потенциальную ) лвумсрных массивов.
Как сказано ранее. внутреннее проблему. В этом случае имеется обычный способ аб- зсрага!сг) та)пез — значения, разделяемые запятой). представление лля одно- и двумерных массивов с одиработки требований па сохранению режима ошибки. Как называть (именовать) функции или псрсмсннзковым обшим количеством элементов — одно и то жс Проблема состоит е там, чта гзкае использование ста- ДрурИЕ ЛрИИцИЛц ЛрОьпКТИрОааИИЛ ныс? Как правило, общие функции имеют префикс из .
тических переменных не вызывает ошибок, если вы ка- Статические переменные имеют префикс шш. СтатичесВ результате функции для инициализации матриц из дируете потони. однако эта приводит к неправильному МатрИЧНОИ бИбЛИОТЮКИ ' двумерных массивов просто подсчитывают общее коликие функции называются описа~ельно, но нс имегот Дннаенитечьн»е тематические раздсе» Часть !П Код определения ошибок в этих функциях доволь- Синтаксический разбор данных строк н столбцов, а Листинг [7.5.
Разме ение и ини иали а азмещение и инициализация матрицы из файла. но типичен. Сдслайтс провсрку, чтобы убедиться, что также значений элементов данных проводится с помо- сваг * ни один из аргументов-указатслсй структуры шью функции в<Нойс из стандартной библиотеки. в Чегььае<РКЬК * Гр> М МАТ[(1Х нс имеет значения >Ч(>[Л.. Убелитесь такса ( жс, что количество строк и столбцов согласовывается с 11 <<<Четв(11ае, ЬКККЬКя, <р» аргументами. ввеггсоае = РКЬКККВПРМКН Функция а<Нов[) имеет репутацию довольно коварной гесагв кпььг функции, но для атой цели она подходит идеально. Син) Извлечение матрицы из файла .
таксичеснии разбор такой строки на отдельные поля однозначен,поскольку а данных нет пустык полей (зто одна гетега 11ле< Одной из наиболсс сложных операций является началь- из задач, с которои функция в<етой[) не спрааляется). ный ввол инициализированной структуры М МАТВ)Х Использоаание витой[) также делает код нереентерабепьиз файла.
Функция ш <псе() — это функция матрич- ным. Рекомендуем программистам, которым необкоди- КДКК1К К * ной библиотеки, предназначенная для размещения и ено проводить простои синтансическии разбор строк, ени- ° <лаиткгЬК и Кр> мательно прочитать документацию по функции з<Нок[). ( инициализации объектов М МАТ[<1Х из файлов.
Это, несмотря на ее плохую репутацию и ограничения, >ас з 1 гота со1а )лаев Довольно удобно, когда в фаилы данных встроены прекрасный инструмент для использования этой функции коммснтарии (для которых в этой главе используется а нормапьнык обстоятельствах.(что касается плохой рерасширснис .гав<). Комментарии — зто строки, которые путации, то причинами ее стали ситуации, сходные с тои, КЬГК11 К 'а; начинаются с символа в. Затем задаются данные мгн когда начинающий плотник говорит: чмолотки опасны. Я поранил палец, когда первый раз попытался аоспользо- /' Задать колвчество строк */ рицы на строкс, которая для чстырсхстрочной матриваться молотком".
Д попробуйте абить гвоздь без молот- > К ( <в ег1 а <1 » < С„л Матричнаяари4чечина т Глава <7 ; Язк' Матричнаяарифметииа Глава 17 (ог (1 = О; 1 < а->со1в1 З++) ( Орг1псу(гр, ава( , вер, а->иа1(впх(а,1,])])1 вер = сомма; ) Оргзпсу((р, )п ); )) передача */ ) ) геспгп а;) Дан илншн елин не тенет и челна е ра>)ели ЯЩ Часть и! 1пйех = 01 йог (з 01 з < гомвг 1++) ( Н (1в ОеСИпе(гр)) ( в угее1 геспгп ВОЬЬ; ) 11пергг = 11пе; 1ог (] = О; ) < со1в; 1++) ( И (1(Гок = агггок(Ипевсг, -,"))) ( в 1геез геспгп ВОЬЬО ) а->иа1(1поех] = асог(сой]1 1ппехл+1 Ипергг = ВЦЬЬ1 /* аРгумент ВОЬЬ переяается Запись объектов МАТЕ!Х Т в ийоне фунхява вггсой(] после первой Функция ш рппГГО принимает аргументы для надписей и для числового формата элементов, позволяя про1раммисту контролировать формат отображения данных.
Функция ш урц1саи менее гибка в этом отношении. Оги1 использует по умолчанию числовой формат %Е Если это нам неудобно, то данную функцию можно легко изменить. При этом в формате важно убирать лидирующис пробелы. Единственным недостатком этих ф>нкций является метод проверки того, что в рядах чисел нет лидирующих или замыкаюших запятых. Это дсластся с помошью прсдшсствуюшсй кажаому значе- нию строки аер (которая содержит либо сопппа, либо посопипа). Полная реализация суммирования и транспонирования В лнстингс ]7.7 показан пример кода для рсачизации суммирования и транспонирования матриц Часть !П авагтсос)а = ИОЬЬЛВО! гитиса ггапв; х — Д-зь гав а' — эза абоэзпзь мага чэ А Умножение матриц Дапашительние тематинесние раьйлы 11 (агапа->сова г= а->со1в) ( ввиггсопа " Всн1ВИАтсвз гегигп тгапв! ) 11 (Ггапв->со1в г= а->гома) ( аветгсоде ВСИ13илтсвэ гисигп Ггапв; ) тот (з - 0; з < а->гома! 1++) ( Тот (! = а; ) < а->со1в; )++) ( агапа->аа1[ак$х(става, ), з)! а->иа1[адх(а, з, 3)1! ) ) тстигп Ггапв ) Как предварительно было сказано, основныс опера Это рсшснис получено путем умножения обеих ча РИСУНОК 17.10.
Решение сисше.ни липеинмз рравнегша с использованием записи в форме маарив. Этот пример — пока только. мотивация. Он просто подготавливает вас к пониманию таких вешай, как умножение матриц и единичная матрица. На рис. 17.10 А — ато матрица 2х2, аз.и Ь вЂ” матрицы )х2 (или векторы).
Ранее рассмотренный мотивационный пример матрпч ного уравнения, изобра:кснный на рисунках 17.8 и 17 9 содср;кит опрсдслснис произвсдснпя матриц. Эзот пример демонстрирует умножснис матрицы А размером 2х2 на матрицу г размером 2х). Вообшс, произведение нс з(амриннан арифметика 8)файф Гп ва 17 7)истинг 17.8. Умножение матриц.
МАТВ1Х Т * в аир<илтв)Х т * ргос, Ната)к т * а, нлтвтх т * ь) ( <пт з, ), В; 11 (ргос) == ИЬЬЬ )! а == ИПЬЬ Ь == ВПЬЬ) < аавггсоде = ИПЬЬЛВСз гвгигп ргод! ) 11 (ртод->гома г= а->гома) аваггсааа = ВН<ВИЛтСВ гитиса ргос)! ) (ртсб->со1Б 1= Ь->со1а) ( ввиггсода = СИ1ВНЛТСВ! гстигп ргод! ) з( (а->со1Б 1= Ь->тоиз) ( ввеггсода = ВСН1ВИАТСВ гетитп ргод; Долил ниттьлые теиовичеекое ро<Ялы з Часп П! Мсстр но сстсствснным способом) будет таким, как показано на рис. 17.13. Надо замети~ь, что запись в матричной форме (или матричная нотация) иногда мохсст быть недостаточно наглядна, котла в ней фигурирует сдиничная матрица.
Например, если в предылушсм уравнении матрица А изображается как квадратная, то понятно, что единичная матрица )будет иметь такой жс размер, как и матрица А. Но если А нс квадратная, а, скажем, матрица шхп, то в матричной нотации прслполагастся, что ! в выражении Аl — это матрица пхп, в то время как 7 в выражении (А — это матрица <пхпь Это довольно сложно понять теоретически, а практически это просто означает, что сдиничная матрица может бьть любого разх<сра, который необходим для получения тождества. Чтобы сделать такую нотацию более точной (когда зто важно), можно использовать альтернативную запись, например 7 — для обозначения сдиничнои матрицы размером пхп.