Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-05-2015, 17:00   #1
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Ordinamento e Array

Salve a tutti,
tra un paio di giorni ho l'esame di programmazione, devo però portare dei programmi, uno di questi mi sta dando diversi problemi nell'implementazione. Vi scrivo qui sotto il testo richiesto:

In questo esercizio ti viene chiesto di implementare l'algoritmo di Selection Sort visto in classe.

Una volta implementato l'algoritmo, risolvi i seguenti esercizi:
3. Dato un vettore di interi v e un intero x, scrivi una funzione in C che stampa a video la piu piccola
sequenza di elementi di v la cui somma supera x. Ad esempio, supponiamo che v = {3; 12;-1; 10}.
A tal ne basta prendere la sequenza formata dall'unico elemento 12 per avere 12 > 10. Qual'e la
complessita computazionale dell'algoritmo proposto?


Probabilmente, anzi quasi sicuramente ci sarà un modo migliore per implementarlo, quindi anche in questo vorrei essere aiutato, comunque la parte che mi manca è quella che mi confronta i singoli elementi dell'array con la x, quando ho provato a implementarlo il problema è che mi stampava tutti e tre i risultati, cioè sia la somma di due che somma dei tre elementi insieme al singolo.
Vi scrivo, quindi, il codice qui sotto:




Codice:
#include <stdio.h>
#include <stdlib.h>

const int dim = 3;		//Dimensione

int main()
{
    int* v = (int*)calloc(dim,sizeof(int));	//Crea un array dinamico di 4 celle tute inizializzate a 0
    int k,somma,i,j,totale;
    printf("Inserisci elementi:\n"); 
    for (i = 0 ; i < dim ; i++ )
    {			//Inserisco i valori nelle celle scandite da 0 a 3
        printf("\tInserisci valore: ");
        scanf("%d", &v[i]);
	}
    
    int x;
    printf("inserisci un intero x \n");		//Setto il valore di x
    scanf("%d", &x);
    
    k = somma = totale = 0;
    while(k < dim)
    {							//Se il mio scan di indice raggiunge la fine dell'array
		for(j = 0; j < dim; j++)
        {			//Sotto ciclo per scandire le altre posizioni
			if(j != k)
            {						//Leggo tutte le posizioni tranne in quella dove sono
				somma = v[k]+v[j];
				if(somma > x)
                {				//Se la somma è superiore a x, ho finito esco dal programma e faccio una stampa.
					printf("Nella posizione v[%d]=%d e v[%d]=%d la loro somma e' %d supera il valore x=%d\n",k,v[k],j,v[j],somma,x);
                    return 0;
				}
                
		    }
		}
		k++;
		for(j = 0; j < dim; j++)
        {
		    if(j != k)
		    {
                totale = v[k]+v[j]+v[j++];
                if(somma < x && totale > x)
	            {
				    printf("La somma di tutti gli elementi nel vettore e' %d supera il valore x=%d\n",totale,x);
                    return 0;   
				}
		    }
		}
	}
	printf("La somma di tutti gli elementi dell'array e' minore di x= %d\n",x);	//Se sono arrivati qui senza essere stato bloccato sopra vuol dire che non ci sono elementi per cui la loro somma sia superiore ad x.
	free(v);	//Libero la memoria allocata per V, per renderla di nuovo disponibile al OS
    return 0;
}


Chiedo un vostro aiuto, ringrazio anticipatamente.

