Unione di due for

di il
16 risposte

Unione di due for

Buongiorno a tutti,
di recente a scuola mi è stato dato un semplice programma dove dovevo creare una cornice di "n" righe e "m" colonne. Dopo aver svolto correttamente l'esercizio, la professoressa mi ha proposto di provare a farlo unendo due for in uno solo. Dopo svariati tentativi non sono riuscito a concludere nulla.
Il problema penso stia nel fatto che l'istruzione che prima apparteneva al for nidificato ora venga svolta insieme alle altre.
Sapreste aiutarmi?

Programma con 4 for :
#include <stdio.h>

int main() 

{
	
	int i, j, n, m;
	
	printf("Inserire il numero di righe: ");
	scanf("%d", &n);
	
	printf("Inserire il numero di colonne: ");
	scanf("%d", &m);
	
	for (i = 1; i <= m; i++)
	
		printf("*");
		
	printf("\n");
	
	for (i = 1; i <= n -2; i++)
	
	{
		
		printf("*");
		
		for (j=1; j <= m - 2; j++)
		
			printf(" ");
			
		printf("*\n");
		
	}
	
	for (i=1; i<=m; i++)
	
		printf("*");
		
	printf("\n");
	
}
Tentativo con 3 for :
#include <stdio.h>

int main() 

{
	
	int i, j, n, m;
	
	printf("Inserire il numero di righe: ");
	scanf("%d", &n);
	
	printf("Inserire il numero di colonne: ");
	scanf("%d", &m);
	
	for (i = 1; i <= m; i++)
	
		printf("*");
		
	printf("\n");
	
	for (i=1; i<=n-2 && i<=m-2; i++)
	
	{
		
		printf("*");
		
		printf(" ");
			
		printf("*\n");
		
	}
	
	for (i=1; i<=m; i++)
	
		printf("*");
		
	printf("\n");
	
}

