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

    [C] Ricerca Sequenziale, problema tasto invio

    Salve a tutti, sto facendo degli esercizi sulla ricerca sequenziale, e non riesco a risolvere il classico problema del tasto invio alla cattura di un carattere.
    In genere mi limito ad aggiungere un semplice "variabile=getchar();" per ovviare al problema,
    il search mi ha fatto tornare in mente l' "fflush(stdin);" ma il problema persiste.
    Veniamo al dunque: il programma dovrebbe ricercare in modo sequenziale all'interno di una matrice n*m inizializzata dall'utente una lettera immessa
    mettendo in una matrice 2*2 i valori A S D F e ricercandone uno dei 4 in ogni caso ottengo "lettera non presente". HELP!

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define M 10 
    int main(int argc, char *argv[])
    {
    
    // k e j sono i contatori, n e m righe e colonne
    int k,j,n,m;                                                  
    
    
    // v la matrice, p il carattere da ricercare c
    // c per il getchar
    char c,p,v[M][M]; 
    
    
    
    //RICHIESTA RIGHE E COLONNE
    do {
       printf("\nQuante Righe si vogliono inserire: ");
       scanf("%d",&n);
       }
    while((n<0)||(n>M));
    do {
       printf("\nQuante Colonne si vogliono inserire: ");
       scanf("%d",&m);
       }
    while((m<0)||(m>M));
    c=getchar(); 
    //Il getchar per evitare che l invio mi dasse noia in seguito
    
    
    //CICLO DI IMMISSIONE PER LA MATRICE
    for(j=0;j<n;j++)
                    for(k=0;k<m;k++) {
                                    printf("\nInserire Riga %d Colonna %d: ",j+1,k+1);
                                    scanf("%c",&v[j][k]);
                                    c=getchar();
                                    }
    
    
    //QUESTA CREDO SIA LA PARTE CHE CAUSA PROBLEMI
    printf("\nInserire il carattere da ricercare: ");
    scanf("%d",&p);
    
    //RICERCA SEQUENZIALE (testata con i numeri e non sembra dar problemi)
    j=0; k=0;
    while ((p!=v[j][k])&&(j<n))   {
                                 k++;
                                 if((k==m)&&(j<n-1)) { k=0; j++; }
                                 }
    
    //Inutile visualizzazione della matrice, messa solo per controllo >,<                             
    for(j=0;j<n;j++)
                    {
                    printf("\n");
                    for(k=0;k<m;k++)
                                     printf("%3c",v[j][k]);
                    }
    printf("\n");
    
    
    
    //controllo finale del carattere ricercato          
    if(p!=v[j][k])     printf("\nLettera non presente.\n");
    else      printf("\nLettera presente\nRiga: %d\nColonna: %d\n",j,k);          
    
      system("PAUSE");	
      return 0;
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,301

    Moderazione

    Come espressamente richiesto dal Regolamento interno, il codice va postato indentato all'interno degli appositi tag CODE (vedi punto 6).

    Sistemo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Elimina la stampa della matrice, altrimenti vai a modificare i valori di j e k e il controllo finale ti risulterà quasi sicuramente falso. In alternativa, se vuoi lasciare la stampa, utilizza indici diversi oppure segnala il fatto di aver trovato la lettera in maniera diversa (ad esempio con una variabile "booleana" trovato/non_trovato).
    every day above ground is a good one

  4. #4
    grazie per avermi fatto notare l'errore, ho spostato la visualizzazione della matrice a fondo codice in modo che non intralci l'esecuzione in fasi di controllo.
    Lo ho appena riprovato e il problema dell'invio non si presenta più con l'utilizzo dell'fflush,
    ma c'è qualcosa che non va con la variabile K che utilizzo come contatore, in pratica ora mi dice se la lettera è presente in maniera corretta, ma nella visualizzazione mi da il valore della colonna è sbagliato. Cosa ho combinato?
    Grazie ancora

    codice:
    j=0; k=0;
    while ((p!=v[j][k])&&(j<n))   {
                                 k++;
                                 if((k==m)&&(j<n-1)) { k=0; j++; }
                                 }
              
    if(p!=v[j][k])     printf("\nLettera non presente.\n");
    else      printf("\nLettera presente\nRiga: %d\nColonna: %d\n",j,k);

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da darkoopa
    in pratica ora mi dice se la lettera è presente in maniera corretta, ma nella visualizzazione mi da il valore della colonna è sbagliato. Cosa ho combinato?
    Sei sicuro che siano sbagliati? Ricorda che gli indici di riga e di colonna partono da 0 quindi se la lettera che hai ricercato è nella riga m e nella colonna n, vedrai stampato m-1 e n-1... se poi non è questo il problema, posta un esempio di risultato "sballato" e magari riposta anche il codice che stai provando ora.
    Tieni comunque presente che il codice di formato relativo ai caratteri è %c, non %d, quindi sostituiscilo nella scanf() in cui vai a leggere il carattere da ricercare (avevo dimenticato di fartelo notare prima).
    every day above ground is a good one

  6. #6
    si, ho tenuto conto degli indici, e mi sono reso conto che il problema è un altro, mi dice che la lettera ricercata è presente anche se non lo è.
    Es. Matrice 2 * 2 Valori A B C D lettera da ricercare Y
    Lettera Presente
    Riga: 2
    Colonna 117

    Qualcosa in quell'if non mi convince xD


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define M 10
    int main(int argc, char *argv[])
    {
    int k,j,n,m;
    char c,p,v[M][M];
    
    do {
       printf("\nQuante Righe si vogliono inserire: ");
       scanf("%d",&n);
       }
    while((n<0)||(n>M));
    
    do {
       printf("\nQuante Colonne si vogliono inserire: ");
       scanf("%d",&m);
       }
    while((m<0)||(m>M));
    
    c=getchar();
    for(j=0;j<n;j++)
                    for(k=0;k<m;k++) {
                                    printf("\nInserire Riga %d Colonna %d: ",j+1,k+1);
                                    scanf("%c",&v[j][k]);
                                    fflush(stdin);
                                    }
    
    printf("\nInserire il carattere da ricercare: ");
    scanf("%c",&p);
    fflush(stdin);
    
    
    
    
    j=0; k=0;
    while ((p!=v[j][k])&&(j<n))   {
                                 k++;
                                 if((k==m)&&(j<n-1)) { k=0; j++; }
                                 }
              
    if(p!=v[j][k])     printf("\nLettera non presente.\n");
    else      printf("\nLettera presente\nRiga: %d\nColonna: %d\n",j+1,k+1);    
    
    
    for(j=0;j<n;j++)
                    {
                    printf("\n");
                    for(k=0;k<m;k++)
                                     printf("%3c",v[j][k]);
                    }
    printf("\n");
    
    
      system("PAUSE");	
      return 0;
    }

  7. #7
    risolto, c'èera una parte superflua nell'if

    lo ho riscritto cosi:
    codice:
     if(k==m) { k=0; j++; }
    Grazie a tutti per l'aiuto

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