» »

Naloga z Matrikami v c++

Naloga z Matrikami v c++

zweistein ::

Dana je matrika celih števil MAT1 mxn. Napišite program, ki prek tipkovnice prebere matriko
MAT1 in podprogram (funkcijo), ki bo ustvaril novo matriko realnih števil MAT2 na naslednji
način.

Če je nek element matrike MAT1:

– pozitivno število, naj bo to dolžina stranice kocke a in v matriko MAT2 vpišite površino
( P=6⋅a² ) te kocke;

– če je negativno število, vpišite v matriko MAT2 tretjo potenco tega št.;

– če je enak 0, pa v MAT2 vpišite vsoto absolutnih vrednosti pripadajočega stolpca matrike
MAT1, kjer se element nahaja.

Števili m,n in matrika MAT1,MAT2 so vhodni parametri podprograma.
Za lažje preverjanje napišite tudi podprogram za izpis matrike.

#include <cstdlib>
#include <iostream>

using namespace std;

void preberi(int**MAT1, int aV, int aS){
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
                  cout << "[" << i << "," << j << "]=" ;
                  cin >> MAT1[i][j];
                  cout << "\n";
             }
         }
     }

void izpis(int**MAT1, int aV, int aS){
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
                  cout << MAT1[i][j] << "  ";
             }
             cout << endl;
         }
         cout << endl;
     }


void spremeni (int**MAT1, double**MAT2, int aV, int aS){
     int stevilo;
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
             MAT1[i][j]=stevilo;
             
         
         if (stevilo < 0){
                     double kub=stevilo*stevilo*stevilo;
                     MAT2[i][j]=kub;
                     }
                     else if (stevilo > 0){
                          double P = 6*stevilo*stevilo;
                          
                          }
                          cout <<"\nNova matrika je\n" << MAT2[i][j];
                     }
}
}
                        
 
 void izpis2(double**MAT2, int aV, int aS){
      cout << endl << endl;
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
                  cout << MAT2[i][j] << "  ";
             }
             cout << endl;
         }
         cout << endl;
     }
                        
int main(int argc, char *argv[])
{
    
int a,b;
int vrstica, stolpec;

cout << "Vrstic je ";
cin >> a;
cout << "Stolpcev je ";
cin >> b;

int**matrika;
matrika= new int*[a];

for (int k=0; k<a; k++){
    matrika[k]=new int[b];
}


double**matrika2;
matrika2= new double*[a];

for (int k=0; k<a; k++){
    matrika2[k]=new double[b];
}

preberi(matrika, a, b);
izpis(matrika, a, b);
spremeni(matrika, matrika2, a, b);
izpis2(matrika2, a, b);
    
    
    
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}



Ampak mi pride vse narobe v drugi matriki.

zweistein ::

Aja, pozabil sem napisat, da ne vem, kako bi matriki povezal in zakaj ni zgornja koda pravilna?
Čas za to nalogo imam le do jutrijšnega jutra.

Zakaj noče noben odgovorit? :)

Zgodovina sprememb…

sbandur84 ::

Malo prepozn si, jaz grem tudi spat..

Zgodovina sprememb…

Tutankhamun ::

Edin ena razlika je od tvoje kode je, da ne uporabljam vhodnih spremenljivk m in n. Sm prepozn to vidu, pa se mi ne da spreminjat. Lahk tut ti, sej ni velik za popravt.

void preberi (int *MAT1, int allFields)
{
	for (int i = 0; i < allFields; i++)
		cin >> MAT1 [i];
}

void izpis (int *MAT1, int allFields, int rowLen)
{
	for (int i = 0; i < allFields; i++)
	{
		cout.width (6);
		cout << MAT1 [i];

		if ((i+1) % rowLen == 0)
			cout << endl;
	}
}