Ultima modifica di shiony710 : 20-05-2015 alle 00:10.
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 05:54   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2776
Secondo me il problema è mal posto: perché l'esercizio inizia dicendo che ti viene richiesto di implementare l'algoritmo di selection sort?
Probabilmente vuole che il vettore lo tratti come un insieme e non come una sequenza al fine di trovare la più piccola sequenza di numeri (diversi) la cui somma supera x.
Così avrebbe molta più attinenza con il sorting...
Se così non fosse, riguardo il tuo codice, ti consiglio di dividerlo in sotto funzioni (tra l'altro ti viene richiesto di scrivere una funzione). Inoltre la dimensione dell'array deve essere variabile quindi il modo in cui hai scritto l'algoritmo non va proprio bene...
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 05:54   #3
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Edito: già risposto wingman
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 06:06   #4
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Ordini il vettore dal più piccolo al più grande poi di volta in volta sommi gli elemento dell'array fino a che la somma supera l'intero di riferimento
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 06:11   #5
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Nell'esempio il vettore ordinato sarebbe v= {12,10,3,-1} e x=10, quindi dato che 12 è già maggiore di x il ciclo di somma si chiude e il risultato è 12
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 13:51   #6
Zeppe79
Senior Member
 
Iscritto dal: Feb 2006
Messaggi: 326
forse

se vuoi risolvere l'esercizio utilizzando il sorting, come dice mattia, ordini il vettore dall'intero più grande al più piccolo, e all'interno di un ciclo fai il confronto. es: v=[9,4,-5,7,3,11] e x=14.
ordini v, così da avere [11,9,7,4,3,-5]
inizi il ciclo:
11 > 14 ? no
(11+9) > 14 ? sì -> fine ciclo, trovato il risultato
Zeppe79 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 15:43   #7
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Credo di averlo terminato, a me il programma funziona correttamente ditemi se c'è qualcosa da correggere


Codice:
#include <stdio.h>
 
int main()
{
   int v[100], n, i, j, position, swap, somma=0;
   
 
   printf("Inserisci il numero degli elementi\n");
   scanf("%d", &n);
 
   printf("Inserisci %d elementi\n", n);
 
   for ( i = 0 ; i < n ; i++ )
      scanf("%d", &v[i]);
 
   for ( i = 0 ; i < ( n - 1 ) ; i++ )
   {
      position = i;
 
      for ( j = i + 1 ; j < n ; j++ )
      {
         if ( v[position] < v[j] )
            position = j;
      }
      if ( position != i )
      {
         swap = v[i];
         v[i] = v[position];
         v[position] = swap;
      }
   }
 
   printf("Lista in ordine decrescente:\n");
 
   for ( i = 0 ; i < n ; i++ )
      printf("%d\n", v[i]);
    int x;
    printf("inserisci un intero x \n");		//Setto il valore di x
    scanf("%d", &x);
    for( i = 0; i < n; i++)
	{
	     if ( v[i] > x)
         {
  			 printf("Il primo elemento dell'array=%d e' maggiore di x=%d", v[i], x);
			 return 0;
		 }
		 else
		 {
			for(i = 0; i < n; i++)
			{
				somma += v[i];
				if (somma > x)
			    {
					printf("la somma degli elementi e' %d maggiore di x %d", somma, x);
					return 0;
			    }
			}
		 }
	 
       printf("La somma di tutti gli elementi dell'array e' minore di x= %d\n",x);	
    }
	return 0;
   
}

Ultima modifica di shiony710 : 20-05-2015 alle 17:44.
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 18:41   #8
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Ad occhio sembra che funzioni ma non mi pare che ritorni un secondo vettore che contiene solo la minore sequenza di elementi che servono per superare il numero x
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 21:39   #9
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
ma perché comunque il testo non è molto chiaro, non capisco se come sequenza intendi il minor numero di elementi da utilizzare o anche la grandezza degli elementi, se fosse come nel secondo caso come dovrei cambiarlo?
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 21:45   #10
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
La traccia dice di stampare a video la più piccola sequenza degli elementi dell'array v, tale che la somma di questi superi il valore di x
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 00:20   #11
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Si, ma ripeto non si capisce se con "sequenza" intendo il numero di elementi da utilizzare o anche la grandezza degli elementi
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 06:42   #12
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Scusatemi eh, che c'è di poco chiaro? Una sequenza è una serie di oggetti disposti in un certo ordine.

Dunque, il compito del programma è quello di stampare a video la più piccola "lista" di numeri la cui somma supera 'x'.

Comunque, non per rompere le uova nel paniere, ma l'esercizio chiede che sia scritta una funzione che risolva questo problema. Tra l'altro, il C è stato proprio pensato e realizzato per scomporre il programma in funzioni.
Mettere tutto nel main è il modo peggiore di usare questo linguaggio
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 06:48   #13
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Sono pienamente d'accordo!
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 08:22   #14
Zeppe79
Senior Member
 
Iscritto dal: Feb 2006
Messaggi: 326
ciclo di troppo ?

dorvesti spezzare il codice in funzioni, anche solo per aumentare la leggibilità: almeno 1 funzione che fa il sorting (array in ingresso,e array in uscita), 1 funzione che fa la ricerca (array in ingresso, x in ingresso, risultato in uscita). Nel main tieni l'interazione con l'utente.

Secondo me nella funzione di ricerca fai un ciclo di troppo:

Codice:
for( i = 0; i < n; i++)
{
    if ( v[i] > x)
    {
        printf("Il primo elemento dell'array=%d e' maggiore di x=%d", v[i], x);
	return 0;
     }
    .....
secondo me il controllo che fai su v[i] lo puoi integrare nel secondo ciclo, iniziando da somma = 0;

Codice:
somma = 0;
for(i = 0; i < n; i++)
{
	somma += v[i];

	if (somma > x)
        {
		printf("la somma degli elementi e' %d maggiore di x %d", somma, x);
		return 0;
	}
}
In più dovresti salvare l'array di elementi la cui somma > x, o quanto meno l'indice i dell'array ordinato dove raggiungi il risultato.
Zeppe79 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 15:41   #15
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Ok perfetto, vi ringrazio per l'aiuto, siete stati gentilissimi , vorrei però usufruire una seconda volta del vostro aiuto per chiedermi chiarimenti riguardante la complessità, sia in questo programma che in generale.
Perché studiandola sia da internet che dal libro, ho avuto scarsi risultati nel comprenderla, quindi se in qualche modo potete darmi una mano ne sarei entusiasta
shiony710 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Le sonde spaziali ESA ExoMars e Mars Exp...
Roscosmos: static fire per i propulsori ...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Al via i coupon nascosti di ottobre: qua...
Ferrari Elettrica si aggiorna solo in of...
Doppio sconto sugli smartphone top Xiaom...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v