Problema c++ (matrice)


  1. #1
    0-day Member aniuca reprezinta o cantitate neglijabila
    Data de inscriere
    10-02-2009
    Varsta
    35
    Sex
    F
    Mesaje
    2
    Putere Reputatie
    0
    Reputatie
    10
    Puncte CF
    0.0

    Problema c++ (matrice)

    Am de rezolvat urmatoarea problema:
    Se citesc de la tastatura 4 numere intregi: n,k,a,b
    Se completeaza o matrice patratica cu n linii si n coloane astfel: pe linia k valoarea a, pe coloana k valoarea b, si in rest cu 0.
    Sa se afiseze matrice construita

    Am facut asa, dar am o eroare, asa imi spune la compilare. Unde am gresit?

    #include<iostream>
    using namespace std;
    int main()
    {
    int n,k,a,b,i,j,m[20][20];

    cout<<"dati n";
    cin>>n;
    cout<<"dati k";
    cin>>k;
    cout<<"dati a";
    cin>>a;
    cout<<"dati b";
    cin>>b;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
    if(i==k)
    m[i][j]=a;
    else
    if(j==k)
    m[i][j]=b;
    else
    m[i][j]=0;

    }
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=n;j++)
    cout<<a[i][j]<<endl;

    }
    return 0;
    }

  2. #2
    Member alex707's Avatar alex707 reprezinta o cantitate neglijabila
    Data de inscriere
    28-09-2006
    Varsta
    43
    Sex
    M
    Mesaje
    183
    Mesaje bazar
    63
    Putere Reputatie
    0
    Reputatie
    8
    Puncte CF
    30.0
    Cod:
    cout<<a[i][j]<<endl;
    Variabila "a" asa cum e definita la inceput este un integer, probabil ca ai vrut sa scrii m[i][j]. Asta ar fi singura problema de compilare

    Restul problemelor nu te impiedica sa-ti compilezi programul dar outputul probabil ca nu va fi cel la care te astepti.
    Ar fi o problema ca unele for-uri si if-uri nu au acolade. E intotdeauna o idee buna sa pui acolade chiar daca dupa if, else, for sau whatever ai o singura linie, evita confuziile si e mai clar.
    Last edited by alex707; 10-05-2013 at 15:56.
    Success is not final, failure is not fatal: it is the courage to continue that counts. --Sir Winston Churchill
    Vrei mai putine reclame? Inregistreaza-te sau logheaza-te

  3. #3
    Newcomer rhododendron's Avatar rhododendron reprezinta o cantitate neglijabila
    Data de inscriere
    06-03-2007
    Varsta
    38
    Sex
    M
    Mesaje
    20
    Mesaje bazar
    4
    Putere Reputatie
    0
    Reputatie
    1
    Puncte CF
    0.0
    Parerea mea ar fi urmatoarea, desi cred ca a trecut mult timp de cand ai postat, dar totusi:

    for (int i=0;i<n;i++)
    for (int j=0;j<n;j++) {
    if (i==k) x[k][j] = a;
    if (j==k) x[i][k] = b;
    x[k][k]=-1; // asta pentru ca apare conflict, intre valorile a si b. Acestea fiind diferite nu pot aparea simultan la //intersectia liniei k cu coloana k, si atunci se pune o alta valoarea la intersectia lor.
    }
    for (int i=0; i<n; i++) {
    cout<<(" ");
    for (int j=0; j<n; j++) {
    cout<<(x[i][j]+"\t");
    }
    }

  4. #4
    Member alex707's Avatar alex707 reprezinta o cantitate neglijabila
    Data de inscriere
    28-09-2006
    Varsta
    43
    Sex
    M
    Mesaje
    183
    Mesaje bazar
    63
    Putere Reputatie
    0
    Reputatie
    8
    Puncte CF
    30.0
    Am urmatoarele probleme cu solutia ta:

    - nu ai pus partea in care initializezi dinamic un array multidimensional cu n coloane si n linii, care banuiesc eu ca este scopul real al exercitiului astuia, adica:
    Cod:
    int **x;
    cin>>n;
    x = new int*[n];
    for (int i = 0; i < n; i++)
    {
    	x[i] = new int[n];
    }
    - nu initializezi niciunde restul valorilor x[i][j] cu 0 asa ca iti vor aparea ca -842150451 (0xCDCDCDCD);
    - linia asta:
    Cod:
    x[k][k]=-1;
    se va executa pentru fiecare membru al matricei aka foarte redundant. Pentru orice n asignarea x[k][k] se va executa de n la patrat ori lungindu-ti inutil executia. Corect ar fi asignarea x[k][k] astea sa o scoti in afara for-ului ca sa se execute o singura data. Plus de asta, eu interpretez ca ar trebui sa fie 0 la intersectia coloanei k cu linia k (linia k > a, coloana k > b, in rest 0).
    - linia asta:
    Cod:
    cout<<(x[i][j]+"\t");
    nu este corecta, iti va aduna niste valori acolo si nu iti face concatenare - ai putea sa folosesti str_cpy dar mai simplu este:
    Cod:
    cout<<(x[i][j]);
    cout<<'\t'; //ghilimea (single quote) in loc de double quote printeaza un char
    P.S. Foloseste code blocks ca sa arate codul bine.
    Cod:
    // Codul arata mai bine daca il scrii intre tag-uri [ CODE][ /CODE] - fara spatiu dupa paranteza - sau folosesti butonul "#" din advanced message editor
    #include<iostream>
    using namespace std;
    int main()
    {
    	int n,k,a,b;
    	int **x;//initializezi x ca fiind pointer catre un pointer
    
    	cout<<"dati n";
    	cin>>n;
    	cout<<"dati k";
    	cin>>k;
    	cout<<"dati a";
    	cin>>a;
    	cout<<"dati b";
    	cin>>b;
    	k = k - 1; //pentru a avea logica matematica linia k a matricei este k-1 programatic
    	x = new int*[n];//initializezi prima dimensiune a lui x
    	for (int i = 0; i < n; i++)
    	{
    		x[i] = new int[n];//iterezi si initializezi a doua dimensiune a lui x
    	}
    	// de aici poti sa apelezi x ca un array multidimensional normal; Partea de initializare poti sa o incluzi si mai jos,
    	// dar este mai clar asa cum se initializeaza dinamic un array multidimensional
    	for (int i=0;i<n;i++)
    	{
    		for (int j=0;j<n;j++) {
    			x[i][j] = 0;
    			if (i==k) x[k][j] = a; 
    			if (j==k) x[i][k] = b;
    		}
    	}
    	x[k][k]=0;
    	for (int i=0; i<n; i++) {
    		cout<<(" ");
    		for (int j=0; j<n; j++) {
    			cout<<(x[i][j]);
    			cout<<'\t';
    		}
    		cout<<'\n';
    	}
    	system("pause");
    	return 0;
    }
    Success is not final, failure is not fatal: it is the courage to continue that counts. --Sir Winston Churchill

  5. #5
    Newcomer rhododendron's Avatar rhododendron reprezinta o cantitate neglijabila
    Data de inscriere
    06-03-2007
    Varsta
    38
    Sex
    M
    Mesaje
    20
    Mesaje bazar
    4
    Putere Reputatie
    0
    Reputatie
    1
    Puncte CF
    0.0
    Codul scris de mine e in Java, dupa care l-am adaptat la C++. Iar in C++ nu am mai scris cod de cativa ani, parese ca am uitat, de asta e posibil sa ai dreptate la problema cu initializarea(unde in Java se initializeaza automat cu valoarea implicita) si cu acel -> +"\t" <- , care nu are valoarea din Java. Dar, totusi, in enunt nu se specifica faptul ca ar trebui folositi pointeri. Iar acolo unde zici ca initializezi sirul, cu ce valoare e initializat? Poate doar il creezi in memorie, nu il si initializezi.

  6. #6
    Member alex707's Avatar alex707 reprezinta o cantitate neglijabila
    Data de inscriere
    28-09-2006
    Varsta
    43
    Sex
    M
    Mesaje
    183
    Mesaje bazar
    63
    Putere Reputatie
    0
    Reputatie
    8
    Puncte CF
    30.0
    Citat Mesaj iniţiat de rhododendron Vezi mesajele
    Codul scris de mine e in Java, dupa care l-am adaptat la C++. Iar in C++ nu am mai scris cod de cativa ani, parese ca am uitat, de asta e posibil sa ai dreptate la problema cu initializarea(unde in Java se initializeaza automat cu valoarea implicita) si cu acel -> +"\t" <- , care nu are valoarea din Java. Dar, totusi, in enunt nu se specifica faptul ca ar trebui folositi pointeri. Iar acolo unde zici ca initializezi sirul, cu ce valoare e initializat? Poate doar il creezi in memorie, nu il si initializezi.
    Daca stii alta modalitate sa creezi dinamic un array multidimensional fara pointeri please share.
    Success is not final, failure is not fatal: it is the courage to continue that counts. --Sir Winston Churchill

  7. #7
    Member alex707's Avatar alex707 reprezinta o cantitate neglijabila
    Data de inscriere
    28-09-2006
    Varsta
    43
    Sex
    M
    Mesaje
    183
    Mesaje bazar
    63
    Putere Reputatie
    0
    Reputatie
    8
    Puncte CF
    30.0
    Daca prin sir te referi la matrice, se aloca memoria in care se vor asigna valorile, se initializeaza cu valoarea default (0xCDCDCDCD). Valorile corecte se asigneaza in for.
    Success is not final, failure is not fatal: it is the courage to continue that counts. --Sir Winston Churchill
    Vrei mai putine reclame? Inregistreaza-te sau logheaza-te

Tags for this Thread

Google+

Cautati logo-ul CraiovaForum?

Iata cateva variante: