Esercizio su inversione di righe di input

di il
14 risposte

Esercizio su inversione di righe di input

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

  • Re: Esercizio su inversione di righe di input

    Devi passarla per puntatore
  • Re: Esercizio su inversione di righe di input

    Il problema è che il puntatore non l'ho ancora studiato, è un esercizio di inizio libro, devo farcela senza puntatori,penso di averlo strutturato male...
  • Re: Esercizio su inversione di righe di input

    Allora sì, devi rivederlo.

    Per prima cosa, perché la variabile m viene passata dal main?
  • Re: Esercizio su inversione di righe di input

    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?
  • Re: Esercizio su inversione di righe di input

    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" ....
  • Re: Esercizio su inversione di righe di input

    ... 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
  • Re: Esercizio su inversione di righe di input

    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;
    }
  • Re: Esercizio su inversione di righe di input

    Come si usa questo programma? Quante frasi si inseriscono? Come si termina?
  • Re: Esercizio su inversione di righe di input

    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...
  • Re: Esercizio su inversione di righe di input

    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).
  • Re: Esercizio su inversione di righe di input

    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..
  • Re: Esercizio su inversione di righe di input

    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++ ...
  • Re: Esercizio su inversione di righe di input

    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
  • Re: Esercizio su inversione di righe di input

    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