Domanda Risolto funzione random in c

Stato
Discussione chiusa ad ulteriori risposte.

sara20

Utente Silver
6 Febbraio 2020
116
29
1
54
BUONGIORNO..sto realizzando un progetto in c che gestisce le prenotazioni dei voli ma la funzione random non mi funziona sapete aiutarmi a capire perche?
C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <string.h>
#include <stdbool.h>
#include "Graph.h"
#include "List.h"
#include "Queue.h"
#include "Menu.h"
#include "ListPrenotazioni.h"
#include "ListUtente.h"
#define MAXDELETECITTA 7

#define BUFFER_SIZE 256
#define  randomize srand(time(NULL))
#define  random(x) rand()%x

int main(int argc, char** argv){
    char cittaPartenza[10];
    char cod_id[7];
    char deleteCity[MAXDELETECITTA];
    char city[10];
    int n=1,m;
    char email[100];
    char pwd[7];
    ListPrenotazioni L = NULL;//per listPrenotazioni
    ListUtente l = NULL;//per listUtente
    randomize;
    Graph g = populateGraph();
    int mostPopularDestination = random(g->nodes_count);
    char buffer_email[BUFFER_SIZE];
    char buffer_password[BUFFER_SIZE];
    // qui va inserita la DS per contenere gli utenti registrati, e la DS per contenere i voli prenotati da un utente
    int loginChoice;
    int adminChoice;
    int userChoice;
    int user1Choice;
    int user2Choice;

    bool continueLoop;
    FILE *fp; 
    struct prenotazione *lista=NULL; 

    fp = fopen("prova.txt","r");
    if (fp == NULL) gestioneErrore();
    lista = leggiFile(fp, lista);
    fclose(fp);
     
    do{
        loginChoice = displayLoginMenu();
        if(loginChoice == 0){  //azioni amministratore
            continueLoop = true;
           
            printf("Insert e-mail: ");
            scanf("%s", buffer_email);
                   
            printf("Insert password (max 7 characters): ");
            scanf("%s", buffer_password);
           
            /*
            Se l'admin non e' presente nella data structure degli admin --> continueLoop = false
                In questo modo torna al menu di login e non vengono eseguite operazioni
            */
            while(continueLoop){
                adminChoice = displayAdminMenu();
                switch (adminChoice){
                case 0: // exit / logout
                    printf("admin logout\n");
                    continueLoop = false;
                    break;
                case 1: // stampa destinazioni
                printf("\nThe destinations and the routes are as follows:\n");
                    printGraph(g);
                    break;
                case 2: // inserisci destinazioni
                    printf("Insert the city you want to enter(N.B. first capital letter):");
                    scanf("%s", city);

                    addNode(g,city);
                                       
                   // addNode(g, getCityName("new destination"));

                    printf("\n~Operation successfully performed~\n");
                    break;
                case 3: // cancella destinazioni
                   printf("\nInsert the city to be deleted(N.B. first capital letter):\n");
                     scanf("%s", deleteCity);
                   
                    // removeNodeByIndex(g, getCityIndex(g, "target city"));

                    removeNodeByString(g,deleteCity);

                   printf("\n ~Operation successfully performed~ \n");
                   
                    break;
                   
                    default: /*Se l'utente sbaglia ad inserire il numero*/
                        printf("This button does not allow you to make choices! Try again!\n");

                           break;
                   
                }
            }
        }else if(loginChoice == 1){//azioni utenti
            continueLoop = true;
                              while(continueLoop){
                                   user1Choice = displayUserMenu1();
                                switch (user1Choice){
                                    case 0: // exit / logout
                                        printf("user logout\n");
                                    continueLoop = false;
                            break;
                   case 1://effettuo iscrizione
                            for(int i=0; i<n; i++){
                            printf("\nInserti e-mail:\n");
                            scanf("%s",email);
                            printf("\nInsert password:\n");
                            scanf("%s",pwd);
                            l=insertTailUtente(l,email,pwd);
                            }
                                break;
                             
                    case 2://effettuo accesso
                                printf("\nInsert e-mail:\n");
                                scanf("%s",email);
                                printf("\nInsert password:\n");
                                scanf("%s",pwd);
                   
                    if(loginChoice == 1){//azioni utenti
                        continueLoop = true;
                    while (continueLoop){
                    userChoice = displayUserMenu();
                        switch (userChoice){
                            case 0:
                                continueLoop = false;
                                break;
                            case 1: // exit/logout
                                    printListPrenotazione(lista);
                        break;
                           case 2: // effettua prenotazione
                        if(loginChoice == 1){//azioni utenti
                    continueLoop = true;
                     while (continueLoop){
                        user2Choice = displayUserMenu2();
                            switch (user2Choice){
                                case 0:
                                 continueLoop = false;
                                    break;
                                case 1://Prenotazione basata sulle rotte più economiche inserendo la città e la destinazione di partenza
                                    break;
                                case 2://Prenotazione basata sui percorsi più brevi inserendo la città di partenza e destinazione
                                break;
                                case 3://Prenotazione basata sulla destinazione più economica inserendo solo la città di partenza
                                break;
                                case 4://Prenotazione basata sulla destinazione più popolare inserendo solo la città di partenza
                                    printf("\nEnter city of start: ");
                                    scanf("%s", cittaPartenza);
                                   
                             printf("\n The most popular destination is the following:\n");
                                 mostPopularDestination = random(g->nodes_count);
                                   
                                     printf("Enter the number of reservations you wish to make\n");
                                     scanf("%d",&m);
                                     for (int i=0; i<m; i++){
                                     printf("\nInsert citta:\n");
                                     scanf("%s",city);
                                     printf("\nInsert id:\n");
                                     scanf("%s",cod_id);
                                     L = insertTailPrenotazioni(L,city,cod_id);
                                     }
                                break;
                                    }
                                  }
                                }
                       case 5: // vedi prenotazioni
                             printListPrenotazioni(L);
                   break;
                           //case 3: // vedi prenotazioni
                            //    printListPrenotazioni(L);

                           // break;
                        }
                 }
            }
        }
   }
           
                }
            else if(loginChoice == 2){
                printf("Thank you goodbye!\n");
            }else{
            printf("This button does not allow you to make choices! Try again!\n");
        }
    }while(loginChoice != 2);
            return 0;
}
 
