Základné triedenie a práca so súborom v C++
STU Bratislava, Fakulta Elektrotechniky a Informatiky
Predmet: Alagoritizácia a Programovanie
Zadanie: Zo súboru načítajte dve matice a na obrazovku vypíšte ich súčet, rozdiel a súčin. Formát vstupného súboru:
44 303312 521854 24-15118 94-71 43 303312 521854 24-15118
Prvý riadok obsahuje dve čísla: N a M, rozmery matice, prvé číslo obsahuje počet riadkov, druhé počet stĺpcov. Ďalších N riadkov obsahuje práve M čísel, hodnôt na daných súradniciach PRVEJ matice. Nasleduje rozmer druhej matice a jej dáta v rovnakom formáte ako to bolo pri prvej matici.
Poznámka: N a M sú maximálne 10. Hodnoty matice sú reálne čísla.
Odporúčanie: pre načítanie jednej matice použite funkciu. Pre operácie nad maticami vytvorte funkcie. V prípade, že matice nie je možné násobiť, vypíšte informačnú správu.
Analýza: Aby sme dokázali napísať program, ktorý má pracovať s maticami, tak asi najdôležitejšou vecou, ktorú musíme vedieť je ako sa narába s maticami z matematického hladiska. Ďalej čo musíme vedieť je práca s poľom, keďže matica nie je iba jedno číslo, ale sústava viacerých hodnôt. Na načítanie matice potrebujeme jednoznačne vedieť, aké sú jej rozmery. To budeme mať napísané v zdrojovom súbore. Tým sa nám vyskytuje ďalšia dôležitá súvislosť, ktorou je načítanie zo súboru. Ak vieme toto všetko, so základmi programovania, ktorých poznatky sme už nadobudli, nemal by byť problém, aby sme zadanie zvládli. Program je riešený pomocou funkcií, ktoré sú použité ako operácie nad maticami.
Špecifikácia: Na začiatku je potrebné zadeklarovať matice a ostatné premenné, ktoré sa v programe využívajú. Program vymaže obrazovku a otvorí vstupný súbor, vktorom sa nachádzajú matice s popisom ich rozmerov. Ak sa mu ho nepodarí nájsť, t.j. ak neexistuje, alebo sa z neho nedá čítať, vypíše hlásenie a ukončí sa. Ak tam ale je a otvorenie bolo úspešné načíta rozmery 1. matice a vypíše ich. Ak presahujú hodnotu 10, ktorá určuje aká je preddefinovaná veľkosť poľa, program vypíše chybu a ukončí sa.Ak rozmery matice nepresahujú túto hranicu, program ďalej pokračuje vo vymazaní pola, do ktorého sa nová matica zapíše a potom v načítaní matice a v jej vypísaní na obrazovku. To isté sa opakuje aj s druhou maticou. Po skončení načítania a vypísania oboch matíc program zdrojový súbor s maticami zatvorí. Ďalej program porovnáva rozmery jednotlivých matíc a zisťuje či sú totožné, aby mohol vykonať ich sčítanie a odčítanie. Keď sa matice zhodujú rozmermi vykoná dané operácie a vypíše ich výsledky na monitor. V opačnom prípade vypíše, že matice sa nedajú sčítať a odčítať, lebo nemajú rovnaké rozmery. Ďalšou časťou programu je zisťovanie či sa dané matice dajú násobyť a to tak že porovnáme počet stĺpcov 1.matice s počtom riadkou 2. matice. Ak sa zhodujú, program matice vynásobý a výsledok vypíše na monitor. V opačnom prípade zahlási chybu o nemožnosti násobenia daných matíc. Medzi jednotlivými výpismi matíc a hlásení je „brzda“ z dôvodu: ak narábame s maticami väčších rozmerov, tak sa celý výpočet matíc nezmestí na monitor.
Návrh: Štyri operácie nad maticami sú riešené pomocou funkcií. Sú to načítanie matice, vynásobenie matice (matíc), výpis matice (matíc) a vymazanie matice. Všetky funkcie sú tvorené vnorenými cyklami, ktoré zabezpečujú „behanie“ po matici ako aj po riadkoch a vďaka druhému vnorenému cyklu tak aj po stĺpcoch v jednotlivom riadku. Pri násobení je použité trojité vnorenie cyklov a to tak že prvé dva sú for ako aj pri ostatných operáciach a tretí je while, vďaka ktorému sa v 1. matici pohybujeme postĺpcoch a v 2. matici po riadkoch. Sčítanie a odčítanie je riešené pomocou cyklov priamo v tele programu z toho dôvodu aby bola celková dĺžka programu kratšia. Zisťovanie, či sa matice dajú sčítavať a odčítavať, poprípade násobiť je robené pomocou podmienok if.
Implementácia:
#include #include #include #define MAX 10
void nacitajmaticu( int a[MAX][MAX], int m, int n, FILE *matice); void vynasobmaticu(int e[MAX][MAX],int a[MAX][MAX],int b[MAX][MAX], int m,int n,int k); void vypismaticu(int a[MAX][MAX], int m,int n);
void nacitajmaticu(int a[MAX][MAX], int m, int n, FILE *matice) { int i, j; for (i=0;i
|