Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227

    [c] Programma prodotto matriciale

    Dati in input due numeri n ed m, il programma deve chedere in input due vettori di dimensioni n ed m e farne il prodotto matriciale(cioè una matrice nxm le cui righe sono ottenute moltiplicando l'i-esimo elemento del primo vettore per tutti gli elementi dell'altro).
    Io ho fatto così, ma il risultato del prodotto matriciale viene un semplice 0:
    #include<stdio.h>
    #include<stdlib.h>

    main()
    {
    int n, m, i, j, vet1[100], vet2[100], pvet[100][100];

    do{
    printf("Inserire dimensione del primo vettore: \n");
    scanf("%d", &n);}
    while(n>100 || n<1);
    for(i=0; i<n; i++){
    printf("Inserire elemento %d del primo vettore: ", i);
    scanf("%d", &vet1[i]);}
    do{
    printf("\nInserire dimensione del secondo vettore: \n");
    scanf("%d", &m);}
    while(m>100 || m<1);
    for(j=0; j<m; j++){
    printf("Inserire elemento %d del secondo vettore: ", j);
    scanf("%d", &vet2[j]);}


    for (i=0; i<=n; i++)
    for(j=0; j<=m; j++){
    pvet[i][j]= vet1[i] * vet2[j];
    }

    printf("\nProdotto matriciale tra i due vettori: %d", pvet[i][j]);

    system("pause");
    }
    Grazie in anticipo... inoltre mi potreste dare un'idea per come calcolare il determinante di una matrice quadrata?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Scusa ma con questa istruzione

    printf("\nProdotto matriciale tra i due vettori: %d", pvet[i][j]);

    cosa intendi visualizzare?

    Supponiamo che n sia 5 e che j sia 4. Quando il controllo del programma esce da quei due for innestati, i e j varranno rispettivamente 6 e 5, e con quella printf tu stampi l'elemento della matrice che ha appunto quegli indici... ma questo è "normale" che sia 0 perché a quell'elemento non fai alcuna assegnazione e quindi conserva il valore che aveva al momento dell'inizializzazione, cioè 0.

    Tra l'altro, se n e m sono le dimensioni dei vettori, i due for dovrebbero terminare per valori degli indici strettamente minori (e non minori-uguali) delle dimensioni.

    Per visualizzare i valori di una matrice devi di nuovo ricorrere ad un doppio for annidato come quello che hai scritto, con la correzione che ti suggerivo nelle righe precedenti.
    every day above ground is a good one

  3. #3
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    ah ecco dov'era l'errore... si, alla fine vorrei stampare la matrice... quindi devo fare così:

    for (i=0; i<n; i++)
    for(j=0; j<m; j++){
    pvet[i][j]= vet1[i] * vet2[j];
    }

    for (i=0; i<n; i++){
    for(j=0; j<m; j++){
    printf("\nProdotto matriciale tra i due vettori: %d", pvet[i][j]);
    }
    printf("\n");
    }
    printf("\n");
    si l'ho provato è viene... però non riesco a visualizzare la matrice messa per bene cioè
    a b c
    d e f
    g h i
    Ma me la mette in colonna e visualizza sempre Prodotto matriciale tra i due vettori

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Basta semplicemente modificare l'istruzione di stampa, no?

    codice:
    for ( i = 0; i < n; i++ ) {
       for ( j = 0; j < m; j++ )
          printf("%d ", pvet[i][j]);
       printf("\n");
    }
    
    printf("\n");
    every day above ground is a good one

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    @abbax. Quando posti del codice usa i tag CODE, non i tag QUOTE... la differenza la vedi tra i tuoi post e quello di YuYevon.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    Ok... scusami. Comunque grazie mille per la disponibilità e scusate se ne approfitto così tanto... ho un'altro codice che praticamente deve calcolare la tracia di una matrice quadrata (e torna), poi creare un vettore colonna i cui elementi sono le somme degli elementi di ciascuna riga della matrice (cioè: prima riga vettore= somma prima riga matrice)... e questo non so perchè ma visualizza un vettore colonna che ha elementi tutti uguali e sono la somma dell'ultima rigs della matrice. Poi dovrei stampare un'altra matrice che è uguale alla prima e poi ha aggiunta come ultima colonna il vettore calcolato in precedenza, ma qui ancora non c'ho messo mano e sinceramente non saprei da dove iniziare :master: . Spero di essere stato chiaro. Il codice è questo:
    codice:
    /*Matrice quadrata di ordine N: 
    calcola traccia, calcola vettore colonna elementi 
    somme riga matrice*/
    #include<stdio.h>
    #include<stdlib.h>
    #define MAXDIM 100
    main()
    {
    int mat[MAXDIM][MAXDIM], traccia;
    int n, i, j;
    do{
    printf("Dimensione: ");
    scanf("%d", &n);
    }
    while ((n>=MAXDIM) || (n<1));
    for (i=0; i<n;i++)
     for (j=0; j<n;j++){
    printf("Inserire linea %d colonna %d :", i, j);
    scanf("%d", &mat[i][j]);
    }
    for (i=0; i<n;i++){
    printf("\n");
     for (j=0; j<n;j++)
     printf("%5d", mat[i][j]);
    }
    traccia=0;
    for(i=0; i<n; i++){
             traccia+=mat[i][i];
    }
    printf("\nLa traccia è %d", traccia);
    printf("\n\n\n");
    
    int vet[MAXDIM][0], m, z;
    m=0;
    for (i=0;i<n;i++){
        vet[m][0]=0;
        for(j=0;j<n;j++){
          vet[m][0]+=mat[i][j];
          }
        m++;
    }
    for (m=0; m<n;m++){
    printf("\n");
     for (z=0; z<1;z++)
     printf("%5d", vet[m][0]);
    }
    system("pause");
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Questa dichiarazione:

    codice:
    int vet[MAXDIM][0]
    è errata: stai dichiarando una matrice di MAXDIM (=100) righe e 0 colonne... cioè una matrice che ha 100 righe di lunghezza 0. Forse volevi scrivere

    codice:
    int vet[MAXDIM][1]
    ma a questo punto perché non ricorrere ad un semplice array "vet[MAXDIM]" ?

    Poi, anche questo è strano:

    codice:
    for (m=0; m<n;m++){
    printf("\n");
     for (z=0; z<1;z++)
     printf("%5d", vet[m][0]);
    }
    a cosa serve quel ciclo for interno? La risposta mi sembra semplicemente "a niente"... cioè "ripeti per una volta" l'istruzione printf(), e a che pro? Non potevi direttamente scrivere la printf()?

    Poi dovrei stampare un'altra matrice che è uguale alla prima e poi ha aggiunta come ultima colonna il vettore calcolato in precedenza, ma qui ancora non c'ho messo mano e sinceramente non saprei da dove iniziare.
    Ma hai studiato per caso l'allocazione dinamica della memoria?
    every day above ground is a good one

  8. #8
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    La malloc? Si, però la so usare maluccio. Per il ciclo: l'ho fatto perchè vorrei stampare il vettore in colonna... non si fa così?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da abbax
    La malloc? Si, però la so usare maluccio.
    Non è solo la malloc. C'è anche la realloc() che penso si debba usare in questo caso, visto che devi praticamente "espandere" la matrice di partenza. Questo ovviamente puoi farlo solo dopo aver allocato dinamicamente la matrice e non staticamente come hai fatto tu... ma magari per risolvere questo problema c'è anche qualche altro modo che al momento mi sfugge.

    Per il ciclo: l'ho fatto perchè vorrei stampare il vettore in colonna... non si fa così?
    Diciamo di sì, ma a cosa serve

    for (z=0; z<1;z++)

    ?

    E' un for che viene ripetuto una sola volta... quindi che senso ha? Tanto vale eliminarlo. Per stampare quel "vettore colonna" puoi semplicemente fare così:

    codice:
    for (m=0; m<n;m++){
    printf("\n");
     /* qui ho tolto quel for inutile */
     printf("%5d", vet[m][0]);
    }
    questo ovviamente dopo aver apportato quella correzione che ti dicevo alla dichiarazione della matrice vet, altrimenti non funzionerà comunque niente.

    Ah un'altra cosa: se programmi in C, evita di ricorrere alle dichiarazioni di variabili posticipate nel codice, cioè non all'inizio della funzione perché è una caratteristica del C++.
    every day above ground is a good one

  10. #10
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    ora è tutto risolto... grazie milla. Mi manca solo l'ultima parte, solo non so nemmeno come allocare dinamicamente una matrice... me lo potresti spiegare? Grazie mille(quanta pazienza che ci vuole con me )

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.