[Linguaggio C]Individuare sequenza massima in un array

di il
3 risposte

[Linguaggio C]Individuare sequenza massima in un array

Leggere o generare una sequenza di n numeri interi e un k <= n. Stampare l'array letto o generato. Individuare e stampare la sequenza di k numeri contigui avente somma massima.

Esempio. Se k = 3 e l’array è:

[3, 5, 8, 1, 9, 7]

La prima sequenza di tre elementi (3, 5, ha somma 16,
la seconda sequenza (5, 8, 1) ha somma 14,
la terza (8, 1, 9) ha somma 18,
la quarta (1, 9, 7) ha somma 17,
per cui viene stampata la sequenza (8, 1, 9).

IMPORTANTE: Organizzare il programma in funzioni (una per leggere l’ array, una per stamparlo, una per individuare la sequenza massima). Non utilizzare array ausiliari, non introdurre variabili globali.

Questo è quello che sono riuscito a fare io:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
void crearray(int A[MAX], int n);
void stamparray(int A[MAX], int n);
void sequenzamassima(int A[MAX], int n);

main()
{
      int i, n, A[MAX];
      printf("Quanti elementi vuoi inserire nell' array?");
      scanf("%d", &n);
      crearray(A, n);
      stamparray(A, n);
      sequenzamassima(A, n);
      system("PAUSE");
      return 0;
}

void crearray(int A[MAX], int n)
{
     int i;
     printf("Inserisci gli elementi dell'array: ");
     for(i=0; i<n; i++)
     scanf("%d", &A[i]);
     return;
}

void stamparray (int A[MAX], int n)
{
     int i;
     for(i=0; i<n; i++)
     printf("%d", A[i]);
     printf("\n\n");
     return;
}

void sequenzamassima(int A[MAX], int n)
{
     int i, j, k, somma, sommamax;
     printf("Per quanti numeri vuoi effettuare le somme?");
     scanf("%d", &k);
     if(k>n){
             printf("Inserisci un valore minore del numero degli elementi dell'array: ");
             scanf("%d", &n);
             }
     else{
          sommamax = 0;
          for(i=0; i<n-k+1; i++){
          somma = 0;
            for(j=0; j<k; j++){
                     somma = somma + A[i+j];
                     }
            if(somma > sommamax){
              somma = sommamax;
              }
            }
          }
     return;
}
Sono sicuro di aver sbagliato la funzione per individuare la sequenza massima, soprattutto nell'ultima parte.
Non riesco ad individuare la sequenza di numeri che hanno la massima somma nell'array.
Aiutatemi vi prego.
Grazie in anticipo

3 Risposte

  • Re: [Linguaggio C]Individuare sequenza massima in un array

    Controlla questo
    
    if(somma > sommamax)
    {
         somma = sommamax;
    }
    
    Credo che tu debba scambiare l'ordine di assegnazione. Poi una volta fatto questo in una variabile devi salvare l'indice di partenza per cui è stato possibile avere la sommamax e cioè i.
    Alla fine saprai che la sommamax è datta dagli indici che partono dalla posizione salvata fino a posizionesalvata + k - 1 ovvero nell'insieme [posizoneSalvata, posizioneSalvata + k), primo indice incluso, l'ultimo no.
  • Re: [Linguaggio C]Individuare sequenza massima in un array

    Non penso di aver capito.
    Potresti farmi vedere in codice come verrebbe?
  • Re: [Linguaggio C]Individuare sequenza massima in un array

    Ecco cosa intendevo. Praticamente la modifica è minima
    
    #include<stdio.h>
    #include<stdlib.h>
    #define MAX 100
    void crearray(int A[MAX], int n);
    void stamparray(int A[MAX], int n);
    void sequenzamassima(int A[MAX], int n);
    
    int main()
    {
    	int i, n, A[MAX];
    	printf("Quanti elementi vuoi inserire nell' array?");
    	scanf("%d", &n);
    	crearray(A, n);
    	stamparray(A, n);
    	sequenzamassima(A, n);
    	system("PAUSE");
    	return 0;
    }
    
    void crearray(int A[MAX], int n)
    {
    	int i;
    	printf("Inserisci gli elementi dell'array: ");
    	for(i=0; i<n; i++)
    		scanf("%d", &A[i]);
    	return;
    }
    
    void stamparray (int A[MAX], int n)
    {
    	int i;
    	for(i=0; i<n; i++)
    		printf("%d", A[i]);
    	printf("\n\n");
    	return;
    }
    
    void sequenzamassima(int A[MAX], int n)
    {
    	int i, j, k, somma, sommamax, indicePartenza;
    	printf("Per quanti numeri vuoi effettuare le somme?");
    	scanf("%d", &k);
    	if(k>n){
    		printf("Inserisci un valore minore del numero degli elementi dell'array: ");
    		scanf("%d", &n);
    	}
    	else{
    		sommamax = 0;
    		indicePartenza = 0;
    		for(i=0; i<n-k+1; i++){
    			somma = 0;
    			for(j=0; j<k; j++){
    				somma = somma + A[i+j];
    			}
    			if(somma > sommamax){
    				sommamax = somma;
    				indicePartenza = i;
    			}
    		}
    	}
    	printf("\nLa sequenza massima parte dall\' elemento %d per una soma di %d",indicePartenza,sommamax);
    	printf("\nElementi coinvolti:(");
    	for(i = indicePartenza; i < indicePartenza + k; i++)
    	{
    		if(i < indicePartenza + k -1)
    			printf("%d,",A[i]);
    		else
    			printf("%d",A[i]);
    	}
    	printf(")\n");
    	return;
    }
    
Devi accedere o registrarti per scrivere nel forum
3 risposte