Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Aiuto urgente! programma in C

    Salve a tutti, devo realizzare un programma che legga da un file di testo una matrice strutturata per esempio in questo modo:

    codice:
    1 4 3 2
    4 2 8 9
    7 8 0 3
    5 7 9 1
    e che mi permetta di spostare lo "0" in su, in giu a destra e a sinistra all'interno di essa. al termine, premendo 'Q' il programma salva il tutto nello stesso file di testo, e fin quì ce l'ho fatta.

    il programma deve anche permettere l'operazione "undo" e per far questo ho utilizzato una lista, solo che sembra che il puntatore all'ultimo elemento della lista "pointer" che passo nella procedura come "p" non cambi mai il suo stato da NULL, e quindi io credo che ci sia un problema nel punto in cui cerco di interire nuovi elementi nella lista. ovvero infondo alla procedura "muovi", oppure potrebbe essere un problema di passaggio della variabile "p" alla procedura...

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct memory {
    	char temp;
    	struct memory *next;
     } *tip;
    
    void muovi(char c, int m[][4],  tip p);
    
    void main(void){
    	int matrix[4][4],i;
    	tip pointer;
    	char command;
    	pointer=NULL;
    	FILE *status;
    	status=fopen("15status.txt","r");
    	for(i=0;i<4;i++){
    		fscanf(status,"%d %d %d %d",& matrix[0][i], & matrix[1][i], & matrix[2][i], & matrix[3][i]);
    	}
    	fclose(status);
    	do{
    		scanf("%c",&command);
    		if(command!='Q'){
    			muovi(command,matrix,pointer);
    		}
    	}while(command!='Q');
    	status=fopen("15status.txt","w");
    	for(i=0;i<4;i++){
    		fprintf(status,"%d %d %d %d\n",matrix[0][i],matrix[1][i],matrix[2][i],matrix[3][i]);
    	}
    	fclose(status);
    }
    
    
    void muovi(char c, int m[][4], tip p){
    	int x,y,flag;
    	flag=0;
    	for(y=0;(y<4)&&(flag==0);y++){
    		for(x=0;(x<4)&&(flag==0);x++){
    			if(m[x][y]==0){
    				flag=1;
    			}
    		}
    	}
    	x--;
    	y--;	
    	switch (c){
    	case 'U' :      {
    			if(y>0){
    				m[x][y]=m[x][y-1];
    				m[x][y-1]=0;
    			}
    			break;
    			}
    	case 'D' :      {
    			if(y<3){
    				m[x][y]=m[x][y+1];
    				m[x][y+1]=0;
    			}
    			break;
    			}
    	case 'R' :      {
    			if(x<3){
    				m[x][y]=m[x+1][y];
    				m[x+1][y]=0;
    			}
    			break;
    			}
    	case 'L' :      {
    			if(x>0){
    				m[x][y]=m[x-1][y];
    				m[x-1][y]=0;
    			}
    			break;
    			}
    	case 'B' :      {
    			char undo;
    				switch (p->temp){
    				case 'U' :      {
    						undo='D';
    						break;
    						}
    				case 'D' :      {
    						undo='U';
    						break;
    						}
    				case 'R' :      {
    						undo='L';
    						break;
    						}
    				case 'L' :      {
    						undo='R';
    						break;
    						}
    			}
    			muovi(undo,m,p);
    			p=p->next;
    			p=p->next;
    			}
    			break;
    			}
    	}
    	if(c!='B'){
    		tip pointer1;
    		pointer1=(tip)malloc(sizeof(struct memory));
    		pointer1->temp=c;
    		pointer1->next=p;
    		p=pointer1;
    	}
    }

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

    Moderazione

    Come espressamente indicato nel Regolamento interno (da leggere), nessuna discussione è urgente. Questo è un forum e tutte le discussioni hanno la stessa, medesima urgenza.

    In secondo luogo, il titolo deve dare un'indicazione di massima sul contenuto della discussione, cosa che questo titolo assolutamente non fa.

    In terzo luogo, il codice va postato indentato all'interno degli appositi tag CODE (punto 6 del regolamento linkato).



    Sistemo tutto io.

    In futuro, pensaci tu.

    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

  3. #3
    grazie, scusa ma sono un nuovo utente :-)

  4. #4
    Alla funzione "muovi" dovresti passare l'indirizzo del puntatore "pointer"
    codice:
       muovi(command,matrix,&pointer);
    modificando ovviamente prototipo e dichiarazione della procedura.
    Inoltre, all'interno della funzione, dovrai accedere al valore puntato da "p" mediante l'operatore * ed aggiungere il controllo
    codice:
    *(p) != NULL
    per evitare che, qualora si richiedesse un 'B'ack senza avere prima effettuato nessuna operazione, questa non crei problemi.

  5. #5
    ho risolto il problema del puntatore dichiarandolo globalmente! tuttavia continua a restare null, deve esserci un errore nella parte in cui faccio l'inserimento nella lista, ovvero nelle ultimissime righe del programma.

  6. #6
    a me così funziona:
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct memory {
    	char temp;
    	struct memory *next;
    } *tip;
    
    void muovi(char c, int m[][4],  tip* p);
    
    void main(void){
    	int matrix[4][4],i;
    	tip pointer;
    	char command;
    	pointer=NULL;
    	FILE *status;
    	status=fopen("15status.txt","r");
    	for(i=0;i<4;i++){
    		fscanf(status,"%d %d %d %d",& matrix[0][i], & matrix[1][i], & matrix[2][i], & matrix[3][i]);
    	}
    	fclose(status);
    	do{
    		scanf("%c",&command);
    		fflush(stdin);
    		if(command!='Q'){
    			muovi(command,matrix,&pointer);
    		}
    	}while(command!='Q');
    	status=fopen("15status.txt","w");
    	for(i=0;i<4;i++){
    		fprintf(status,"%d %d %d %d\n",matrix[0][i],matrix[1][i],matrix[2][i],matrix[3][i]);
    	}
    	fclose(status);
    }
    
    
    void muovi(char c, int m[][4], tip* p){
    	int x,y,flag;
    	flag=0;
    	for(y=0;(y<4)&&(flag==0);y++){
    		for(x=0;(x<4)&&(flag==0);x++){
    			if(m[x][y]==0){
    				flag=1;
    			}
    		}
    	}
    	x--;
    	y--;	
    	switch (c){
    	case 'U' :      
    			if(y>0){
    				m[x][y]=m[x][y-1];
    				m[x][y-1]=0;
    			}
    			break;
    		
    	case 'D' :      
    			if(y<3){
    				m[x][y]=m[x][y+1];
    				m[x][y+1]=0;
    			}
    			break;
    		
    	case 'R' :      
    			if(x<3){
    				m[x][y]=m[x+1][y];
    				m[x+1][y]=0;
    			}
    			break;
    	case 'L' :      
    			if(x>0){
    				m[x][y]=m[x-1][y];
    				m[x-1][y]=0;
    			}
    			break;
    	case 'B' :
    			char undo;
    			if (*p != NULL)
    			{
    				switch ((*p)->temp){
    				case 'U' :      
    						undo='D';
    						break;
    					
    				case 'D' :      
    						undo='U';
    						break;
    					
    				case 'R' :      
    						undo='L';
    						break;
    					
    				case 'L' :      
    						undo='R';
    						break;
    					
    				}
    				muovi(undo,m,p);
    			}
    		break;
    	}
    	if(c!='B'){
    		printf("addop");
    		tip pointer1;
    		pointer1=(tip)malloc(sizeof(struct memory));
    		pointer1->temp=c;
    		pointer1->next=*p;
    		*p=pointer1;
    	}
    }

  7. #7
    Grazie mille, così è perfetto, ti ringrazio infinitamente.

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.