void spremeni (int *MAT1, double *MAT2, int allFields, int rowLen)
{
	for (int i = 0; i < allFields; i++)
	{
		if (MAT1 [i] > 0) // pozitivno število
		{
			MAT2 [i] = 6 * (MAT1 [i] * MAT1 [i]);
			continue;
		}
		else if (MAT1 [i] < 0) // negativno število
		{
			MAT2 [i] = MAT1 [i] * MAT1 [i] * MAT1 [i];
			continue;
		}

		// nula
		
		int iCol, iRow, index;
		double avr = 0;

		iCol = i % rowLen;
		iRow = 0;
		avr = 0;
		while ((index = iRow * rowLen + iCol) < allFields)
		{
			avr += abs (MAT1 [index]);
			iRow++;
		}
			
		MAT2 [i] = avr / iRow;
	}
}
                        
 
 void izpis2(double *MAT2, int allFields, int rowLen)
 {
	for (int i = 0; i < allFields; i++)
	{
		cout.width (6);
		cout.precision (2);
		cout << MAT2 [i];

		if ((i+1) % rowLen == 0)
			cout << endl;
	}
}
                        
int main(int argc, char *argv[])
{
	int a,b;
	int vrstica, stolpec;

	cout << "Vrstic je ";	cin >> a;
	cout << "Stolpcev je "; cin >> b;

	int *matrika = new int [a*b];
	double *matrika2 = new double [a*b];

	preberi(matrika, a*b);
	izpis(matrika, a*b, b);
	spremeni(matrika, matrika2, a*b, b);
	izpis2(matrika2, a*b, b);
	   
    system("PAUSE");
    return EXIT_SUCCESS;
}
AMD Phenom QUAD 9950 Black Edition, 8GB

zweistein ::

Hvala, res je uspelo, ampak problem imam pri matriki, katero polje je enako 0. Takrat moram izračunati absolutne vrednosti tistega stolpca, v katerem se ta 0 pojavi in v drugo matriko na tisto mesto vpisati vsoto teh absolutnih vrednosti.

Napisal si že nekaj, vendar tega ne razumem. Ali lahko v mojem programu napišeš tisti del (v 1.postu bom popravil kodo)

Ojej, postov za nazaj se ne da popravljati!

KODA:
#include <cstdlib>
#include <iostream>

using namespace std;

void preberi(int**MAT1, int aV, int aS){
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
                  cout << "[" << i << "," << j << "]=" ;
                  cin >> MAT1[i][j];
                  cout << "\n";
             }
         }
     }

void izpis(int**MAT1, int aV, int aS){
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
                  cout << MAT1[i][j] << "  ";
             }
             cout << endl;
         }
         cout << endl;
     }


void spremeni (int**MAT1, double**MAT2, int aV, int aS){
     int stevilo;
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
		if (MAT1 [i][j] > 0) // pozitivno število
		{
			MAT2 [i][j] = 6 * (MAT1 [i][j] * MAT1 [i][j]);
			continue;

		}
		else if (MAT1 [i][j] < 0) // negativno število
		{
			MAT2 [i][j] = MAT1 [i][j] * MAT1 [i][j] * MAT1 [i][j];
			continue;

		}
		else if (MAT1 [i][j] == 0){
             int rez=0;
             for (int I=0; I<aV; I++){
                 MAT1[I][j];
                     if ((MAT1 [I][j] < 0){
                               rez = rez -(MAT1 [I][j])
                               continue;
                               }
                     rez = rez + MAT1 [I][j];
                     MAT2 [i][j] = rez;
                     }
                 }
}
}
}
                        
 
 void izpis2(double**MAT2, int aV, int aS){
      cout << endl << endl;
     for (int i=0; i<aV; i++){
         for (int j=0; j<aS; j++){
                  cout << MAT2[i][j] << "  ";
             }
             cout << endl;
         }
         cout << endl;
     }
                        
