Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [Linguaggio C] Sottoliste dispari

    Leggere un intero n>0 e un k<n. Costruire una lista L di n numeri interi casuali minori di 50 e stampare la lista. Individuare e stampare tutte le sottoliste di k elementi di L la cui somma sia dispari.

    IMPORTANTE: Organizzare il programma in funzioni (una per generare la lista, una per stamparla, una per le sottoliste).

    Esempio. Sia n = 9 e k = 3. Supponiamo che venga generata la lista:

    15 --> 17 --> 37 --> 27 --> 21 --> 32 --> 5 --> 37 --> 9 --> NULL

    allora vengono stampate le seguenti sottoliste di 3 elementi la cui somma è dispari:

    15 --> 17 --> 37 -->NULL
    17 --> 37 --> 27 -->NULL
    37 --> 27 --> 21 -->NULL
    5 --> 37 --> 9 -->NULL

    Questo è ciò che ho fatto io:
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    struct nodo *crealista();
    void stampalista(struct nodo *p);
    int sottolistedispari ();
    struct nodo{
           int dato;
           struct nodo *next;
    };
    
    main()
    {
          struct nodo *start, *p, *q;
          start = crealista();
          stampalista (start);
          printf("\n\n\n");
          sottolistedispari();
          system("PAUSE");
          return 0;
    }
    
    struct nodo *crealista()
    {
           struct nodo *p, *start, *last;
           int i, n, x;
           start = NULL;
           srand(time(NULL));
           printf ("Quanti nodi ha la lista? \n");
           scanf("%d", &n);
           if(n<=0){
                    printf("Inserisci un numero di nodi maggiore di zero: \n");
                    scanf("%d", &n);
           }
           for(i=0; i<n; i++){
                    p = (struct nodo *)malloc(sizeof (struct nodo));
           if(i == 0)
             start = p;
           else
             last->next = p;
             p->dato = rand() % (1) + 25;
             p->next = NULL;
             last = p;
           }
    printf("\n\n\n");
    return(start);
    }
    
    void stampalista(struct nodo *p)
    {
         while(p != NULL){
                 printf("%d -->", p->dato);
                 p = p->next;
         }
    printf("NULL \n\n\n");
    }
    
    int sottolistedispari ()
    {
        struct nodo *p, *start, *last;
        int i, j, k, n, somma;
        printf("Quanti nodi hanno le sottoliste? \n");
        scanf("%d", &k);
        if(k >= n){
             printf("Inserisci un numero di nodi delle sottoliste inferiore a quello della lista: \n");
        }
        
        for(i=0; i<n; i++){
                 for(j=n; j<n-k; j++){
                          somma = somma + p;
                          p = p->next;
                 }
          if(somma % 2 != 0){
                 stampalista(start);
          }
        }
    return;
    }

    Sicuramente ho sbagliato ad effettuare la somma ma non riesco a venirne a capo.
    Spero che qualcuno di voi possa aiutarmi...con le liste sono davvero impreparato.
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    void sottolistedispari (struct nodo *lista, int n)
    {
        struct nodo *temp, *temp1 ;
        int j, k, i, somma;
        do {
        	printf("Inserisci un valore di k minore di n: ");
        	scanf("%d", &k);
        } while(k>=n);
        temp = lista;
        for(i=0; i<(n-k); i++){
          for(j=i; j<(i+k); j++){
                 somma = somma + temp->dato;
                 temp = temp->next;
          }
          if(somma % 2 != 0){
                 temp1 = temp->next;
                 temp->next = NULL;
                 stampalista(temp);
                 temp->next = temp1;
          }
          lista = lista->next;
          temp = lista;
        }
    }
    Ammesso che il resto del codice sia corretto!
    n è la lunghezza della lista...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Originariamente inviato da Scara95
    codice:
    void sottolistedispari (struct nodo *lista, int n)
    {
        struct nodo *temp, *temp1 ;
        int j, k, i, somma;
        do {
        	printf("Inserisci un valore di k minore di n: ");
        	scanf("%d", &k);
        } while(k>=n);
        temp = lista;
        for(i=0; i<(n-k); i++){
          for(j=i; j<(i+k); j++){
                 somma = somma + temp->dato;
                 temp = temp->next;
          }
          if(somma % 2 != 0){
                 temp1 = temp->next;
                 temp->next = NULL;
                 stampalista(temp);
                 temp->next = temp1;
          }
          lista = lista->next;
          temp = lista;
        }
    }
    Ammesso che il resto del codice sia corretto!
    n è la lunghezza della lista...
    Grazie mille per la risposta...Ora provo la tua soluzione. Sei stato gentilissimo.
    Però mi chiedo (solo per pura curiosità e cercare di imparare) perchè hai usato una variabile temp e non la variabile p?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    p è presente nel main, ma non è presente all'interno della funzione...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    ah capito...e nel main come la richiamo la funzione? sottolistedispari(start)?

    Quando dichiaro il prototipo della funzione prima del main il compilatore mi da errore...

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    La funzione che io ho corretto prende un argomento in più: la lunghezza della lista, questo facilita molto le cose...

    il prototipo deve quindi essere:
    codice:
    void sottolistedispari (struct nodo *, int)
    la richiami con:
    codice:
    sottolistedispari(start, length(start));
    dove length potrebbe essere:
    codice:
    int length(struct nodo *lista) {
      if(lista==NULL)
        return 0;
      return (1+length(lista->next));
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    quindi dovrebbe venire così?
    [CODE]#include<stdio.h>
    #include<stdlib.h>
    #include<time.h>

    struct nodo *crealista();
    void stampalista(struct nodo *p);
    void sottolistedispari (struct nodo *, int);
    struct nodo{
    int dato;
    struct nodo *next;
    };

    main()
    {
    int somma;
    struct nodo *start, *p, *q;
    start = crealista();
    stampalista (start);
    printf("\n\n\n");
    sottolistedispari(start, lenght (start));
    system("PAUSE");
    return 0;
    }

    struct nodo *crealista()
    {
    struct nodo *p, *start, *last;
    int i, n, x;
    start = NULL;
    srand(time(NULL));
    printf ("Quanti nodi ha la lista? \n");
    scanf("%d", &n);
    if(n<=0){
    printf("In

  8. #8
    quindi dovrebbe venire così?
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    struct nodo *crealista();
    void stampalista(struct nodo *p);
    void sottolistedispari (struct nodo *, int);
    struct nodo{
           int dato;
           struct nodo *next;
    };
    
    main()
    {
          int somma;
          struct nodo *start, *p, *q;
          start = crealista();
          stampalista (start);
          printf("\n\n\n");
          sottolistedispari(start, lenght (start));
          system("PAUSE");
          return 0;
    }
    
    struct nodo *crealista()
    {
           struct nodo *p, *start, *last;
           int i, n, x;
           start = NULL;
           srand(time(NULL));
           printf ("Quanti nodi ha la lista? \n");
           scanf("%d", &n);
           if(n<=0){
                    printf("Inserisci un numero di nodi maggiore di zero: \n");
                    scanf("%d", &n);
           }
           for(i=0; i<n; i++){
                    p = (struct nodo *)malloc(sizeof (struct nodo));
           if(i == 0)
             start = p;
           else
             last->next = p;
             p->dato = rand() % (1) + 25;
             p->next = NULL;
             last = p;
           }
    printf("\n\n\n");
    return(start);
    }
    
    void stampalista(struct nodo *p)
    {
         while(p != NULL){
                 printf("%d -->", p->dato);
                 p = p->next;
         }
    printf("NULL \n\n\n");
    }
    
    void sottolistedispari (struct nodo *lista, int n)
    {
        struct nodo *temp, *temp1 ;
        int j, k, i, somma;
        do {
        	printf("Inserisci un valore di k minore di n: ");
        	scanf("%d", &k);
        } while(k>=n);
        temp = lista;
        for(i=0; i<(n-k); i++){
          for(j=i; j<(i+k); j++){
                 somma = somma + temp->dato;
                 temp = temp->next;
          }
          if(somma % 2 != 0){
                 temp1 = temp->next;
                 temp->next = NULL;
                 stampalista(temp);
                 temp->next = temp1;
          }
          lista = lista->next;
          temp = lista;
        }
    }
    ma il compilatore continua a darmi lo stesso errore "too few arguments to function 'voi sottolistedispari(nodo*, int)"

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Mi sorge un dubbio...
    Dove hai appreso il C? Hai un libro da cui studiare? Conoci bene le basi (le funzioni, i puntatori, il concetto di scope...)?

    Edit: se usi length, devi includere la sua dichiarazione! Io l'ho scritta come funzione d'appoggio per calcolare la lunghezza della lista, ma devi includerla nel codice!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Sono alle prime armi con il C e sto cercando di apprenderlo dal mio prof dell' università e tramite i suoi appunti che ci ha dato in dotazione.
    So che la mia preparazione può sembrare pessima ma, fidati che quella del mio prof non è migliore se non per esperienza (è un laureato in fisica a cui è stata data la cattedra di Programmazione 1).
    Questo è il compito d'esame che devo consegnare domani e vi prego di aiutarmi perchè sono disperato.
    Ovviamente la mia conoscenza del Linguaggio C non vuole limitarsi ai fini dell'esame, anche perchè mi affascina sempre di più e vorrei approfondire ancora...

    Quindi il lenght va aggiunto al main?

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.