16 Risposte

  • Re: Unione di due for

    Con qualche if basta un solo ciclo per fare il tutto!
  • Re: Unione di due for

    Nippolo ha scritto:


    Con qualche if basta un solo ciclo per fare il tutto!
    Sì ma è una soluzione sbagliata come numero di istruzioni da fare eseguire al processore. Per me la sua soluzione è quella corretta
  • Re: Unione di due for

    Nippolo ha scritto:


    Con qualche if basta un solo ciclo per fare il tutto!
    A me però servirebbe semplicemente unire i due for centrali in uno solo.
  • Re: Unione di due for

    Weierstrass ha scritto:


    Sì ma è una soluzione sbagliata come numero di istruzioni da fare eseguire al processore. Per me la sua soluzione è quella corretta
    Dal momento che la richiesta verteva sulla diminuzione del numero di cicli utilizzati, ho ritenuto interessante farlo notare, tutto qui!

    MattyTuber ha scritto:


    A me però servirebbe semplicemente unire i due for centrali in uno solo.
    Anche in questo caso basta aggiungere qualche if/else e modificare opportunamente le variabili i e j.
  • Re: Unione di due for

    Nippolo ha scritto:


    Weierstrass ha scritto:


    Sì ma è una soluzione sbagliata come numero di istruzioni da fare eseguire al processore. Per me la sua soluzione è quella corretta
    Dal momento che la richiesta verteva sulla diminuzione del numero di cicli utilizzati, ho ritenuto interessante farlo notare, tutto qui!

    MattyTuber ha scritto:


    A me però servirebbe semplicemente unire i due for centrali in uno solo.
    Anche in questo caso basta aggiungere qualche if/else e modificare opportunamente le variabili i e j.
    Se mi sapresti indicare come procedere mi faresti un grosso favore...

    La professoressa ha detto di usare degli operatori logici.

    Grazie
  • Re: Unione di due for

    Se mi sapessi ...

    In che senso "unire"? Vuoi usare un solo for? Utilizza delle if apposite ... provaci.
  • Re: Unione di due for

    oregon ha scritto:


    Se mi sapessi ...

    In che senso "unire"? Vuoi usare un solo for? Utilizza delle if apposite ... provaci.
    Tralasciando il verbo...

    La professoressa mi ha indicato di utilizzare degli operatori logici per unire i due for centrali...nel caso questo non fosse possibile non c'è problema.

    Utilizzando if non rispetterei la consegna.
  • Re: Unione di due for

    Ma nella "versione" a 4 for o con i 3 for ? Non si capisce ...
  • Re: Unione di due for

    oregon ha scritto:


    Ma nella "versione" a 4 for o con i 3 for ? Non si capisce ...
    Forse mi sono spiegato male io, ho fatto una versione a 4 for in classe e la professoressa dopo averlo controllato ha detto che era giusto dopodiché, visto che mi avvanzava più di un'ora, mi ha "lanciato la sfida" di farlo con 3 for invece che 4. Non essendoci riuscito mi è salita la curiosità di sapere come si potesse fare a ridurre i due for centrali in uno solo utilizzando gli operatori logici.
  • Re: Unione di due for

    Non è che ti ha chiesto di astrarre a funzione il primo e il quarto for, che sono uguali? La vedo dura senza if a parte nel modo in cui hai già fatto
  • Re: Unione di due for

    Allora non c'entrano le for centrali ma le altre ... comunque nel seguente codice
    
    	for (i=1; i<=n; i++)
    	{
    		printf("*");
    
    		for (j=1; j<=m-2; j++)
    			if(i>1 && i<n)
    				printf(" ");
    			else
    				printf("*");
    
    		printf("*\n");
    	}
    
    utilizzi l'operatore && nella if...
    E volendo la for interna la puoi semplificare con
    
    		for (j=1; j<=m-2; j++)
    			printf((i>1 && i<n)?" ":"*");
    			
  • Re: Unione di due for

    Non credo vada bene per il tuo esercizio, però a me per scorrere una matrice a due dimensioni senza "annidare" i cicli è venuta in mente questa soluzione:
    #include <stdio.h>
    
    int main() {
        int qr=3, qc=5, r, c; // 3 e 5 sono valori arbitrari, tanto per provare
    
        for( r=0, c=0; r<qr && c<qc; r+=(c==qc-1), c=c!=qc-1?c+1:0 )
            printf( "riga %d, colonna %d\n", r, c );
    
        return 0;
    }
    A questo punto sorge una domanda "per chi sa": dal punto di vista del programma compilato, c'è differenza tra queste due versioni della stessa operazione? Al di là della maggiore o minore leggibilità, quale è preferibile, se c'è una differenza?

    if( c!=qc-1 ) ++c; else c = 0;
    c = c!=qc-1 ? c+1 : 0;
  • Re: Unione di due for

    AldoBaldo ha scritto:


    A questo punto sorge una domanda "per chi sa": dal punto di vista del programma compilato, c'è differenza tra queste due versioni della stessa operazione? Al di là della maggiore o minore leggibilità, quale è preferibile, se c'è una differenza?

    if( c!=qc-1 ) ++c; else c = 0;
    c = c!=qc-1 ? c+1 : 0;
    Dipende! Ogni compilatore fa a modo suo ma, in linea di massima, abilitando le ottimizzazioni mi aspetto di avere un codice sostanzialmente identico in entrambi i casi e per ogni compilatore.

    E se volessimo usare un solo ciclo???
    
      int c;
      int cols, rows;
      cols = 20;
      rows = 15;
      
      for (c = 0; c++; c < cols * rows) {
        if (c < cols) {
          printf("*"); //prima riga
        } else if (c % cols == 0) {
          printf("*"); //prima colonna
        } else if (c % cols == cols -1) {
          printf("*\n"); //ultima colonna
        } else if (c >= cols * rows -1) {
          printf("*"); //ultima riga
        } else {
          printf(" ");
        }    
      } //for
     
    Ovviamente si può scrivere con un solo if e degli OR ma così è più leggibile.
  • Re: Unione di due for

    Grazie mille a tutti... provvedo a correggere
Devi accedere o registrarti per scrivere nel forum
16 risposte