BUONGIORNO..sto realizzando un progetto in c che gestisce le prenotazioni dei voli ma la funzione random non mi funziona sapete aiutarmi a capire perche?
C:
    int mostPopularDestination = random(g->nodes_count);

Rieccoci cara, come fai a sapere che non funziona se mostPopularDestination non viene mai usata ma solo impostata?
Quello che ti ritorna la macro random e' un numero da 0 a g->nodes_count - 1, sta a te prendere la stringa che corrisponde alla destinazione all'indice random e stamparla con printf. Non che abbia molto senso dire a caso quale sia la piu' visitata
 
Ultima modifica:
Rieccoci cara, come fai a sapere che non funziona se mostPopularDestination non viene mai usata ma solo impostata?
Quello che ti ritorna la macro random e' un numero da 0 a g->nodes_count - 1, sta a te prendere la stringa che corrisponde alla destinazione all'indice random e stamparla con printf. Non che abbia molto senso dire a caso quale sia la piu' visitata
io devo fare la prenotazione in base alla città più popolare
Messaggio unito automaticamente:

io devo fare la prenotazione in base alla città più popolare..quindi avevo pensato di cercare quella più popolare in modo random
Se faccio cosi
printf("\n The most popular destination is the following");
mostPopularDestination = random(g->nodes_count);
printf("id: %d\n",mostPopularDestination);

stampa il numero come faccio a stampare la città?
 
printf("\n The most popular destination is the following");
mostPopularDestination = random(g->nodes_count);
printf("id: %d\n",mostPopularDestination);

stampa il numero come faccio a stampare la città?

