Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Stabilire se una stringa e' crescente o decrescente

    Salve,ho iniziato a fare programmazione in C con l' universita'.
    Un esercizio ha come scopo chiedere quanti numeri vuoi digitare,farti digitare tot numeri (scelti da te precedentemente),e poi dare come output quanti di questi numeri sono pari,dispari,positivi,negativi e nulli.Ma chiede anche,alla fine,di dire se la sequenza di numeri e' crescente,decrescente o in ordine sparso.
    Io ho scritto cosi' il programma:
    codice:
    #include<stdio.h>  
    main()
    {
      int a,b,positivi,nulli,negativi,pari,dispari;
      int i,k;                                                    
      int vet[100];
      positivi=nulli=negativi=pari=dispari=0;
      i=k=0;
      printf("Quanti numeri vuoi digitare? ");
      scanf("%d",&a);
      for(b=0;b<a;++b){
        printf("Digita numero %d: ",b+1);
    	scanf("%d",&vet[b]);
    	if(vet[b]>0)
    	  ++positivi;
    	else if(vet[b]<0)
    	  ++negativi;
    	else
    	  ++nulli;
    	if(vet[b]%2==0)
    	  ++pari;
    	else
    	  ++dispari;
    	}
      printf("Positivi: %d nulli: %d negativi: %d pari: %d dispari %d ",positivi, nulli,    negativi,pari,dispari); 
      for(b=0;b<a;++b){
        if(vet[b]<vet[b+1])
          ++k;}
      for(b=0;b<a;++b){
        if(vet[b]>vet[b+1])
          ++i;}
      if(a==k)
        printf("La sequenza e' crescente");
      else if(a==i)
        printf("La sequenza e' decrescente");
      else
        printf("La sequenza e' in ordine sparso");
      return 0;
    }
    Il problema e' che non sapevo come fare per stabilire la condizione che il vettore vet[b] ha tutti gli argomenti in ordine crescente (o decrescente), allora ho usato le variabili i e k.Se per esempio digito 3 numeri a caso tipo 1,2,3 mi dice stampa "la sequenza e' crescente",ma se li stampo in ordine decrescente (es.:3,2,1) mi stampa che e' in ordine sparso.
    Non da nessuno errore ne warning,non so se ci sia un modo piu' "elegante" per andare a vedere se il vettore e' crescente o decrescente,senza usare le variabili i e k,ma non mi sono venute altre idee.
    Avete qualche suggerimento?

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Nn ho capito molto bene, ma forse sottraendo elemento ad elemento avrai un valore indicativo dell'andamento del tuo vettore.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Il problema è piuttosto semplice, perciò ti do un consiglio: prova di nuovo a trovarlo da solo, è veramente facile. Per aiutarti, metti un bel
    codice:
    printf("DEBUG: k = %d, i = %d\n", k , i);
    subito dopo i due cicli for con cui conti k e i. Dovrebbe fartelo capire subito. Comunque se non ci arrivi sotto c'è la soluzione.


    -----------------------------------------------


    Tu decidi di inserire 3 numeri, quindi a viene inizializzato a 3. Ok?
    Nei due cicli for, b assume i valori da 0 ad (a - 1). Questo significa che quando fai il confronto
    codice:
    vec[b] > vec[b + 1]
    stai facendo il confronto
    codice:
    vec[a - 1] > vec[a]
    , e ovviamente vec[a] non esiste: è il primo elemento *fuori* dall'array.

    Quando vuoi fare un confronto tra gli elementi consecutivi di un array dovrai quindi fermarti un elemento prima, il che significa
    codice:
     for (b = 0; b < (a - 1); ++b)
    E poi ancora: alla fine fai il controllo
    codice:
    if (a == k)
    .
    Immagina che il vettore abbia 3 elementi. Una volta sistemato il ciclo come detto sopra, otterrai sempre che la sequenza è in ordine sparso. Questo perchè con 3 elementi puoi fare al massimo 2 confronti, quindi se i 3 numeri fossero crescenti k sarebbe uguale a 2, e non 3.

    Ciao
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Invece di k & i puoi anche usare una sola variabile in questa maniera
    codice:
       ...
    
       b = i = 0;
    	
       while(b < (a - 1))
       {
          if(vet[b] < vet[b + 1])
             i++;
    	
             b++;
       }
    	
       if(i == 0)
          printf("La sequenza e' decrescente\n");
       else if(i == (a - 1))
          printf("La sequenza e' crescente\n");
       else if(i != (a-1) && i != 0)
          printf("La sequenza e' in ordine sparso\n");
    
       return 0;
    }

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Gia',non avevo tenuto conto del fatto che vengono fatti a-1 paragoni tra gli elementi del vettore.
    Ovviamente vet[b-1] non esiste e allora quando fa il paragone tra vet[b-1] e qualsiasi condizione,questa viene data per vera (infatti se faccio cosi' alla prima iterazione mi stampa k e i entrambe uguali a 1).Era banale,ho risolto ponendo cambiando l' ultima parte del ciclo,che diventa:
    codice:
    printf("Positivi: %d nulli: %d negativi: %d pari: %d dispari %d ",positivi, nulli,    negativi,pari,dispari); 
      for(b=0;b<(a-1);++b){
        if(vet[b]<vet[b+1])
          ++k;}
      for(b=0;b<a;++b){
        if(vet[b]>vet[b+1])
          ++i;
    	}
      if((a-1)==k)
        printf("La sequenza e' crescente");
      else if((a-1)==i)
        printf("La sequenza e' decrescente");
      else
        printf("La sequenza e' in ordine sparso");
      return 0;
    }
    E stavolta mi viene giusta.
    Grazie per i suggerimenti,ho risolto.
    EDIT:
    Originariamente inviato da simo_85
    Invece di k & i puoi anche usare una sola variabile in questa maniera
    codice:
       ...
    
       b = i = 0;
    	
       while(b < (a - 1))
       {
          if(vet[b] < vet[b + 1])
             i++;
    	
             b++;
       }
    	
       if(i == 0)
          printf("La sequenza e' decrescente\n");
       else if(i == (a - 1))
          printf("La sequenza e' crescente\n");
       else if(i != (a-1) && i != 0)
          printf("La sequenza e' in ordine sparso\n");
    
       return 0;
    }
    Come idea mi piace,pero' il problema e' che la condizione che vet[b]<vet[b+1] non implica che vet[b]>vet[b+1],perche' non consideri il caso che vet[b]=vet[b+1].
    Se lo scrivo cosi' e per esempio inserisco a=3,poi digito 2,2,2 mi stampa che il vettore e' decrescente.Comunque ho risolto,grazie per le idee.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    codice:
    for(b=0;b<a;++b){
        if(vet[b]>vet[b+1])
          ++i;
    Occhio che questo non l'hai corretto.

    Ah, e un consiglio... indentazione, indentazione, indentazione!
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da ramy89
    Come idea mi piace,pero' il problema e' che la condizione che vet[b]<vet[b+1] non implica che vet[b]>vet[b+1],perche' non consideri il caso che vet[b]=vet[b+1].
    Se lo scrivo cosi' e per esempio inserisco a=3,poi digito 2,2,2 mi stampa che il vettore e' decrescente.Comunque ho risolto,grazie per le idee.
    3 2 2 2 è descrecente

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Credo che intenda strettamente decrescente.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    In relata' nel problema non specifica se intende strettamente crescente o no,resta il fatto che se faccio come dice simo comunque una stringa del tipo 2,2,2 me la da crescente,e una stringa del tipo 3 2 2 me la da in ordine sparso,per cui ho riscritto il codice cosi':
    codice:
    #include<stdio.h>  
    main()
    {
      int a,b,positivi,nulli,negativi,pari,dispari;
      int k,i;                                                  
      int vet[100];
      positivi=nulli=negativi=pari=dispari=0;
      k=i=0;
      printf("Quanti numeri vuoi digitare? ");
      scanf("%d",&a);
      for(b=0;b<a;++b)
        {
        printf("Digita numero %d: ",b+1);
    	scanf("%d",&vet[b]);
    	if(vet[b]>0)
    	  ++positivi;
    	else if(vet[b]<0)
    	  ++negativi;
    	else
    	  ++nulli;
    	if(vet[b]%2==0)
    	  ++pari;
    	else
    	  ++dispari;
        }
        printf("Positivi: %d nulli: %d negativi: %d pari: %d dispari %d ",positivi, nulli,      negativi,pari,dispari); 
      for(b=0;b<(a-1);++b)
        {
        if(vet[b]<=vet[b+1])
    	  ++k;
    	if(vet[b]>=vet[b+1])
    	  ++i;
        }
      if(k==(a-1)&&i!=(a-1))
        printf("\nLa sequenza e' crescente");
      else if(i==(a-1)&&k!=(a-1))
        printf("\nLa sequenza e' decrescente");
      else
        printf("\nLa sequenza e' in ordine sparso");
      return 0;
    }
    In questo modo mi stampa sequenza crescente anche se la sequenza e' 1,2,2 o decrescente se e' 3,2,2 e me la stampa in ordine sparso se inserisco 3 numeri uguali o se a=1.
    Credo sia tutto a posto,ho pure indentato

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Potresti usare la variabile k a questo scopo
    codice:
       ...
    
       b = i = k = 0;
    	
       while(b < (a - 1))
       {
          if(vet[b] < vet[b + 1])
             i++;
          if(vet[b] == vet[b + 1]
             k++;
    
             b++;
       }
    	
       if(i == 0)
          printf("La sequenza e' decrescente\n");
       else if(i == (a - 1))
          printf("La sequenza e' crescente\n");
       else if(i != (a-1) && i != 0)
          printf("La sequenza e' in ordine sparso\n");
       else if(k == (a - 1))
          printf("Le cifre della sequenza sono totalmente uguali fra loro\n");
    
       return 0;
    }
    Dovrebbe funzionare, not tested..

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.