Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    3

    aiuto programma c++!

    Salve a tutti, innanzitutto mi presento, mi chiamo Davide e sono un programmatore alle prime armi..mi ritrovo alle prese con un programma che qui di seguito espongo:

    Scrivere un programma in linguaggio C che dopo aver acquisito da tastiera una matrice A di interi verifichi, per ogni elemento a[i][j], se è un divisore della somma s degli elementi ad esso adiacenti e, in caso affermativo, sostituisca a[i][j] con s/a[i][j]. La scansione della matrice deve quindi continuare nell'ordine stabilito e ripartire dall'inizio finchè nessun elemento verifichi la condizione sopra detta o comunque dopo un fissato numero massimo di iterazioni. Si visualizzi, ad ogni sostituzione, la matrice come risulta prima e dopo la sostituzione stessa.

    Sono riuscito ad elaborare il seguente codice:

    #include <stdio.h>
    # define nmax 10
    # define mmax 10
    void visualizza(int[][mmax],int,int);
    void carica(int[][mmax],int *,int *);
    void calcola_somma(int[][mmax],int,int,int [][mmax]);
    int calcola_somma_up(int v[][mmax],int,int,int,int);
    int calcola_somma_down(int v[][mmax],int,int,int,int);
    int calcola_somma_left(int v[][mmax],int,int,int,int);
    int calcola_somma_right(int v[][mmax],int,int,int,int);
    void confronto(int[][mmax],int[][mmax],int,int);
    int main(){
    int v[nmax][mmax];
    int n,m,s,p[nmax][mmax];
    carica(v,&n,&m);
    visualizza(v,n,m);
    calcola_somma(v,n,m,p);
    confronto(v,p,n,m);
    getchar();
    getchar();
    }
    void carica(int v[][mmax],int *n,int *m){ //caricamento matrice
    int i,j;
    do{
    printf("\ninserisci numero righe: ");
    scanf("%d",n);
    }while(*n<=0 || *n>nmax);
    do{
    printf("\ninserisci numero colonne: ");
    scanf("%d",m);
    }while(*m<=0 || *m>mmax);
    for(i=0;i<*n;i++)
    for(j=0;j<*m;j++){
    printf("\ninserisci matrice[%d][%d]: ",i,j);
    scanf("%d",&v[i][j]);}
    }
    void visualizza(int v[][mmax],int n,int m){ //visualizzazione matrice
    int i,j;
    printf("\n\n");
    for(i=0;i<n;i++){
    printf("\n");
    for(j=0;j<m;j++)
    printf("%4d",v[i][j]);
    }
    }
    void confronto(int v[][mmax], int p[][mmax],int n,int m){
    int i,j,k=0;
    for(i=0;i<n;i++){
    for(j=0;j<m;j++)
    if(p[i][j]%v[i][j]==0){
    k++;
    printf("\n\nmatrice prima della %d^ sostituzione:",k);
    visualizza(v,n,m); //matrice prima della sostituzione
    printf("\n\n");
    v[i][j]=p[i][j]/v[i][j];
    printf("matrice dopo la %d^ sostituzione:",k);
    visualizza(v,n,m);}} //matrice dopo la sostituzione
    confronto(v,p,n,m); //fa ripartire la scansione (e provoca l'errore)
    }
    int calcola_somma_up(int v[][mmax],int n,int m,int i,int j){ //se i=0
    int s;
    if(j=0)
    s=s+v[i][j+1]+v[i+1][j+1]+v[i+1][j];
    if(j=m-1)
    s=s+v[i+1][j]+v[i+1][j-1]+v[i][j-1];
    if(0<j<m-1)
    s=s+v[i][j-1]+v[i+1][j-1]+v[i+1][j]+v[i+1][j+1]+v[i][j+1];
    return s;
    }
    int calcola_somma_down(int v[][mmax],int n,int m,int i,int j){ //se i=n
    int s;
    if(j=0)
    s=s+v[i-1][j]+v[i-1][j+1]+v[i][j+1];
    if(j=m-1)
    s=s+v[i-1][j]+v[i-1][j-1]+v[i][j-1];
    if(0<j<m-1)
    s=s+v[i][j+1]+v[i-1][j+1]+v[i-1][j]+v[i-1][j-1]+v[i][j-1];
    return s;
    }
    int calcola_somma_left(int v[][mmax],int n,int m,int i,int j){ //se j=0
    int s;
    if(i=0)
    s=s+v[i][j+1]+v[i+1][j+1]+v[i+1][j];
    if(i=n-1)
    s=s+v[i-1][j]+v[i-1][j+1]+v[i][j+1];
    if(0<i<n-1)
    s=s+v[i-1][j]+v[i-1][j+1]+v[i][j+1]+v[i+1][j+1]+v[i+1][j];
    return s;
    }
    int calcola_somma_right(int v[][mmax],int n,int m,int i,int j){ //se j=m
    int s;
    if(i=0)
    s=s+v[i+1][j]+v[i+1][j-1]+v[i][j-1];
    if(i=n-1)
    s=s+v[i-1][j]+v[i-1][j-1]+v[i][j-1];
    if(0<i<n-1)
    s=s+v[i-1][j]+v[i-1][j-1]+v[i][j-1]+v[i+1][j-1]+v[i+1][j];
    return s;
    }
    void calcola_somma(int v[][mmax],int n,int m,int p[][mmax]){
    int i,j,s;
    for(i=0;i<n;i++){
    for(j=0;j<m;j++)
    s=0;
    {if(i=0)
    s=calcola_somma_up(v,n,m,i,j);
    if(i=n-1)
    s=calcola_somma_down(v,n,m,i,j);
    if(j=0)
    s=calcola_somma_left(v,n,m,i,j);
    if(j=m-1)
    s=calcola_somma_right(v,n,m,i,j);
    else s=s+v[i][j+1]+v[i+1][j+1]+v[i+1][j]+v[i+1][j-1]+v[i][j-1]+v[i-1][j-1]+v[i-1][j]+v[i-1][j+1];}
    p[i][j]=s;}
    }


    Però quando lo mando in esecuzione non da i risultati giusti, da dei numeri enormi..se non chiedo troppo potrei sapere perchè?
    Inoltre non capisco perchè (durante l'esecuzione)quando arriva il momento in cui dovrebbe essere richiamata ricorsivamente la funzione "confronto" appare l'errore di windows..(io uso Dev C++)

    Ringrazio anticipatamente chiunque voglia darmi una mano e complimenti per il forum!


  2. #2
    Nella funzione
    codice:
    void calcola_somma(int v[][mmax],int n,int m,int p[][mmax]){ 
    ...
    {if(i=0)  ??  :master: perchè la { prima dell'IF ?
    ...
    else s=s+v[i][j+1]+v[i+1][j+1]+v[i+1][j]+v[i+1][j-1]+v[i][j-1]+v[i-1][j-1]+v[i-1][j]+v[i-1][j+1];}  
    ??  :master: perchè la } ? Che blocco chiude ?
    Inoltre devi terminare la funzione main () con un return . Saluti

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    3
    ho già risolto il problema..
    adesso torna!!però ho bisogno di una condizione che faccia terminare la ricorsione della funzione confronto..altrimenti la ripete all'infinito!!

    qualcuno mi può aiutare?grazie mille..

  4. #4
    Originariamente inviato da mau85
    ho già risolto il problema..
    adesso torna!!però ho bisogno di una condizione che faccia terminare la ricorsione della funzione confronto..altrimenti la ripete all'infinito!!

    qualcuno mi può aiutare?grazie mille..
    Attenzione, con questa istruzione :
    codice:
    if(i=0)
    così effettui un'assegnazione non un controllo !
    Devi scrivere così :
    codice:
    if(i==0)
    con il doppio '==' !
    correggi tutte le if.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    3
    si ho già corretto, grazie mille..


    codice:
    #include <stdio.h>
    # define nmax 10
    # define mmax 10
    void visualizza(int[][mmax],int,int);
    void carica(int[][mmax],int *,int *);
    void calcola_somma(int[][mmax],int,int,int [][mmax]);
    void confronto(int[][mmax],int[][mmax],int,int);
    int main(){
    int v[nmax][mmax],n,m,s,p[nmax][mmax];
    carica(v,&n,&m);
    printf("\n\n\nLa matrice inserita risulta:");
    visualizza(v,n,m);
    calcola_somma(v,n,m,p);
    confronto(v,p,n,m);
    getchar();
    getchar();
    }
    void carica(int v[][mmax],int *n,int *m){  //caricamento matrice
    int i,j;
     do{
      printf("\ninserisci numero righe: ");
      scanf("%d",n);
     }while(*n<=0 || *n>nmax);
     do{
      printf("\ninserisci numero colonne: ");
      scanf("%d",m);
     }while(*m<=0 || *m>mmax);
     for(i=0;i<*n;i++)
      for(j=0;j<*m;j++){
      printf("\ninserisci matrice[%d][%d]: ",i,j);
      scanf("%d",&v[i][j]);}
    }
    void visualizza(int v[][mmax],int n,int m){   //visualizzazione matrice
    int i,j;
     printf("\n\n");
     for(i=0;i<n;i++){
      printf("\n");
      for(j=0;j<m;j++)
       printf("%4d",v[i][j]);
     }
    }
    void confronto(int v[][mmax], int p[][mmax],int n,int m){ 
    int i,j,k=0;            //confronta le due matrici
    for(i=0;i<n;i++){       //e sostituisce dove necessario    
     for(j=0;j<m;j++)
      if((p[i][j])%(v[i][j])==0){
       k++;
       printf("\n\n\nMatrice A prima della %d^ sostituzione:",k);
       visualizza(v,n,m);      //matrice prima della sostituzione
       printf("\n\n");   
       v[i][j]=(p[i][j])/(v[i][j]);
       printf("\nMatrice A dopo la %d^ sostituzione:",k);
       visualizza(v,n,m);}}     //matrice dopo la sostituzione
       confronto(v,p,n,m);          //qui la ricorsione continua all'infinito!          (***)
    }
    void calcola_somma(int v[][mmax],int n,int m,int p[][mmax]){
    int i,j,s;                //calcola le somme delle adiacenze
    for(i=0;i<n;i++){         //e le memorizza nella matrice p  
     for(j=0;j<m;j++){
      if(i==0 && j==0){         //primo elemento prima riga
       s=v[i+1][j+1]+v[i][j+1]+v[i+1][j];
       p[i][j]=s;}
      else 
       if(i==0 && j==m-1){       //ultimo elemento prima riga  
        s=v[i][j-1]+v[i+1][j-1]+v[i+1][j];
        p[i][j]=s;}
       else
        if(i==n-1 && j==0){      //primo elemento ultima riga  
         s=v[i-1][j]+v[i-1][j+1]+v[i][j+1];
         p[i][j]=s;}
        else 
         if(i==n-1 && j==m-1){    //ultimo elemento ultima riga
          s=v[i-1][j-1]+v[i][j-1]+v[i-1][j];
          p[i][j]=s;}
         else
          if(j==0 && 0<i<n-1){    //elementi centrali prima colonna
           s=v[i-1][j]+v[i-1][j+1]+v[i][j+1]+v[i+1][j+1]+v[i+1][j];
           p[i][j]=s;}
          else
           if(j==m-1 && 0<i<n-1){ //elementi centrali ultima colonna
            s=v[i-1][j]+v[i-1][j-1]+v[i][j-1]+v[i+1][j-1]+v[i+1][j];
            p[i][j]=s;}
           else
            if(i==0 && 0<j<m-1){   //elementi centrali prima riga
             s=v[i][j-1]+v[i+1][j-1]+v[i+1][j]+v[i+1][j+1]+v[i][j+1];
             p[i][j]=s;}
            else
             if(i==n-1 && 0<j<m-1){ //elementi centrali ultima riga 
              s=v[i][j+1]+v[i-1][j+1]+v[i-1][j]+v[i-1][j-1]+v[i][j-1];
              p[i][j]=s;}
             else   //generico elemento interno (non sul bordo) 
              {s=v[i][j+1]+v[i+1][j+1]+v[i+1][j]+v[i+1][j-1]+v[i][j-1]+v[i-1][j-1]+v[i-1][j]+v[i-1][j+1];
              p[i][j]=s;}}}
    }

    l'unico problema ora è trovare una condizione che faccia terminare la ricorsione della funzione confronto in questo punto (***)

    se qualcuno mi può aiutare ringrazio anticipatamente tutti..


  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296

    Moderazione

    Originariamente inviato da mau85
    Salve a tutti, innanzitutto mi presento, mi chiamo Davide e sono un programmatore alle prime armi..mi ritrovo alle prese con un programma che qui di seguito espongo
    [...]
    Volevo segnalare che ho provveduto a modificare il titolo originale rendendolo più consono al contenuto della discussione.

    In questo modo, sarà più facile ottenere risposte mirate.

    Ti suggerisco inoltre, dato che sei nuovo, di leggere il Regolamento per rispettare le norme che regolano l'uso di quest'area del forum.

    Ciao e buon forum!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.