RISOLTO C problema ordinamento struct

  • Autore discussione Utente cancellato 359755
  • Data d'inizio
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;
}
 

Moffetta88

Moderatore
Staff Forum
Utente Èlite
20,465
12,880
CPU
i5-4690
Dissipatore
DEEPCOOL CAPTAIN 240EX
Scheda Madre
MSI Z97 U3 PLUS
HDD
KINGSTON SSD KC400 240GB
RAM
24GB BALLISTIX SPORT @2133MHz
GPU
STRIX GTX980 DC2OC
Audio
INTEGRATA
Monitor
AOC G2590VXQ
PSU
BEQUIET! System Power 7 500W
Case
DEEPCOOL MATREXX 55
Periferiche
NESSUNA
Net
EOLO 100
OS
UBUNTU/WINDOWS11
Ciao,
come da regolamento, titoli così generici non sono ammessi
Scrivi un titolo del tipo "C problema ordinamento struct"
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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 *)
 
U

Utente cancellato 359755

Ospite
@_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:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
C:
if (*riemp=0)
ti sembra corretto?
 
U

Utente cancellato 359755

Ospite
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.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili