Esercizio su inversione di righe di input

di Anonimizzato12508 il
14 risposte
Sto provando a scrivere per esercizio un programma che inverta l'ordine di un massimo di 10 righe di input, ci sono quasi riuscito, ma non riesco a capire perchè la variabile m si azzera ogni volta che viene chiamata la funzione reverse dal main, per essere precisi la riga che ho segnato in grassetto:
#include <stdio.h>
#define MAXCHAR 1000
#define MAXLINE 10

int getline(char s[MAXCHAR], int maxline)/*copia l'input econtrolla la lunghezza*/
{
	int c,i;
	for(i=0;i<maxline && (c=getchar())!=EOF && c!='\n';i++)
	{
		s[i]=c;
	}
	if(c=='\n')
	{
		s[i]=c;
		i++;
	}
	return i;
}
int totchar(int len[]) /*trova il totale dei caratteri input*/
{
	int i,tot;
	tot=0;
	for (i=0;i<MAXLINE && len[i]>1;i++)
	tot=tot+len[i];
	return tot;
}
void reverse(char ff[],char rev[],int len[],int m) /*ribalta l'ordine delle linee di input*/
{
	int i,l,tc,initln[MAXLINE],nparole;
	tc=totchar(len);
	l=1;
	nparole=0;
	for (i=0;i<MAXLINE;i++)
		initln[i]=0;	
	for (i=0;i<MAXLINE && len[i]>1;i++)
	{
		initln[l]=initln[l-1]+len[i]; /*calcola dove spezzare le righe di input*/
		l++;
		nparole=i;
	}
	for (i=0;i<MAXCHAR && rev[m-1]!='\n';i++)
	{
		rev[m]=ff[initln[nparole]+i];
		m++;
		printf("%d",m);
	}
	
}
main()
{
	int i,gl,len[MAXCHAR],m;
	for (i=0;i<MAXLINE;i++)
		len[i]=0;
	i=m=0;
	char ff[MAXCHAR],rew[MAXCHAR];
	while(gl=getline(ff,MAXCHAR))
	{
		//salva in len la lunghezza delle righe
		len[i]=gl;
		[b]reverse(ff,rew,len,m);[/b]
		
		i++;
	}
	rew[m]='\0';
	printf("\n%s", rew);
	return 0;
}
si può fare in modo che m++ della funzione reverse incrementi il suo valore senza ricominciare ogni volta da 0?

