Advertisement
primatas

C++ darbai su masyvais

Dec 2nd, 2011
796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.91 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <string>
  5. #include <fstream> 
  6. #include <cstdlib>
  7.  
  8. using namespace std;
  9.  
  10. void meniu();
  11. void baigti(); 
  12. void spausdinti_matrica(ostream &, double [][100], int, int);
  13. int formuoja_matrica(istream &, double (&)[100][100], int, int);
  14. double matricos_elementu_vidurkis(double [][100], int, int);
  15. int gauti_eilute(double [][100], int, int, char);
  16. int neigiamiausias_stuleplis(double [][100], int, int);
  17. bool ar_egzistuoja_toks_matricos_elementas(int, int, int, int);
  18. int iveda_matrica_is_failo(string, double (&)[100][100], int &, int &);
  19. bool keisti_matricos_elementa_nauja_reiksme(double (&)[100][100], int, int, int, int, double);
  20. void keistiKvadratais(double (&)[100][100], int, int, int);
  21. void rikiuoti_matrica(double (&)[100][100], int, int, int);
  22. double dauginti_teigiamus_elementus(double [][100], int, int);
  23. void sukurti_matrica_pagal_atrinktus_elementus(double (&)[100][100], double (&)[100], int, int);
  24. bool sukeicia_min_max_stulpelius(double (&)[100][100], int, int);
  25. void debug(int, int);
  26. void suformuoti_didziausiu_matricos_elementu_masyva(double (&)[100][100], int, int, double (&)[100]);
  27. void keisti_neigiamus_elementus_kvadratais(double (&)[100][100], int, int, int);
  28.  
  29. int main() {
  30.     // kintamuju aprasai
  31.     int x, y, matrica_jau_suformuota = 0;
  32.     double didziausi_elementai[100];
  33.     string kelias, veiksmas;
  34.     string veiksmai[10] = {"3", "4", "5", "6", "7", "8", "9", "10", "11", "13"};
  35.     bool veiksmas_egzistuoja = false;
  36.     double matrica[100][100];
  37.     int maziausiai_elementas_yra_sioje_eiluteje;
  38.  
  39.     cout << "Laboratorinis darbas nr. 3, Lukas Liesis, GM080102\n\n";
  40.     cout << "Programa atlieka ivairius veiksmus su matrica pagal vartotojo pasirinkima\n";
  41.     cout << "Matrica galima ivesti is failo arba ranka\n";
  42.     cout << "Norima ivedimo varianta pasirinkite is meniu ivedus 1 arba 2\n\n";
  43.     cout << "Matricos failo formatas yra toks:\n";
  44.     cout << "Pirmoje eiluteje nurodyti 2 skaiciai parodo kokio dydzio yra matrica\n";
  45.     cout << "Pirmas skaicius nurodo stulpeliu skaiciu, antras  eiluciu\n";
  46.     cout << "Kiekvienoje kitoje eiluteje yra surasomi matricos elementu skaicia\n\n";
  47.  
  48.     // meniu spausdinimas
  49.     meniu();
  50.     // pagrindinis programos ciklas
  51.     do {
  52.         veiksmas_egzistuoja = false;
  53.         cout << "\nIveskite norimo atlikti veiksmo meniu numeri: ";
  54.         cin >> veiksmas;
  55.         cout << "\n";
  56.         if (veiksmas == "0") {
  57.             // rodyti meniu
  58.             meniu();
  59.         } else if (veiksmas == "12") {
  60.             // pabaigti programa
  61.             baigti();
  62.         } else if (veiksmas == "1"){
  63.             // ivedimas is failo
  64.             cout << "Kelias iki failo: ";
  65.             cin >> kelias;
  66.             matrica_jau_suformuota = iveda_matrica_is_failo(kelias, matrica, x, y);
  67.             if (matrica_jau_suformuota <= 0) {
  68.                 cout << "Klaida! Blogas kelias iki failo\n";
  69.             } else {
  70.                 cout << "Matrica ivesta. Ji sudaryta is " << x << " stulpeliu ir " << y << " eiluciu.\n";
  71.                 spausdinti_matrica(cout, matrica, x, y);
  72.             }
  73.         } else if (veiksmas == "2") {
  74.             // rankiniu budu ivesti matrica
  75.             cout << "Iveskite matricos stulpeliu skaiciu:\n";
  76.             cin >> x;
  77.             cout << "Iveskite matricos eiluciu skaiciu:\n";
  78.             cin >> y;
  79.             if (cin.good()) {
  80.                 if (ar_egzistuoja_toks_matricos_elementas(100, 100, x, y)) { // ar matricos matmenys nevirsija masyvo
  81.                     cout << "Iveskite matricos reiksmes: \n";
  82.                     matrica_jau_suformuota = formuoja_matrica(cin, matrica, x, y);
  83.                     if (matrica_jau_suformuota == -1 || matrica_jau_suformuota == -2) {
  84.                         cout << "Klaida! Neteisingi matricos duomenys.\n";
  85.                     } else {
  86.                         cout << "Matrica ivesta. Ji sudaryta is " << x << " stulpeliu ir " << y << " eiluciu.\n";
  87.                         spausdinti_matrica(cout, matrica, x, y); // spausdinam matrica
  88.                     }
  89.                 } else {
  90.                     cout << "Klaida! Toks eiluciu ar stulpeliu kiekis yra negalimas.\n";
  91.                     cout << "Daugiausia gali buti 100 eiluciu ir 100 stulepliu.\n";
  92.                 }
  93.             }
  94.         }  else {
  95.             // tikrinam ar egzistuoja nurodytas veiksmas
  96.             // prasukam cikla pro visus veiksmus
  97.             for(int i = 0; i < sizeof(veiksmai)/sizeof(string); i++) {
  98.                 if (veiksmas == veiksmai[i]) {
  99.                     veiksmas_egzistuoja = true;
  100.                     break;
  101.                 }
  102.             }
  103.  
  104.             if (veiksmas_egzistuoja) {
  105.                 if (matrica_jau_suformuota == 1) { // tikrinam ar matrica jau suformuota
  106.            
  107.                     if (veiksmas == "3") {  // skaiciuoti matricos elementu aritmetini vidurki
  108.                         double vidurkis = matricos_elementu_vidurkis(matrica, x, y); // gaunam vidurki
  109.                         cout << "Matricos aritmetinis vidurkis yra: " << vidurkis << "\n";
  110.                     } else if (veiksmas == "4") { // pakeisti pasirinkta elementa nauja reiksme
  111.                         int x1, y1;
  112.                         double n;
  113.                         cout << "Iveskite keiciamos eilutes nr: ";
  114.                         cin >> x1;
  115.                         cout << "\nIveskite keiciamo stulpelio nr: ";
  116.                         cin >> y1;
  117.                         if (cin.good()) {
  118.                             cout << "\nIveskite nauja elemento reiksme: ";
  119.                             cin >> n;
  120.                             if (cin.good()) {
  121.                                 if (keisti_matricos_elementa_nauja_reiksme(matrica, x, y, x1, y1, n)) { // keicia elementa
  122.                                     cout << "\nElemento reiksme pakeista sekmingai \n\n";
  123.                                     spausdinti_matrica(cout, matrica, x, y);
  124.                                 } else {
  125.                                     cout << "Klaida! Toks matricos elementas neegistuoja";
  126.                                 }
  127.                             }
  128.                         }
  129.                     } else if (veiksmas == "5") {   // Rasti kiekvienos eilutes didziausia elementa
  130.                         double nauja_matrica[100];
  131.                         sukurti_matrica_pagal_atrinktus_elementus(matrica, nauja_matrica, x, y); // formuojam nauja matrica
  132.                         cout << "Didziausi kiekvienos matricos eilutes elementai yra: \n\n";
  133.                         for(int i = 0; i < y; i++) { // prasuka pro visas eilutes
  134.                             cout << i + 1 << " eilutes didziausias elementas yar: " << nauja_matrica[i] << "\n"; // Y eilutes didziausias elementas yra: bla bla
  135.                         }
  136.                     } else if (veiksmas == "6") {   // Sudauginti teigiamus elementus is eilutes, kurioje yra didziausias matricos elementas
  137.                         //debug(x, y);
  138.                         int eilute = gauti_eilute(matrica, x, y, 'd') + 1; // suranda kuri eilute turi didziausia elementa
  139.                         cout << "Didziausias elementas yra " << eilute << " eiluteje.\n";
  140.                         cout << eilute << " eilutes teigiamu elementu sandauga lygi: ";
  141.                         cout << std::fixed << dauginti_teigiamus_elementus(matrica, eilute - 1, x) <<  "\n";
  142.                         cout << resetiosflags( ios::fixed ) ;
  143.  
  144.                     } else if (veiksmas == "7") {   // suranda stulpeli, kuriame yra didziausia suma neigiamu elementu
  145.                         int id = neigiamiausias_stuleplis(matrica, x, y);
  146.                         suformuoti_didziausiu_matricos_elementu_masyva(matrica, y, x, didziausi_elementai);
  147.                         if (id == -1) {
  148.                             cout << "Klaida! Neigiamu elementu matricoje nera\n";
  149.                         } else {
  150.                             cout << "Didziausia neigiamu elementu suma turintis stulpelis yra: " << id + 1 << "\n";
  151.                         }
  152.                     } else if (veiksmas == "8") {   // sukeicia daugiausia neigiamu elementu turinti stulpeli su maziausiai turinciu
  153.                         cout << "Sukeicia daugiausia neigiamu elementu turinti stulpeli su maziausiai turinciu\n";
  154.                         if (sukeicia_min_max_stulpelius(matrica, x, y)) {// matricos stulpeliu sukeitimas
  155.                             cout << "Stulpeliai sukeisti sekmingai\n\n";
  156.                             spausdinti_matrica(cout, matrica, x, y);
  157.                         } else {
  158.                             cout << "Klaida! Teigiamu elementu matricoje nera\n";
  159.                         }
  160.                     }  else if (veiksmas == "9") {
  161.                         spausdinti_matrica(cout, matrica, x, y); // spausdinam matrica ekrane
  162.                     } else if (veiksmas == "10") { // spausdinam matrica i faila
  163.                         cout << "Iveskite kelia iki failo: ";
  164.                         cin >> kelias;
  165.                         ofstream failas(kelias.c_str());
  166.                         if (!failas.fail()) {
  167.                             // irasom matricos dydi
  168.                             failas << x << " ";
  169.                             failas << y << "\n";
  170.                             spausdinti_matrica(failas, matrica, x, y); // irasom matrica
  171.                             cout << "\nMatrica sekmingai irasyta.\n";
  172.                         } else {
  173.                             cout << "Klaida! Blogas failas. Jis neegzistuoja arba yra pazeistas\n";
  174.                         }
  175.                         failas.close();
  176.                     } else if (veiksmas == "11") {
  177.                         int st;
  178.                         cout << "Iveskite stulpeli, pagal kuri bus rikiuojama matrica didejimo tvarka: ";
  179.                         cin >> st;
  180.                         if (cin.good()) {
  181.                             if (ar_egzistuoja_toks_matricos_elementas(y, x, 1, st)) {
  182.                                 rikiuoti_matrica(matrica, x, y, st - 1); // rikiuojam matrica
  183.                                 cout << "Matrica surusiuota\n\n";
  184.                                 spausdinti_matrica(cout, matrica, x, y); // spausdinam
  185.                             } else {
  186.                                 cout << "Klaida! Sio stulpelio nera\n";
  187.                             }
  188.                         }
  189.                     } else if(veiksmas == "13"){
  190.                         // kvadratais pakeisti po maziausia elementa turincios eilutes
  191.                         maziausiai_elementas_yra_sioje_eiluteje = gauti_eilute(matrica, y, x, 'm') + 1; // suranda kuri eilute turi didziausia elementa
  192.                         cout << "Maziausias elementas yra " << maziausiai_elementas_yra_sioje_eiluteje << " eiluteje.\n";
  193.                         keisti_neigiamus_elementus_kvadratais(matrica, y, x, maziausiai_elementas_yra_sioje_eiluteje);
  194.                         cout << "Matricos elementai pakeisti.\n";
  195.                         spausdinti_matrica(cout, matrica, x, y);
  196.                     }
  197.                 } else {
  198.                     cout << "Klaida! Pries pasirinkdami si meniu punkta turite ivesti matrica!\n";
  199.                 }
  200.             } else {
  201.                 cout << "Klaida! Pasirinkote meniu punkta, kurio nera\n";
  202.             }
  203.         }
  204.         if (cin.fail()) {// jei ivesti neteisingi duomenys, sutvarkom cina ir pranesam apie klaida
  205.             cin.clear();
  206.             cin.ignore(256, '\n');
  207.             cout << "Klaida! Neteisingi parametrai\n";
  208.         }
  209.     } while(true); // ciklas vyksta visa programos veikimo laika
  210.  
  211.     return 0;
  212. }
  213.  
  214.  
  215. // meniu punktai
  216.  
  217. void meniu() {
  218.     cout << "[0] Meniu\n";                                                                                                          // done
  219.     cout << "[1] Formuoti matrica is failo\n";                                                                                      // done
  220.     cout << "[2] Formuoti matrica su klaviatura\n";                                                                                 // done
  221.     cout << "[3] Skaiciuoti matricos elementu aritmetini vidurki\n";                                                                // done
  222.     cout << "[4] Keisti matricos elementa\n";                                                                                       // done
  223.     cout << "[5] Rasti kiekvienos eilutes didziausia elementa\n";                                                                   // done
  224.     cout << "[6] Sudauginti teigiamus elementus is eilutes, kurioje yra didziausias matricos elementas\n";                          // done
  225.     cout << "[7] Surasti didziausia neigiamu elementu suma turinti matricos stulpeli\n";                                            // done
  226.     cout << "[8] Sukeisti vietomis maziausiai ir daugiausiai teigiamu elementu turincius stulpelius vietomis\n";                    // done
  227.     cout << "[9] Spausdinti matricja\n";                                                                                            // done
  228.     cout << "[10] Irasyti matrica i faila\n";                                                                                       // done
  229.     cout << "[11] Rusiuoti matrica pagal pasirinkta stulpeli\n";                                                           
  230.     cout << "[12] Baigti darba\n";                                                                                                  // done
  231.     cout << "[13] Visose matricos eilutese, esanciose zemiau tos eilutes, kurioje yra maziausias matricos elementas, neigiamus pakeisti ju kvadratais";
  232. }
  233.  
  234. void baigti() {
  235.     exit(0);
  236. }
  237.  
  238.  
  239. // gauna eilute spausdinimui matricos i konsole arba faila
  240.  
  241. void spausdinti_matrica(ostream &duomenys, double matrica[][100], int x, int y) {
  242.     duomenys.precision(3); // 3 skaiciu po kableliu tikslumu
  243.     for(int i = 0; i < y; i++) {
  244.         for(int j = 0; j < x; j++) {
  245.             duomenys.width(5);                  // duomeny plotis
  246.             duomenys.fill(' ');                 // duomenu pradinis uzpildymas
  247.             duomenys << matrica[i][j] << " ";   // iveda matricos elemento reiksme
  248.         }
  249.         duomenys << "\n"; // pereina i nauja eilute
  250.     }
  251. }
  252.  
  253. // suformuoja matrica
  254.  
  255. int formuoja_matrica(istream &duomenys, double (&matrica)[100][100], int x, int y) {
  256.     duomenys.precision(3); // tikslumas - 3 sk. po kablelio
  257.     for(int i = 0; i < y; i++)  {
  258.         for(int j = 0; j < x; j++)      {
  259.             duomenys >> matrica[i][j];
  260.             if (duomenys.fail()) // jei klaida - iseina is f-cijos su -1 o ne 1
  261.                 return -1;
  262.         }
  263.     }
  264.     return 1;
  265. }
  266.  
  267. // iveda matrica is failo
  268.  
  269. int iveda_matrica_is_failo(string kelias, double (&matrica)[100][100], int &x, int &y) {
  270.     int s = -1;
  271.     ifstream failas(kelias.c_str());
  272.     if (!failas.is_open()) { // atidarom
  273.         return -1;
  274.     }
  275.  
  276.     failas >> x >> y; // gaunam eiluciu ir stulpeliu skaiciu
  277.     if (cin.good()) {
  278.         if (ar_egzistuoja_toks_matricos_elementas(100, 100, x, y)) {
  279.             s = formuoja_matrica(failas, matrica, x, y); // formavimas
  280.         }
  281.     }
  282.     failas.close(); // uzdarom
  283.     return s;
  284. }
  285.  
  286. // matricos elementu vidurkis
  287.  
  288. void debug(int x, int y){
  289.     cout << "x: " << x << " Y: " << y;
  290. }
  291.  
  292. double matricos_elementu_vidurkis(double matrica[][100], int y, int x) {
  293.     double suma = 0;
  294.     for(int i = 0; i < y; i++) {
  295.         for(int j = 0; j < x; j++) {
  296.             suma = suma + matrica[i][j];
  297.         }
  298.     }
  299.     return (double) suma / (y * x);
  300. }
  301.  
  302. // grazina stuleplio id, kuris buvo neigiamiausias. t.y. sudeda neigiamus elementus ir palygina
  303.  
  304. int neigiamiausias_stuleplis(double matrica[][100], int x, int y) {
  305.     double suma[100], min;
  306.     int e = 0, id;
  307.  
  308.     // nulinam
  309.     for(int i = 0; i < 100; i++) {
  310.         suma[i] = 0;
  311.     }
  312.     // skaiciuojam stulpeliu neigiamu elementu suma
  313.     for(int i = 0; i < x; i++) {
  314.         for(int j = 0; j < y; j++) {
  315.             if (matrica[j][i] < 0) {
  316.                 suma[i] = suma[i] + matrica[j][i];
  317.                 e = 1;
  318.             }
  319.         }
  320.     }
  321.     if (!e) {
  322.         return -1;
  323.     }
  324.     // randam indeksa
  325.     min = suma[0];
  326.     id = 0;
  327.     for(int i = 0; i < x; i++) {
  328.         if (suma[i] < min) {
  329.             min = suma[i];
  330.             id = i;
  331.         }
  332.     }    
  333.     return id;
  334. }
  335.  
  336. // ar matricoje x y egzistuoja elementas x1 y1
  337.  
  338. bool ar_egzistuoja_toks_matricos_elementas(int x, int y, int x1, int y1) {
  339.     if (0 < x1 && x1 <= x && 0 < y1 && y1 <= y){    // x1 ir y1 turi buti [0...x] arba [0...y]
  340.         return true;
  341.     }
  342.     return false;
  343. }
  344.  
  345.  
  346. // grazina eilutes indeksa, kuri eilute turi didziausia arba maziausia elementa
  347.  
  348. int gauti_eilute(double matrica[][100], int x, int y, char ka_veikt) {
  349.     if (ka_veikt != 'd' && ka_veikt != 'm') {   // ka daryt ar rast maziausia (m) ar didziausia (d)
  350.     //  cout << "ka veitk: " << ka_veikt << "\n\n\n";
  351.         return -1;
  352.     }
  353.     int eilute = 0;
  354.     double n = matrica[0][0];
  355.     for(int i = 0; i < x; i++) {
  356.         for(int j = 0; j < y; j++) {
  357.             if (ka_veikt == 'd') {
  358.                 if (matrica[i][j] > n) {
  359.                     n = matrica[i][j];
  360.                     eilute = i;
  361.                 }
  362.             } else if (ka_veikt == 'm') {
  363.                 if (matrica[i][j] < n) {
  364.                     n = matrica[i][j];
  365.                     eilute = i;
  366.                 }
  367.             }
  368.         }
  369.     }
  370.     return eilute;
  371. }
  372.  
  373. // sudaugina tieigiamus elementus pateiktos matricos
  374.  
  375. double dauginti_teigiamus_elementus(double matrica[][100], int y, int x) {
  376.     double sandauga = 1;
  377.     for(int i = 0; i < x; i++) {
  378.         if (matrica[y][i] > 0) {
  379.             sandauga = (double)sandauga * (double)matrica[y][i];
  380.         }
  381.     }
  382.     return sandauga;
  383. }
  384.  
  385.  
  386. // sukuria nauja matrica pagal atrinktus kiekvienos eilutes didziausius elementus
  387.  
  388. void sukurti_matrica_pagal_atrinktus_elementus(double (&matrica)[100][100], double (&nauja_matrica)[100], int y, int x) {
  389.     double max;
  390.     for(int i = 0; i < x; i++) {
  391.         max = matrica[i][0];            // didziausias pirmas elementas
  392.         for(int j = 0; j < y; j++) {    // prasisuka pro visus eilutes elementus
  393.             if (matrica[i][j] > max) {
  394.                 max = matrica[i][j];
  395.             }
  396.         }
  397.         nauja_matrica[i] = max;         //formuoja nauja matrica
  398.     }
  399. }
  400.  
  401.  
  402. // keicia matricos elemento reiksme, taip pat patikrina ar tas elementas egzistuoja
  403.  
  404. bool keisti_matricos_elementa_nauja_reiksme(double (&matrica)[100][100], int x, int y, int x1, int y1, double reiksme) {
  405.     if (ar_egzistuoja_toks_matricos_elementas(x, y, y1, x1)) {
  406.         matrica[x1 - 1][y1 - 1] = reiksme;
  407.         return true;
  408.     }
  409.     return false;
  410. }
  411.  
  412. //rikiavimas pagal pasirinkta stulpeli didejimo tvarka
  413. void rikiuoti_matrica(double (&matrica)[100][100], int x, int y, int st) {
  414.     int mini = 0;
  415.     double min = matrica[0][0], tmp;
  416.     for(int i = 0; i < y; i++) {
  417.         for(int j = 0; j < y; j++) {
  418.             if (matrica[j][st] > matrica[i][st])  {
  419.                 for(int k = 0; k < x; k++) {
  420.                     tmp = matrica[i][k];
  421.                     matrica[i][k] = matrica[j][k];
  422.                     matrica[j][k] = tmp;
  423.                 }
  424.             }
  425.         }
  426.     }
  427. }
  428.  
  429.  
  430. // sukeicia vietomis minimalu ir maksimalu stulpelius
  431.  
  432. bool sukeicia_min_max_stulpelius(double (&matrica)[100][100], int x, int y) {
  433.     int e[100], c = 0, mini, maxi;
  434.     double max, min, tmp;
  435.     //skaiciuojam kiek teigiamu elementu turi kiekvienas stulpelis
  436.     for(int i = 0; i < x; i++) {
  437.         e[i] = 0;
  438.         for(int j = 0; j < y; j++) {
  439.             if (matrica[j][i] > 0) {
  440.                 e[i]++;
  441.             }
  442.         }
  443.     }
  444.     // randam stulpeli, kuriame daugiausiai teigiamu elementu
  445.     max = e[0];
  446.     maxi = 0;
  447.     for(int i = 0; i < x; i++) {
  448.         if (e[i] > max) {
  449.             max = e[i];
  450.             maxi = i;
  451.         }
  452.     }
  453.     if (max == 0) {     // nera ne vieno teigiamo elemento
  454.         return false;
  455.     }
  456.  
  457.     min = e[0];
  458.     mini = 0;
  459.     for(int i = 0; i < x; i++) {
  460.         if (e[i] < min) {
  461.             min = e[i];
  462.             mini = i;
  463.         }
  464.     }
  465.     // apkeiciam stulpelius vietomis
  466.     for(int i = 0; i < y; i++) {
  467.         tmp = matrica[i][maxi];
  468.         matrica[i][maxi] = matrica[i][mini];
  469.         matrica[i][mini] = tmp;
  470.     }
  471.     return true;
  472. }
  473.  
  474.  
  475.  
  476. void suformuoti_didziausiu_matricos_elementu_masyva(double (&masyvas)[100][100], int y, int x,  double (&naujas_masyvas)[100]){
  477.     int didziausias;
  478.     for(int i = 0; i < y; i++){
  479.         didziausias = 0;
  480.         // randa didziausia sios eilutes
  481.         for(int j = 0; j < y; j++){
  482.             if(masyvas[i][didziausias] > masyvas[i][j]){
  483.                 didziausias = j;
  484.             }
  485.         }  
  486.         naujas_masyvas[i] = masyvas[i][didziausias];
  487.     }
  488. }
  489.  
  490. void keisti_neigiamus_elementus_kvadratais(double (&masyvas)[100][100], int y, int x, int nuo_eilutes){
  491.     for(int i = nuo_eilutes; i < y; i++){
  492.         for(int j = 0; j < x; j++){
  493.             if(masyvas[i][j] < 0){
  494.                 masyvas[i][j] = masyvas[i][j] * masyvas[i][j];
  495.             }
  496.         }
  497.     }
  498. }
  499.  
  500.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement