Newsgroup: it.comp.programmare
Titolo: Aiuto!!! (programma in C)

Salve!
Ho scritto il seguente programma in C, ovvero una semplice rubrica
telefonica nella quale posso memorizzare, visualizzare e cercare nome e
numero (la funzione "elimina" non l'ho ancora implementata). Il problema sta
nella ricerca... ho provato ad eseguire la ricerca per nome utilizzando la
ricerca binaria (o dicotomica), ma non va a buon termine. Ovviamente la
rubrica è ordinata alfabeticamente!
Qualcuno sa dirmi qual'è il problema e come risolverlo eventualmente?
Grazie!
Ecco il programma:
***********
/*Rubrica telefonica*/
#include"stdio.h"
#include"string.h"
#define N 100
#define ESCI -1
#define VERO 1
typedef struct s{
        char nome[21];
        int numero;
        }rubrica;
int memoria(char*,rubrica*);
int menu(void);
int inserisci(char*,rubrica*,int);
int ricerca(rubrica*,int);
void visualizza(rubrica*,int);
int main(){
    rubrica R[N];
    int numerorecord,scelta=0,posizione;
    /*Verifico quanti elementi esistono già in rubrica, eventualmente la
creo*/
    numerorecord=memoria("C:/Documents and
Settings/Sorberabrothers/Desktop/Rubrica.txt",R);
/*************************************************************************/
    while(scelta!=ESCI){
        switch(scelta){
           case 0:
                scelta=menu();
                if (scelta==5)
                   scelta=ESCI;
                break;
           case 1:
                numerorecord=inserisci("C:/Documents and
Settings/Sorberabrothers/Desktop/Rubrica.txt",R,numerorecord);
                numerorecord=memoria("C:/Documents and
Settings/Sorberabrothers/Desktop/Rubrica.txt",R);
                scelta=0;
                break;
           case 3:
                scelta=ricerca(R,numerorecord);
                break;
           case 4:
                visualizza(R,numerorecord);
                scelta=0;
                break;
        }
    }
    printf("\nMemoria occupata: %d/100",numerorecord);
    getchar();
    }
int memoria(char*s,rubrica *R){
    rubrica x;
    int i=0;
    FILE*F;
    if((F=fopen(s,"a+"))==NULL){
       printf("\nErrore lettura");
       }
    while(fgets(x.nome,20,F)){
       fscanf(F,"%u\n",&x.numero);
       if(x.numero){
          R[i]=x;
          i++;
       }
    }fclose(F);
    return i;
    }
int menu(void){
    int scelgo;
    char pausa;
    /*Ripeto il ciclo finchè il vallore immesso è esatto*/
    while(VERO){
       printf("\n\n\t***** RUBRICA TELEFONICA *****");
       printf("\n\n\t\t 1. Aggiungi numero");
       printf("\n\t\t 2. Cancella numero");
       printf("\n\t\t 3. Ricerca numero");
       printf("\n\t\t 4. Visualizza rubrica");
       printf("\n\t\t 5. Esci");
       printf("\n\nScegli opzione: ");
       scanf("%d",&scelgo);
       scanf("%c",&pausa);
       switch(scelgo){
           case 0:
           case 1:
           case 3:
           case 4:
           case 5:
              return (scelgo);
           default:
              printf("Opzione errata");
              break;
           }
       }
    }
int inserisci(char *s,rubrica *R,int numerorecord){
    rubrica x;
    char pausa;
     //printf("%d",numerorecord);
    FILE*F;
    if((F=fopen(s,"a+"))==NULL)
       printf("\n\nFILE NON TROVATO!");
    printf("\n\nInserisci nome: ");
    gets(x.nome);
    printf("Inserisci numero: ");
    scanf("%u",&x.numero);
    fprintf(F,"%s\n%u\n",x.nome,x.numero);
    fclose(F);
    numerorecord++;
    scanf("%c",&pausa);
    return numerorecord;
    }
int ricerca(rubrica *R,int numerorecord){
     char confronto[21];
     int primo,ultimo,i,pos;
     printf("\nInserisci nome: ");
     gets(confronto);
     primo=0;
     ultimo=numerorecord-1;
     pos=-1;
     /*************Ricerca binaria*************/
     do{
        i=(primo+ultimo)/2;
        if(strcmp(R[i].nome,confronto)==0) pos=i;
        else
           if(strcmp(R[i].nome,confronto)>0)
              ultimo=i-1;
           else
              primo=i+1;
        }
     while(primo<=ultimo && pos==-1);
     /*****************************************/
     if(pos==-1){
        printf("\nElemento non presente!");
        }
     else
        printf("%s\n%d",R[pos].nome,R[pos].numero);
     return 0;
     }
void visualizza(rubrica *R,int numerorecord){
     int j,k,p,n;
     rubrica y;
     /*Visualizza in ordine alfabetico (bubblesort ottimizzato)*/
     p=numerorecord; n=numerorecord;
     do{
        k=0;
        for(j=0;j<numerorecord-1;j++)
           if(strcmp(R[j].nome,R[j+1].nome)>0){
              y=R[j]; R[j]=R[j+1]; R[j+1]=y;
              k=1; p=j+1;
              }
           numerorecord=p;
           }
     while(k==1);
     /**********************************************/
     for(j=0;j<n;j++){
        printf("\n%s%u\n",R[j].nome,R[j].numero);
        }
     }

prova a chiedere su it.comp.lang.c è un NG specifico
-- 
Saluti, Vitt
www.pbase.com/vitt

 rubrica è ordinata alfabeticamente!
Quanto inserisci NON e' ordinato (almeno nel file prodotto gli
elementi inseriti risultano nell'ordine di inserimento, non quello
alfabetico). Il secondo problema e' dato dal fatto che le stringhe
lette dal file contengono il carattere '\n' che le stringhe immesse
da tastiera NON contengono. Con questa premessa e' impossibile che
la strcmp() restituisca 0 anche se quanto immesso da tastiera e'
identico ad un elemento della rubrica.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG