Pereiti prie turinio

C++ matricos klausimas


Rekomenduojami pranešimai

Turiu taip atspausdintą matricą:

 +–––––––+–––––––+–––––––+–––––––+–––––––+
|       |     1 |     2 |     3 |     4 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+
|     1 |    12 |     5 |     6 |    45 | 
|     2 |    83 |    54 |     8 |     5 | 
|     3 |    54 |    33 |    55 |    54 | 
|     4 |    48 |     6 |     8 |     0 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+

 

Kaip į ją įterpti eilutę, kuri apskaičiuoja kiek yra dviženklių skaičių stulpelyje?

 

pvz:

 +–––––––+–––––––+–––––––+–––––––+–––––––+
|       |     1 |     2 |     3 |     4 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+
|     1 |    12 |     5 |     6 |    45 | 
|     2 |    83 |    54 |     8 |     5 | 
|     3 |    54 |    33 |    55 |    54 | 
|     4 |    48 |     6 |     8 |     0 | 
|     5 |     4 |     2 |     1 |     2 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+

 

Kaip įterpti tą 5 eilutę?

 

Dabar turiu tokią funkciją:

void Papildymas(int M[][Cm], int &n, int m)
{
ofstream fr (Crez, ios::app); 
       int kiekis = 0;
	for (int j = 0; j < m; j++){
       kiekis = 0;
		for (int i = 0; i < n; i++)      
		{
               if (abs(M[i][j]) > 10 && abs(M[i][j]) < 100)
               kiekis++;
		}
       fr << setw(6) << kiekis; 
}
fr.close();
}

 

Viską įvykdžius atspausdina taip:

 +–––––––+–––––––+–––––––+–––––––+–––––––+
|       |     1 |     2 |     3 |     4 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+
|     1 |    12 |     5 |     6 |    45 | 
|     2 |    83 |    54 |     8 |     5 | 
|     3 |    54 |    33 |    55 |    54 | 
|     4 |    48 |     6 |     8 |     0 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+

    4     2     1     2

 

Kaip padaryti, kad spausdintų kaip pas mane nurodyta?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Priklauso nuo viso kodo, bet esme tame kad tavo matrica atspauzdina kazkokia funkcija, kuri tiesiog atprintina visa array'ju, taigi paprasciausia butu i ta array'ju dadeti dar viena row'a, pvz: vietoj isprintinimo << tiesiog rezultatus ikisti atgal i array'aus penkta eilute

 

M[j][n]=kiekis;

 

Jei modifikuot arraj'aus negali, tada reiktu modifikuoti atprintinimo funkcija, arba printinimo funkcijaj paduoti arraj'aus modifikuota kopija. Overall, tai priklauso nuo viso kito kodo, kurio mes cia nematome.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Spausdinimui naudoju tokią funkciją:

 

