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

    [C] problema selezione Ioi

    Per esercitarmi un po' col C tra una (noiosa) pagina di manuale e l'altra provo a risolvere problemi come questi:
    http://ioi.dsi.unimi.it/selezioni/struzzo.html

    Qualcuno mi sa dire perchè il conteggio dei punri cardinali (quello all'interno del while) non funziona a dovere?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    		
    main() {
    int counter[4],i, effettivoX, effettivoY;
    char sposta[100000];
    
    
        printf("Dammi la coordinata");
        scanf("%s", &sposta);
      
    //printf("%s", sposta);
    i=0;
    
    while (sposta[i] !='*'){
    
    switch(sposta[i]){
    case 'N':
       counter[0]=counter[0]+1;
       break;   
    case 'S':
       counter[1]=counter[1]+1;
       break;   
    case 'O':
       counter[2]=counter[2]+1;
       break;   
    case 'E':
       counter[3]=counter[3]+1;
       break;   
    default:
       break;   
    }
    i=i+1;
    
    }
    
    
    //printf("%d", counter[0]);---->SE GUARDATE COSA STAMPA QUESTO VEDETE CHE c'è QUALCOSA CHE TOCCA
    
    
    effettivoY=counter[0]-counter[1];
    effettivoX=counter[2]-counter[3]; 
    printf("%d", effettivoX*effettivoX+effettivoY*effettivoY );
    printf("%d", counter[0]);
    
    
    system("pause");
    }

  2. #2
    Credo che il problema principale è la non inizializzazione dei contatori. Li devi iniziare a 0 altrimenti partono da un valore casuale situato precedentemente nella zona di memoria (anche se ci sono dei compilatori che inizializzano tutti gli interi a 0).

    Altro potenziale errore: i due printf li hai messi consecutivamente senza spazi né punti a capo. Quindi vedresti i due numeri attaccati (es. se il risultato è 16 e counter[0] è 2 vedresti 162).


    Ecco il codice funzionante con le due modifiche suddescritte:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
    	int counter[4]={0,0,0,0}
    		,i, effettivoX, effettivoY;
    	char sposta[10000];
    
    	printf("Dammi la coordinata");
    	scanf("%s", &sposta);
    
    	i=0;
    
    	while (sposta[i] !='*')
    	{
    		switch(sposta[i])
    		{
    			case 'N': counter[0]++; break;
    			case 'S': counter[1]++; break;
    			case 'O': counter[2]++; break;
    			case 'E': counter[3]++; break;
    		}
    	i=++;
    	}
    	effettivoY = counter[0]-counter[1];
    	effettivoX = counter[2]-counter[3];
    	printf("%d",  effettivoX*effettivoX+effettivoY*effettivoY );
    	printf("\n%d", counter[0]);
    }

    Comunque, non c'è bisogno di usare un array per conservarsi tutti gli spostamenti. E' sufficiente tenere a mente dov'è situato lo struzzo mano a mano che si leggono gli spostamenti (basta conservarsi le coordinate X e Y che partono da (0,0) )

    ti dò qui una versione migliorata:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
    	int x=0, y=0, i=-1;
    	char sposta[10000];
    
    	printf("Dammi le coordinate : ");
    	scanf("%s", &sposta);
    
    	while (sposta[++i] !='\0')
    		switch(sposta[i])
    		{
    			case 'N': y--;	break;
    			case 'S': y++; break;
    			case 'O': x--;	break;
    			case 'E': x++; break;
    		}
    	printf("\nIl quadrato della distanza è %d\n", x*x + y*y);
    }
    ps tra le altre cose ho preferito fermare la lettura dei caratteri semplicemente quando si è arrivati alla fine della stringa (carattere '\0')


  3. #3
    vabbè alla fine la soluzione concettualmente è la stessa!

    grazie per la dritta sull'ìnizializzazione degli array!

    gentilissimo

  4. #4
    Originariamente inviato da Nescio
    vabbè alla fine la soluzione concettualmente è la stessa!

    grazie per la dritta sull'ìnizializzazione degli array!

    gentilissimo
    Di niente, sono 167 Euri

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 © 2025 vBulletin Solutions, Inc. All rights reserved.