int main(int argc, char *argv[])
{
    
int a,b;
int vrstica, stolpec;

cout << "Vrstic je ";
cin >> a;
cout << "Stolpcev je ";
cin >> b;

int**matrika;
matrika= new int*[a];

for (int k=0; k<a; k++){
    matrika[k]=new int[b];
}


double**matrika2;
matrika2= new double*[a];

for (int k=0; k<a; k++){
    matrika2[k]=new double[b];
}

preberi(matrika, a, b);
izpis(matrika, a, b);
spremeni(matrika, matrika2, a, b);
izpis2(matrika2, a, b);
    
    
    
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Zgodovina sprememb…

Tutankhamun ::

Uf sm se učer nategnu, sm mislu da morš zračunat povprečje absolutnih vrednosti v stolpcu... Nevem kje sm najdu povprečje :D

No tko, zdej sm tvojo popravu, nism pa testiru.
void spremeni (int**MAT1, double**MAT2, int aV, int aS)
{
    int stevilo;
	for (int i=0; i<aV; i++)
	{
		for (int j=0; j<aS; j++)
		{
			if (MAT1 [i][j] > 0) // pozitivno število
			{
				MAT2 [i][j] = 6 * (MAT1 [i][j] * MAT1 [i][j]);
				continue;

			}
			else if (MAT1 [i][j] < 0) // negativno število
			{
				MAT2 [i][j] = MAT1 [i][j] * MAT1 [i][j] * MAT1 [i][j];
				continue;

			}
			

			int rez=0;
			for (int I=0; I<aV; I++)
			{
				if (MAT1 [I][j] < 0)
				{
					rez += abs (MAT1 [I][j]); // zaradi abs moraš includat math.h
					continue;
				}
			}

			MAT2 [i][j] = rez;
		}
	}
}
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

zweistein ::

Podano je polje celih &sup2;tevil POLJE1. Napi&sup2;ite podprogram s spodnjo
deklaracijo, ki iz polja POLJE1 tvori novo polje celih &sup2;tevil POLJE2 in
sicer v POLJE2 shranite &sup2;tevilo cifer v istole&ordm;nem &sup2;tevilu prvega polja.
’tevilo aN v deklaraciji podprograma je dol&ordm;ina polja POLJE1. Prostor
za polje POLJE2 rezervirate znotraj podprograma. Polje POLJE2 je
rezultat funkcije.
int* tvori(int* polje1, int aN);

"
-Ker nisem videl, da moram delati nalogo za polja, sem delal za matrike, in prosim, da mi kdo popravi, kar je narobe, ker mi druge matrike ne izriše (še vedno hočem rešiti nalogo za matrike.)
-Ali je možno rešiti nalogo z int*tvori(...)?
"

#include <cstdlib>
#include <iostream>
using namespace std;

void napolni (int**MAT1, int v, int s){
     for (int i=0; i<v; i++){
         for (int j=0; j<s; j++){
             cout << "[ " << i << ", " << j << " ] = ";
             cin >> MAT1[i][j];
         }
     }
}

void izpis (int**MAT1, int v, int s){
     for (int i=0; i<v; i++){
         for (int j=0; j<s; j++){
             cout << MAT1[i][j] << "  ";
         }
         cout << endl;
     }
     cout << endl;
}

void tvori (int**MAT1, int**MAT2, int v, int s){
     int k=0;
     int w;
     for (int i=0; i<v; i++){
         for (int j=0; j<s; j++){
             do {
                 w = MAT1[i][j]/10;
                 k++;
                 }
                 while (w != 0);
                 MAT2[i][j]=k;
         }
     }
}

using namespace std;

int main(int argc, char *argv[])
{
    int vrstica, stolpec;
    cout << "Stevilo vrstic = ";
    cin >> vrstica;
    cout << "Stevilo stolpcev = ";
    cin >> stolpec;
    
    int**matrika;
    matrika = new int*[vrstica];
    for (int k=0; k<vrstica; k++)
    matrika[vrstica] = new int[stolpec];
    
    int**matrika2;
    matrika2 = new int*[vrstica];
    for (int k=0; k<vrstica; k++)
    matrika2[vrstica] = new int[stolpec];
    
    
    napolni (matrika, vrstica, stolpec);
    izpis (matrika, vrstica, stolpec);
    tvori (matrika, matrika2, vrstica, stolpec);
    izpis (matrika2, vrstica, stolpec);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Zgodovina sprememb…

Tutankhamun ::

Veš kok se težko prebere kar si napisu (ČŽŠ-ji). Drgač pa ne zastopm, kaj naloga zahteva, pa kaj bi rad.
AMD Phenom QUAD 9950 Black Edition, 8GB

zweistein ::

Podano je polje celih števil POLJE1. Napišite podprogram s spodnjo
deklaracijo, ki iz polja POLJE1 tvori novo polje celih števil POLJE2 in
sicer v POLJE2 shranite število cifer v istoležnem številu prvega polja.
Število aN v deklaraciji podprograma je dolžina polja POLJE1. Prostor
za polje POLJE2 rezervirate znotraj podprograma. Polje POLJE2 je
rezultat funkcije.
int* tvori(int* polje1, int aN);

"
-Ker nisem videl, da moram delati nalogo za polja, sem delal za matrike, in prosim, da mi kdo popravi, kar je narobe, ker mi druge matrike ne izriše (še vedno hočem rešiti nalogo za matrike.)
-Ali je možno rešiti nalogo z int*tvori(...)?
"

Vse, kar bi rad, je da bi rešil nalogo (ne vem, zakaj mi ni uspelo), ampak, namesto polj, ki so v navodilu naloge, bi rad uporabil matrike.

Zgodovina sprememb…

Tutankhamun ::

Sam a veš česa ne zastopm, kaj pomen tole

v POLJE2 shranite število cifer v istoležnem številu prvega polja


Drgač pa ne zastopm zakaj bi delu z matrikam?
AMD Phenom QUAD 9950 Black Edition, 8GB

zweistein ::

To pomeni, da če je v 1.polju npr število 198, se v drugo shrani število 3, ker št. 198 vsebuje 3 števke/cifre.

Saj je lahko naloga tudi v poljih, ampak jaz sem se zaj*, in šel delati za matrike, zdaj pa hočem temu priti do konca :)
(ampak sploh ne vem, če je to možno narediti z funkcijo, kot v navodilu piše).

Zgodovina sprememb…

Tutankhamun ::

To kar si ti začel si ustrelu čist mim, ne rabiš 2 dimenzionalnga polja. Tko da kr kuj nehi z 2d poljem, pa lepo naredi 1d polje.

Evo tko kot sm te zastopu.
#include "iostream"
#include "string"
#include "sstream"

using namespace std;

int * funkcija (int *polje, int aN)
{
	ostringstream oss; // objekt, ki ga tukaj rabimo samo za dolocitev stevila digitov

	int *polje2 = new int [aN];
	
	for (int i = 0; i < aN; i++)
	{
		oss.str (""); // reset
		oss << polje [i]; // stevilko pretvori v string
		polje2 [i] = oss.str ().size (); // dobi ta string in povej njegovo dolzino

		/*
		Lahko pa namesto tistega zgoraj naredis neki takega

		char tmp [10];
		itoa (polje [i], tmp); // spremeni stevilko v string
		polje2 [i] = strlen (tmp); // dobi dolzino stringa
		*/
	}

	return polje2;
}


int main (int argc, char *argv[])
{
	int *POLJE1, *POLJE2;
	int velikostPolja;

	cout << "Vnesi velikost polja: ";
	cin >> velikostPolja;

	// kreiras polja izbrane velikosti
	POLJE1 = new int [velikostPolja];

	// zdej v to polje zapisemo vrednosti 
	for (int i = 0; i < velikostPolja; i++)
	{
		cout << "Vnesi " << i << ". vrednost: ";
		cin >> POLJE1 [i];
	}

	POLJE2 = funkcija (POLJE1, velikostPolja);

	// izpis 
	for (int i = 0; i < velikostPolja; i++)
	{
		cout << "Stevilo digitov v " << i << "tem polju je " << POLJE2 [i] << endl;
	}

	// na koncu vse lepo pospravimo za sabo :D
	delete [] POLJE1, POLJE1 = NULL;
	delete [] POLJE2, POLJE2 = NULL;

	return 0;
}


Lahko da je kje kakšna napaka. Ura je velik... Sam tok sm naredu da se prevede, ostalo pa prever.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

FERI-nasveti!

Oddelek: Šola
3011406 (9951) tony1
»

programiranje v c++

Oddelek: Programiranje
51780 (1546) Tutankhamun
»

Program v C

Oddelek: Programiranje
51840 (1679) darkkk
»

Vantec Tornado Regulator

Oddelek: Kaj kupiti
211202 (1024) burkiburke
»

UNI ali VSŠ - to je ZDAJ vprašanje? (na elektro mislm)

Oddelek: Šola
171797 (731) TribesMan

Več podobnih tem