Unione di due for

di Anonimizzato26179 il
16 risposte
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

  • Con qualche if basta un solo ciclo per fare il tutto!
  • 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
  • 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.
  • 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.
  • 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
  • Se mi sapessi ...

    In che senso "unire"? Vuoi usare un solo for? Utilizza delle if apposite ... provaci.
  • 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.
  • Ma nella "versione" a 4 for o con i 3 for ? Non si capisce ...
  • 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.
  • 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
  • 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)?" ":"*");
    			
  • 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;
  • 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.
  • Grazie mille a tutti... provvedo a correggere
Devi accedere o registrarti per scrivere nel forum
16 risposte