Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c] Numero di Sottosequenze decrescenti

    Salve a tutti, ho un problema che non riesco a risolvere da stamattina: devo contare il numero di sottosequenze strettamente decrescenti di una sequenza di N interi e gestire i casi in cui la sequenza comprenda meno di due elementi.

    Con un ciclo while inserisco i valori nel vettore terminando con 0.
    Come faccio a contare queste maledette sottosequenze?
    codice:
    #include <stdio.h>
    #define N 100
    int main(void)
    {
    	int valore;
    	int v[N];		
    	int i;
    	int count=0;	//conta le sottosequenze
    	int len=0;	// lungh. vettore
    
    	i=0;
    	printf("Inserisci una sequenza di interi terminata da 0:\n");
    	scanf("%d", &valore);
    	while(valore!=0)
    	{
    		v[i++] = valore;
    		scanf("%d", &valore);
    	}
    	len=i-1;	//escludo lo zero
    
    	while(i<=len)	//scandisco il vettore fino alla fine(escluso lo 0)		
    	{
    		while(v[i]>v[i+1]){    //se il primo elemento è magg del secondo
    			i++;      // vai al successivo
    		}
    		if(v[i]<v[i+1])        
                             {
    		    count++;
    		    i++;
    		}
    	}
    
    
    	printf("Le sottosequenze decrescenti sono %d.\n\n", count);
    	
    	return 0;
    }
    Grazie in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [c] Numero di Sottosequenze decrescenti

    Originariamente inviato da Alessia1984
    devo contare il numero di sottosequenze strettamente decrescenti di una sequenza di N interi e gestire i casi in cui la sequenza comprenda meno di due elementi.
    Scusa, mi puoi fare un esempio di output? Non ho afferrato bene il concetto.. :master:

  3. #3
    Si, scusate!Ecco qua

    Ad esempio, se la sequenza di input fosse
    2 4 3 1 6 7 6 5 3 9 10 13 7 6 4 2 6 0
    le sottosequenze decrescenti sarebbero 3.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non è difficile. Ti basta fare un ciclo su tutto l'array, poi ad ogni passo salvi la posizione attuale e, con un ciclo interno, leggi l'array "in avanti" per vedere se gli elementi successivi sono man mano sempre strettamente minori: se trovi una sequenza di almeno due numeri strettamente decrescente, incrementi un apposito contatore, altrimenti nulla; in ogni caso, dopo, riparti con la lettura dell'array dalla posizione salvata in precedenza e ripeti la stessa cosa per tutti gli elementi del vettore.
    Per quanto riguarda questo:

    gestire i casi in cui la sequenza comprenda meno di due elementi.
    non ho capito cosa si intende con "gestire"... cosa dovresti fare? Contarle separatamente?
    every day above ground is a good one

  5. #5
    Non essendo ancora molto pratica in c, potresti scrivermelo in codice?
    Ho provato così:

    codice:
    #include <stdio.h>
    #define N 100
    int main(void)
    {
    	int valore;
    	int v[N];		
    	int i,j,pos;
    	int count=0;	//conta le sottosequenze
    	int len=0;	// lungh. vettore
    
    	i=0;
    	printf("Inserisci una sequenza di interi terminata da 0:\n");
    	scanf("%d", &valore);
    	while(valore!=0)
    	{
    		v[i++] = valore;
    		scanf("%d", &valore);
    	}
    	len=i-1;	//escludo lo zero
    
    	for(i=0; i<len; i++)
    	{
    		pos=i;
    		for(j= pos +1; j<len; j++)
    		{
    			if(v[pos]>v[pos+1]){
    				count++;
    			}
    			if(v[pos]<v[pos+1]){
    				;
    			}
    	
    		}
    	}
    	printf("Le sottosequenze decrescenti sono %d.\n\n", count);
    	
    	return 0;
    }
    ma non riesco!!

    Per quanto riguarda questo:

    gestire i casi in cui la sequenza comprenda meno di due elementi.
    significa gestire il caso in vengono inseriti solo due valori nell'array v[].

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Alessia1984
    Non essendo ancora molto pratica in c, potresti scrivermelo in codice?
    E' proprio perché non sei molto pratica che devi provare a farlo da sola, se te lo scrivessi io non ti darei alcun aiuto. Leggendo il tuo codice, comunque

    codice:
    		pos=i;
    		for(j= pos +1; j<len; j++)
    		{
    			if(v[pos]>v[pos+1]){
    				count++;
    			}
    ti puoi rendere conto di cosa non va (al di là del fatto che non è ancora completo): in quel ciclo interno fai scorrere un indice (j) da pos+1 a len-1, ma poi il confronto nell'if lo fai tra gli elementi di indice pos e pos+1... in quel ciclo pos rimane invariato al valore i (che imposti prima del ciclo stesso), l'indice che varia non è pos ma j...

    Ragionaci di più.
    every day above ground is a good one

  7. #7
    Ho fatto così...dovrebbe essere giusto.

    codice:
    #include <stdio.h>
    #define N 100
    
    
    int main(void)
    {
    	int valore,n_seq=0;
    	int v[N];		
    	int i,j,n=0;
    	int count;	
    	int len=0;	// lungh. vettore
    
    	i=0;
    	printf("Inserisci una sequenza di interi terminata da 0:\n");
    	scanf("%d", &valore);
    	while(valore!=0)
    	{
    		v[i++] = valore;
    		scanf("%d", &valore);
    	}
    	len=i-1;	//escludo lo zero
    
    	n=0;
    	count=0;
    	for(i=n; i<=len-1; i++)
    	{		
    		for(j=n ; j<=len-1; j++)
    		{
    			if(v[j]>v[j+1])
    				count=1;
    			
    			if(v[j]<v[j+1]){
    				break;
    			}
    		}
    		n=j+1;	//memorizzo l'indice
    		if(count==1)	//se count=1 allora incremento n_seq
    			n_seq++;
    		count=0;		
    	}
    	printf("Le sottosequenze decrescenti sono %d.\n\n", n_seq);
    	
    	return 0;
    }
    Ciao e Grazie

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.