void Spausdinti(int M[][Cm], int n, int m)
{
ofstream fr(Crez, ios::app);
SpausdintiVirsu(fr,  m);
for (int i = 0; i < n; i++)
{
	fr << " | " << setw(5) << i+1 << " | ";
	for (int j = 0; j < m; j++)
		fr << setw(5) << M[i][j] << " | ";
		fr << endl;
}
BreztiLentele(fr, m+1);
fr << endl;
fr.close();
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

as tau pasakiau pora variantu, kaip isspresti sia beda - tu savo atsakyme nenurodei nei vieno tau priimtino ...

 

Turbut paprasciausias budas butu pakeisti koda taip:

 

void Papildymas(int M[][Cm], int &n, int m)
{
       ofstream fr (Crez, ios::app); 
       int kiekis = 0;
               for (int j = 0; j < m; j++){
       kiekis = 0;
                       for (int i = 0; i < n; i++)      
                       {
               if (abs(M[i][j]) > 10 && abs(M[i][j]) < 100)
               kiekis++;
                       }
       fr << setw(5) << kiekis << " | "; 
}
       fr.close();
}



void Spausdinti(int M[][Cm], int n, int m)
{
       ofstream fr(Crez, ios::app);
       SpausdintiVirsu(fr,  m);
       for (int i = 0; i < n; i++)
       {
               fr << " | " << setw(5) << i+1 << " | ";
               for (int j = 0; j < m; j++)
                       fr << setw(5) << M[i][j] << " | ";
                       fr << endl;
       }
fr << " | " << setw(5) << i+1 << " | ";
Papildymas(M, n, m);
       BreztiLentele(fr, m+1);
       fr << endl;
       fr.close();
}

 

Gal sugebesi pats rasti kokias eilutes pakeiciau... Netikrinau, ar su klaidom parasiau ar ne, todel jei jau kur nors syntax erroras tai jau spresk pats.

 

Taip pat, nesakyk, kad cia tu parasei koda, nes jei tu butum parases - tai toki paprasta dalyka pats galetum pataisyt.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pateikiu savo kodą, nepavyksta taip isspausdinti matricos kaip pateikiau auksciau, man reikia kad išspausdintų pradinę matricą, o tada suskaičiavus kiek stulpelyje yra dviženklių skaičių tą kiekį išspausdintų paskutinėje eilutėje. T.y. jei pradinėj matricoj yra 4 eilutės. Tai pertvarkytoj matricoj turi būti 5 eilutės, paskutinėj kiek yra dviženklių skaičių.

 

 

Kodas:

 

 

# include <iostream>
# include <fstream>
# include <iomanip>
using namespace std;
const char CmasA[]= "Duomenys.txt";    
const char Crez[]= "Rezultatai.txt";      
const int Cm = 100;				
const int Cn = 100;					
void Skaito(const char failas[], int A[][Cm], int &n, int &m);
void Spausd(int A[][Cm], int n, int m);
void SpausdVirs(ofstream &fr, int m);
void Lentel(ofstream &fr, int n);
void Papildo(int M[][Cm], int &n, int m);
int main() 
{	
ofstream fr(Crez);
fr.close();
int A[Cn][Cm];
int n, m;

Skaito(CmasA, A, n, m);
Spausd(A, n, m); 

Skaito(CmasA, A, n, m);
Papildo(A, n, m);
Spausd(A, n, m); 
}

void SpausdVirs(ofstream &fr, int m)
{
Lentel(fr, m+1);
fr << " |       | ";
for (int j = 0; j < m; j++)
	fr << setw(5) << j+1 << " | ";
	fr << endl;
	Lentel(fr, m+1);
}


void Skaito(const char failas[], int A[][Cm], int &n, int &m)
{
ifstream fd(failas);
fd >> n >> m;
for(int i = 0; i < n; i++)   
	for(int j = 0; j < m; j++)
		fd >> A[i][j]; 
fd.close();
}

void Spausd(int M[][Cm], int n, int m)
{
ofstream fr(Crez, ios::app);
SpausdVirs(fr,  m);
for (int i = 0; i < n; i++)
{
	fr << " | " << setw(5) << i+1 << " | ";
	for (int j = 0; j < m; j++)
		fr << setw(5) << M[i][j] << " | ";
		fr << endl;
}


Lentel(fr, m+1);
fr << endl;
fr.close();
}

void Lentel(ofstream &fr, int n)
{
 fr << " +";
 for (int i = 0; i < n; i++)
  fr << "–––––––+";
  fr << endl;
}

void Papildo(int M[][Cm], int &n, int m)
{
ofstream fr (Crez, ios::app); 
fr << " | " << setw(5) << n << " | ";
       int kiekis = 0;
	for (int j = 0; j < m; j++){
       kiekis = 0;
		for (int i = 0; i < n; i++)      
		{
               if (abs(M[i][j]) > 10 && abs(M[i][j]) < 100)
               kiekis++;

		}
      			fr << setw(5) << kiekis;

}
fr.close();
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pateikiu savo kodą, nepavyksta taip isspausdinti matricos kaip pateikiau auksciau, man reikia kad išspausdintų pradinę matricą, o tada suskaičiavus kiek stulpelyje yra dviženklių skaičių tą kiekį išspausdintų paskutinėje eilutėje. T.y. jei pradinėj matricoj yra 4 eilutės. Tai pertvarkytoj matricoj turi būti 5 eilutės, paskutinėj kiek yra dviženklių skaičių.

 

 

Kodas:

 

 

# include <iostream>
# include <fstream>
# include <iomanip>
using namespace std;
const char CmasA[]= "Duomenys.txt";    
const char Crez[]= "Rezultatai.txt";      
const int Cm = 100;				
const int Cn = 100;					
void Skaito(const char failas[], int A[][Cm], int &n, int &m);
void Spausd(int A[][Cm], int n, int m);
void SpausdVirs(ofstream &fr, int m);
void Lentel(ofstream &fr, int n);
void Papildo(int M[][Cm], int &n, int m);
int main() 
{	
ofstream fr(Crez);
fr.close();
int A[Cn][Cm];
int n, m;

Skaito(CmasA, A, n, m);
Spausd(A, n, m); 

Skaito(CmasA, A, n, m);
Papildo(A, n, m);
Spausd(A, n, m); 
}

void SpausdVirs(ofstream &fr, int m)
{
Lentel(fr, m+1);
fr << " |       | ";
for (int j = 0; j < m; j++)
	fr << setw(5) << j+1 << " | ";
	fr << endl;
	Lentel(fr, m+1);
}


void Skaito(const char failas[], int A[][Cm], int &n, int &m)
{
ifstream fd(failas);
fd >> n >> m;
for(int i = 0; i < n; i++)   
	for(int j = 0; j < m; j++)
		fd >> A[i][j]; 
fd.close();
}

void Spausd(int M[][Cm], int n, int m)
{
ofstream fr(Crez, ios::app);
SpausdVirs(fr,  m);
for (int i = 0; i < n; i++)
{
	fr << " | " << setw(5) << i+1 << " | ";
	for (int j = 0; j < m; j++)
		fr << setw(5) << M[i][j] << " | ";
		fr << endl;
}


Lentel(fr, m+1);
fr << endl;
fr.close();
}

void Lentel(ofstream &fr, int n)
{
 fr << " +";
 for (int i = 0; i < n; i++)
  fr << "–––––––+";
  fr << endl;
}

void Papildo(int M[][Cm], int &n, int m)
{
ofstream fr (Crez, ios::app); 
fr << " | " << setw(5) << n << " | ";
       int kiekis = 0;
	for (int j = 0; j < m; j++){
       kiekis = 0;
		for (int i = 0; i < n; i++)      
		{
               if (abs(M[i][j]) > 10 && abs(M[i][j]) < 100)
               kiekis++;

		}
      			fr << setw(5) << kiekis;

}
fr.close();
}

 

 

Kaip jau minejau - viskas veikia, tik buvo klaidele 1. i buvo apibrezta tik ciklo viduje, tai pakeiciau kad naudotu n 2. nedadejau newline'o gale:

 

> cat Duomenys.txt 
4 4 
12 5 6 45
83 54 8 5
54 33 55 54
48 6 8 0
> ./a.out 
> cat Rezultatai.txt 
+–––––––+–––––––+–––––––+–––––––+–––––––+
|       |     1 |     2 |     3 |     4 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+
|     1 |    12 |     5 |     6 |    45 | 
|     2 |    83 |    54 |     8 |     5 | 
|     3 |    54 |    33 |    55 |    54 | 
|     4 |    48 |     6 |     8 |     0 | 
|     5 |     4 |     2 |     1 |     2 | 
+–––––––+–––––––+–––––––+–––––––+–––––––+

> diff a.cpp a.cpp.orig
24,26c24,26
< //        Skaito(CmasA, A, n, m);
< //        Papildo(A, n, m);
< //        Spausd(A, n, m); 
---
>         Skaito(CmasA, A, n, m);
>         Papildo(A, n, m);
>         Spausd(A, n, m); 
61,63c61
<       
<      Papildo(M, n, m);
<   
---
>         
81c79
<         fr << " | " << setw(5) << n+1 << " | ";
---
>         fr << " | " << setw(5) << n << " | ";
91c89
<       fr << setw(5) << kiekis << " | "; 
---
>                         fr << setw(5) << kiekis;
94d91
<       fr << endl;

 

Jei sito outputo nesupranti tai bad for you.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man vistiek neveikia, gal tiesiog gali kode pakeisti?

 

Aš kaip galvojau, tai pirma reikia atlikti f-ją papildo, ten suranda tuos skaičius, o tada su funkcija spausd. viską atspausdinti.. Nepavyksta realizuoti visko taip.

Redagavo liksas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...