14 Risposte

  • Devi passarla per puntatore
  • Il problema è che il puntatore non l'ho ancora studiato, è un esercizio di inizio libro, devo farcela senza puntatori,penso di averlo strutturato male...
  • Allora sì, devi rivederlo.

    Per prima cosa, perché la variabile m viene passata dal main?
  • Ho inserito m=0 all'inizio del main in modo che venisse azzerata solo all'inizio dello script, non ci sono altre parti del programma con "m=0" sai spiegarmi perchè allora si azzera?
  • Tu sai che differenza c'è tra passaggio per valore e per puntatore ad una funzione di una variabile?

    In realtà m non si azzera ma *resta* a zero sempre nel main in quanto non viene mai modificata.

    Se passi m per valore (come fai adesso) il suo valore non sarà modificato nel main (quindi resterà 0 al suo interno) ma solo nella funzione (dato che ne viene fatta una copia e non viene modificato l'originale).

    Ecco perché ti dicevo di passarla per puntatore.

    Ma quello che devi cercar di capire è se ti serve veramente la variabile m nel main ...

    P.S. Per un programma in C non si parla di "script" ....
  • ... no, per ora di puntatori non ne so nulla, comunque ho capito cosa intendi, "m" si modifica solo in reverse() non in main()... penso comunque di aver trovato un alternativa usando m solo in reverse chiamando però la funzione reverse fuori dal ciclo while di main, appena finisco di scriverlo dovrebbe funzionare e lo posto
  • Ecco il codice molto incasinato ma funzionante, sono sicuro che lo stesso risultato si poteva avere con metà righe di codice, ma per quel che conosco io per ora di C mi accontento
    #include <stdio.h>
    #define MAXCHAR 1000
    #define MAXLINE 10
    
    int getline(char s[MAXCHAR], int maxline)/*copia l'input econtrolla la lunghezza*/
    {
    	int c,i;
    	for(i=0;i<maxline && (c=getchar())!=EOF && c!='\n';i++)
    	{
    		s[i]=c;
    	}
    	if(c=='\n')
    	{
    		s[i]=c;
    		i++;
    	}
    	return i;
    }
    int totchar(int len[]) /*trova il totale dei caratteri input*/
    {
    	int i,tot;
    	tot=0;
    	for (i=0;i<MAXLINE && len[i]>1;i++)
    	tot=tot+len[i];
    	return tot;
    }
    void reverse(char ff[],char rev[],int len[],char str[]) /*ribalta l'ordine delle linee di input*/
    {
    	int i,l,totchar,in,initparola[MAXLINE],m;
    	l=in=0;
    	for (i=0;str[i]!='\0';i++)
    	;
    	totchar=i;
    //calcola inizio parole
    	while(i>0)
    	{
    		for(l=0;l<MAXLINE && i>0;l++)
    		{
    			for(;i>0;i--)
    			{
    				if(str[i]=='\n')
    				{
    					initparola[in]=i+1;
    					in++;
    				}	
    			}
    			
    		}
        } 
    //  ribalta le righe di input
        i=0;
        l=1;
        while(i<totchar)
        {
    		m=initparola[l];
    		while (str[m]!='\n')
    		{
    			rev[i]=str[m];
    			m++;
    			i++;
    		}
    		rev[i]='\n';
    		i++;
    		l++;
    	}
    	rev[i]='\0';
        
    }
    main()
    {
    	int i,gl,l,len[MAXCHAR],m,nrighe;
    	for (i=0;i<MAXLINE;i++)
    		len[i]=0;
    	i=l=m=nrighe=0;
    	char ff[MAXCHAR],rew[MAXCHAR],str[MAXCHAR];
    	while(gl=getline(ff,MAXCHAR))
    	{
    		//salva in len la lunghezza delle righe
    		len[i]=gl;
            //unisce le righe in una stringa unica
    		for(l=0;l<MAXCHAR && ff[l]!='\n' && nrighe<MAXLINE;l++)
    		{
    			str[m]=ff[l];
    			m++;
    		}
    		if(ff[l]=='\n')
    		{
    			str[m]='\n';
    			m++;
    		}
    		str[m]='\0';
    		i++;
    		nrighe++;
    		
    	}
    		reverse(ff,rew,len,str);
    		
    	printf("\n%s", rew);
    	return 0;
    }
  • Come si usa questo programma? Quante frasi si inseriscono? Come si termina?
  • Si inserisce un massimo di 10 righe, alla fine ctrl+z e stampa le 10 righe in ordine contrario, la riga 10 diventa la prima, la 9 diventa la seconda etc...
  • Però non funziona ... ho un errore di accesso in memoria (probabilmente un puntatore sbagliato o un tentativo di accedere ad un elemento di un vettore che non esiste).
  • In che senso non ti funziona? non te lo compila o si blocca dopo averlo eseguito? io ho provato a copiarlo di nuovo dal forum a dev-c, l'ho compilato e fatto partire, scritto 3 righe e me le gira..
  • rudj87 ha scritto:


    in che senso non ti funziona?
    Ti ho scritto ... ho un errore di accesso in memoria (probabilmente un puntatore sbagliato o un tentativo di accedere ad un elemento di un vettore che non esiste).

    E ti ripeto ... lascia stare il DevC++ ...
  • Sì, ma ho iniziato a programmare da meno di una settimana, quello che mi hai scritto per me è arabo
    è una cosa possibile che in un pc funzioni e in un altro no?
    PS: su consiglio di un altro utente ho appena scaricato code::blocks
  • Sì ... è possibile anche che su uno stesso computer a volte sembri funzionare e a volte no.

    Sicuramente il vecchio DevC++/mingw non ti aiuterà nell'individuare questi problemi.

    Fai bene (come ti ho anche suggerito in altra discussione) a cambiare IDE/compilatore e, oltre a quando già indicato, ti invito anche ad utilizzare Visual C++ Express Edition di Microsoft.
Devi accedere o registrarti per scrivere nel forum
14 risposte