Questa e' la domanda giusta, dal source che hai postato qui non posso saperlo, vedo che inserisci il nome tramite addNode(g, citta), dovresti avere una funzione analoga che ti ritorna la stringa e che prende come parametro il grafo e l'indice, ad esempio una con questo formato: char* cityName = getCityName(g, mostPopularDestination);
 
Questa e' la domanda giusta, dal source che hai postato qui non posso saperlo, vedo che inserisci il nome tramite addNode(g, citta), dovresti avere una funzione analoga che ti ritorna la stringa e che prende come parametro il grafo e l'indice, ad esempio una con questo formato: char* cityName = getCityName(g, mostPopularDestination);
si ho la funzione getCityName quindi il nodo non posso aggiungerlo con: addNode?
ma cosi:
addNode(g, getCityName("new destination"));
 
ok ma ho provato a mettere questa funzione char* cityName = getCityName(g, mostPopularDestination); nel main ma non mi funziona mi da errori

Certo che da errore, la tua getCityName non so cosa faccia, accetta una stringa e non si sa cosa ritorna, a te serve una funzione che accetta come parametri il grafo e l'indice e ritorna un puntatore a stringa.
C:
char* cityNameByIndex(Graph G, int index)
{
    char* nome = NULL;
    // trova il nome a cui corrisponde l'index
    // nome = blabla;
    //...
    return nome;
}

E poi la usi cosi'
C:
char* cityName = cityNameByIndex(g, mostPopularDestination);
 
Ultima modifica:
Certo che da errore, la tua getCityName non so cosa faccia, accetta una stringa e non si sa cosa ritorna, a te serve una funzione che accetta come parametri il grafo e l'indice e ritorna un puntatore a stringa.
C:
char* cityNameByIndex(Graph G, int index)
{
    char* nome = NULL;
    // trova il nome a cui corrisponde l'index
    // nome = blabla;
    //...
    return nome;
}

E poi la usi cosi'
C:
char* cityName = cityNameByIndex(g, mostPopularDestination);
cosi


C:
char* getCityIndexByIndex1(Graph G, int key){
    assert(G != NULL);
    assert(G->cityNames != NULL);
    int index = 1;
    int i;
    for(i=0; i<G->nodes_count; i++){
        if(!strcmp(G->cityNames[i], key)){
            index = i;
            break;
        }
    }
    return index;
}
potresti aiutarmi a creare questa funzione?
 
cosi

potresti aiutarmi a creare questa funzione?

Ahh, ecco non avendo la struct aggiornata di Graph non sapevo come fosse organizzato e che ci fosse semplicemente cityNames come char**. Allora non ti serve una funzione a parte puoi semplicemente fare:
C:
char* cityName = g->cityNames[mostPopularDestination];
 
  • Mi piace
Reazioni: sara20
Ahh, ecco non avendo la struct aggiornata di Graph non sapevo come fosse organizzato e che ci fosse semplicemente cityNames come char**. Allora non ti serve una funzione a parte puoi semplicemente fare:
C:
char* cityName = g->cityNames[mostPopularDestination];
ah vorrei chiederti anche un altra cosa perchè nella dichiarazione di " randomize;" mi da questo:Implicit conversion loses integer precision: 'time_t' (aka 'long') to 'unsigned int'...come potrei risolverlo?
 
Come sempre nella stessa discussione tante domande ... non un forum ma una chat

Sai cosa è un cast? Devi fare il cast ad unsigned int di time(NULL) ...
 
Ultima modifica:
Come sempre nella stessa discussione tante domande ... non un forum ma una chat

Sai cosa è un cast? Devi fare il cast ad unsigned int di time(NULL) ...
si cosi:randomize srand(((unsigned int) time(NULL)))
Messaggio unito automaticamente:

Grazie mille @JunkCoder..sei stato molto gentile :)
Messaggio unito automaticamente:

Come sempre nella stessa discussione tante domande ... non un forum ma una chat

Sai cosa è un cast? Devi fare il cast ad unsigned int di time(NULL) ...
grazie :)
 
Stato
Discussione chiusa ad ulteriori risposte.