RISOLTO C problema ordinamento struct

  • Autore discussione Autore discussione Utente cancellato 359755
  • Data d'inizio Data d'inizio
Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
U

Utente cancellato 359755

Ospite
Sto creando un programma che permette di inserire una parola con una definizione e stampa tutto ordinato. Il problema è che quando inserisco una nuova parola essa non viene nè stampata nè tantomeno la struct viene riordinata
C:
#include <stdio.h>
#include <string.h>

#define MAX_CAR 300
#define MAX_PAR 20
#define MAX_DIZ 20

typedef
    struct{
        char termine[MAX_PAR];
        char definizione[MAX_CAR];
        }Parola;
                      
typedef
    struct{
        Parola numero[MAX_DIZ];
        }dizionario;

void stampa(dizionario tab, int *riemp){
  int i;
  printf("Il dizionario inserito e' formato dalle parole: \n");
  for (i=0;i<*riemp;i++) {
  printf("%s : %s\n", tab.numero[i].termine, tab.numero[i].definizione);
}
}

void ordina(dizionario *ita, int n) {
  int i,j, posmin; 
  dizionario temp;
  for(i=0;i<n-1;i++){
    posmin=i;

    for(j=i+1;j<n;j++)
      if(strcmp(ita->numero[j].termine,ita->numero[posmin].termine)<0) {
        posmin=j; }
    if(i!=posmin) {
        strcpy(temp.numero[i].termine,ita->numero[i].termine);
        strcpy(temp.numero[i].definizione,ita->numero[i].definizione);
        strcpy(ita->numero[i].termine,ita->numero[posmin].termine);
        strcpy(ita->numero[i].definizione,ita->numero[posmin].definizione);
        strcpy(ita->numero[posmin].termine,temp.numero[i].termine);
        strcpy(ita->numero[posmin].definizione,temp.numero[i].definizione);

    }
  } 
  }

void aggiungi (dizionario *ita, int *riemp) {
  if ((*riemp/MAX_DIZ)==1){
      printf("Raggiunto numero di parole massime");
      }
      else{
      printf("Inserisci nuova parola, massimo %d caratteri ", MAX_PAR);
      scanf("%s", &ita->numero[*riemp].termine);
      printf("Inserisci la definizione della parola inserita, massimo %d caratteri ", MAX_PAR);
      scanf("%s", &ita->numero[*riemp].definizione);
      }
}
int main(){
  dizionario ita;
  int riemp;
      int n;
    printf("Quante parole vuoi inserire (massimo %d ", MAX_DIZ);
    scanf("%d",&riemp);
    for (int z=0; z<riemp; z++){
      printf("Inserisci parola, massimo %d caratteri ", MAX_PAR);
      scanf("%s", &ita.numero[z].termine);
      printf("Inserisci definizione parola, massimo %d caratteri ", MAX_PAR);
      scanf("%s", &ita.numero[z].definizione);
  }
 
    ordina(&ita, riemp);
    stampa(ita, &riemp);
    aggiungi(&ita, &riemp);
    ordina(&ita, riemp);
    stampa(ita, &riemp);
    system("PAUSE");
 
 // elimina(ita, riemp);
  return 0;
}
 
Ciao,
come da regolamento, titoli così generici non sono ammessi
Scrivi un titolo del tipo "C problema ordinamento struct"
 
Gli indici dei cicli for li puoi (e dovresti) dichiarare all’interno del for stesso…

stampa dovrebbe prendere un puntatore a dizionario e un intero che è la grandezza del dizionario (oltre al fatto che la grandezza va bene anche come attributo della struttura).

In ordina dovresti semplificare il
bubblesort… ossia se due elementi consecutivi non sono ordinati allora si scambiano (e ti consiglio una funzione apposita swapParole(Parola *, Parola *)
 
@_Achille sono riuscito (o almeno credo e spero) a "far funzionare" il tutto in un altro modo.
Ora sto invece creando un'altra funzione che permetta di eliminare un termine con la relativa definizione, però non funziona, nel senso che poi non stampa nulla, come se eliminasse tutto

C:
void elimina (dizionario *ita, int *riemp) {
    char elimpar [MAX_PAR];
  if (*riemp=0){
      printf("Non ci sono parole da eliminare");
      }
      else{
      printf("Inserisci la parola da eliminare ");
      scanf("%s", &elimpar);
      for (int i=0; i<*riemp; i++){
          if(strcmp(ita->numero[i].termine, elimpar)==0){
              for(int c=i; c<*riemp; c++){
              ((ita->numero[c])=(ita->numero[c-1]));
          }
    }
      }
       for (int x=0;x<*riemp;x++) { //serve per verificare  se elimina
  printf("%s : %s\n", ita->numero[x].termine, ita->numero[x].definizione);// è da togliere
}
      }
}
 
Ultima modifica da un moderatore:
no, hai ragione deve essere
C:
if (*riemp==0)

Sono riuscito a risolvere tutto...grazie di tutto
 
Ultima modifica da un moderatore:
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top