oregon ha scritto:
E' un bug del compilatore (potresti iniziare ad aggiornarlo alla 16.8.4)
Si ho la 16.8.4
oregon ha scritto:
Mostra tutto il codice effettivamente utilizzato.
Eccolo
/* LOGICA DELLA SEQUENZA DELLE OPERAZIONI DEL PROGRAMMA
Richiede nomefile input e di output
FUNCTION Aprifile input che restituisce il puntatore al file
FUNCTION letturaValori(puntatore al file)
legge e riempie i due vettori V1 e V2
FUNCTION CreaVettoreUnione()
Crea il vettore Unione(V3) e memorizza i doppioni
FUNCTION StampaFile()
Scive su file il vettore Unione(V3)
A video mostra numero di doppioni */
#pragma warning(disable : 4996)
#include <stdio.h>
#include <stdlib.h>
// VARIABILI GLOBALI
int V1[20], V2[20], V3[40];
// V1 e V2 sono i due vettori letti, V3 è il vettore unione risultante
int lun_vet1 = 0, lun_vet2 = 0, lun_vet3 = 0;
// lunghezza dei vettori V1, V2 e V3
char InpFile[20], OutFile[20]; // Nomi dei due file da leggere e da scrivere
int uguaglianze = 0; // memorizza quante ugualglainze ci sno tra i due vettori
//DICHIARAZIONI DELLE FUNZIONI
FILE *Aprifile(char InpFile[], const char* modal);
void LetturaValori(FILE* pf);
void CreaVettoreUnione();
void StampaFile(FILE *pf);
//==================================================================
int main()
{
// Richiede nomefile input e di output
printf("\nDigitare nome del file in input: ");
scanf("%s", InpFile);
printf("\nDigitare nome del file in output: ");
scanf("%s", OutFile);
FILE* pf = Aprifile(InpFile, "r"); //Apre file in lettura
LetturaValori(pf); // riempie V1 e V2
CreaVettoreUnione(); // Crea il vettore unione (V3)
pf = Aprifile(OutFile, "w"); // apre file in scrittura
StampaFile(pf); // Scrive il vetrore unine nel file di output
printf("\nSi sono verificate %d ripetizioni", uguaglianze);
printf("\nELABORAZIONE TERMINATA");
return 0;
}
//==============================================================================
//==============================================================================
FILE* Aprifile(char File[], const char* modal)
{
FILE* pf;
char mod[1];
pf = fopen(File, modal);
if (pf == NULL)
{
perror("SI è VERIFICATO UN ERRORE DURANTE L'APERTURA DEL FILE: ");
exit(1);
}
return pf; // restituisce il puntatore al file
}
//=======================================================
//=======================================================
void LetturaValori(FILE* pf)
/* riceve in input il puntatore al file
legge le due righe del file e provvede al
riempimento con valori dei due vettori V1 e V2*/
{
int i;
fscanf(pf, "%d", &lun_vet1);
for (i = 0; i < lun_vet1; i++)
fscanf(pf, "%d", &V1[i]);
fscanf(pf, "%d", &lun_vet2);
for (i = 0; i < lun_vet2; i++)
fscanf(pf, "%d", &V2[i]);
fclose(pf);
}
//==============================================================================
void CreaVettoreUnione()
// Crea il vettore unione ordinato e senza doppioni
// e rileva quante uguaglianze ci sono tra i due vettori
{
int i1 = 0, i2 = 0;
int Ult = 0, j = 0;
while (i1 < lun_vet1 && i2 < lun_vet2)
{
if (V1[i1] <= V2[i2])
{
if (V1[i1] > Ult) // se non è un valore gia memorizzato
{
V3[j] = V1[i1]; // scrive valore nel vettore Unione
Ult = V1[i1]; // memorizza l'ultimo valore immesso
j++;
}
else
uguaglianze++; // aggiunge un doppione
i1++;
}
else
{
if (V2[i2] > Ult)
{
V3[j] = V2[i2]; //scrive valore nel vettore Unione
Ult = V2[i2];
j++;
}
else
uguaglianze++; //aggiunge un doppione
i2++;
}
}
//scrive i restanti numeri. Solo una di queste coindizioni risulterà vera
// perchè una di esse è sicuro falsa essendo usciti dal while
while (i1 < lun_vet1)
{
V3[j] = V1[i1];
i1++;
j++;
}
while (i2 < lun_vet2)
{
V3[j] = V2[i2];
i2++;
j++;
}
lun_vet3 = j; // Quantità elementi contenuti nel vettore unione
}
//==============================================================================
void CreaVettoreUnione1()
// prove di modifica per otimizzarlo ma non controlla doppioni immessi
// Crea il vettore unione ordinato e senza doppioni
// e rileva quante uguaglianze ci sono tra i due vettori
{
int i1 = 0, i2 = 0;
int Ult = 0, j = 0;
while (i1 < lun_vet1 && i2 < lun_vet2)
{
if (V1[i1] == V2[i2])
{
uguaglianze++; // aggiunge un doppione
V3[j] = V1[i1]; // scrive valore nel vettore Unione
j++, i1++, i2++;
}
else if (V1[i1] < V2[i2])
{
V3[j] = V1[i1]; // scrive valore nel vettore Unione
j++, i1++;
}
else
{
V3[j] = V2[i2]; // scrive valore nel vettore Unione
j++, i2++;
}
}
//scrive i restanti numeri. Solo una di queste coindizioni risulterà vera
// perchè una di esse è sicuro falsa essendo usciti dal while
while (i1 < lun_vet1)
{
V3[j] = V1[i1];
i1++;
j++;
}
while (i2 < lun_vet2)
{
V3[j] = V2[i2];
i2++;
j++;
}
lun_vet3 = j; // Quantità elementi contenuti nel vettore unione
}
//==============================================================================
//==============================================================================
void StampaFile(FILE* pf)
{
int i;
fprintf(pf, "%d\t", lun_vet3);
for (i = 0; i < lun_vet3; i++)
fprintf(pf, "%d ", V3[i]);
fclose(pf);
}
//==============================================================================