Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct DATA
{
int num_columns;
int num_rows;
int *temp_airPtr;
int *speed_windPtr;
float **mat_tempspeedPtr;
};
int fill_struct_integers(struct DATA *);
int fill_struct_arrays(struct DATA *);
int input_data(struct DATA *);
float validate_input_temp(int, struct DATA *);
float validate_input_speed(int, struct DATA *);
void calc_Reolien(struct DATA *);
int main()
{
int x, compteur;
struct DATA REFROID;
x = fill_struct_integers(&REFROID);
if(x == 0)
{
system("PAUSE");
return 0;
}
x = fill_struct_arrays(&REFROID);
if(x == 0)
{
system("PAUSE");
return 0;
}
compteur = input_data(&REFROID);
if(compteur == 0)
{
system("PAUSE");
return 0;
}
calc_Reolien(&REFROID);
system("PAUSE");
return 0;
}
int fill_struct_integers(struct DATA *refroidPtr)
{
int i, x, y, numchar = 0, row = 3;
float w;
char c;
FILE *filePtr;
filePtr = fopen("refroid.txt","r");
if(filePtr == NULL)
{
printf("Erreur en ouvrant le fichier. Referer vous au guide d'utilisation pour plus d'information.\n");
system("PAUSE");
return 0;
}
do
{
x = fscanf(filePtr,"%d", &y);
if(x == 0)
{
numchar += 1;
if(numchar == 1)
{
printf("La %dere donnee de la premiere ligne dans le fichier refroid.txt est corompu.\n", numchar);
}
else
{
printf("La %de donnee de la premiere ligne dans le fichier refroid.txt est corompu.\n", numchar);
}
return 0;
}
if(x == -1 && numchar == 0)
{
printf("Le fichier refroid.txt est vide.\n");
return 0;
}
fscanf(filePtr,"%c", &c);
numchar += 1;
}
while(c != '\n' && x != -1);
refroidPtr->num_columns = numchar;
numchar = 0;
do
{
x = fscanf(filePtr,"%d", &y);
if(x == 0)
{
numchar += 1;
if(numchar == 1)
{
printf("La %dere donnee de la deuxieme ligne dans le fichier refroid.txt est corompu.\n", numchar);
}
else
{
printf("La %de donnee de la deuxieme ligne dans le fichier refroid.txt est corompu.\n", numchar);
}
return 0;
}
if(x == -1 && numchar == 0)
{
printf("Le fichier refroid.txt ne contient qu'une ligne.\n");
return 0;
}
fscanf(filePtr,"%c", &c);
numchar += 1;
}
while(c != '\n' && x != -1);
refroidPtr->num_rows = numchar;
if(x == -1)
{
printf("Le fichier refroid.txt ne contient pas de %de ligne.\n", row);
return 0;
}
row = 2;
for(i = 0; i < refroidPtr->num_rows; i++)
{
row += 1;
numchar = 0;
do
{
x = fscanf(filePtr,"%f", &w);
if(x == 0)
{
numchar += 1;
if(numchar == 1)
{
printf("La %dere donnee de la %de ligne dans le fichier refroid.txt est corompu.\n", numchar, row);
}
else
{
printf("La %de donnee de la %de ligne dans le fichier refroid.txt est corompu.\n", numchar, row);
}
return 0;
}
fscanf(filePtr,"%c", &c);
numchar += 1;
y = feof(filePtr);
}
while( c != '\n' && y <= 0);
if(numchar == 1 && x == -1)
{
if(0 != refroidPtr->num_rows - (row - 2))
{
y = refroidPtr->num_rows - (row - 2);
printf("Le fichier refroid.txt ne contient pas de %de ligne, ou bien il y a %d element de trop dans la 2e ligne.\n", row, y);
return 0;
}
}
if(numchar < refroidPtr->num_columns && x != -1)
{
y = refroidPtr->num_columns - numchar;
printf("Soit que la %de ligne du fichier refroid.txt est %d elements de courts, ou bien que la premiere ligne en a %d de trop.\n", row, y, y);
return 0;
}
if(numchar > refroidPtr->num_columns)
{
y = numchar - refroidPtr->num_columns;
printf("Soit que la %de ligne du fichier refroid.txt est %d elements de trop, ou bien que la premiere ligne en manque %d.\n", row, y, y);
return 0;
}
}
fclose(filePtr);
return 1;
}
int fill_struct_arrays(struct DATA *refroidPtr)
{
int i, j, y, numchar = 0;
char c;
float z;
FILE *filePtr;
filePtr = fopen("refroid.txt","r");
if(filePtr == NULL)
{
printf("Erreur en ouvrant le fichier. Referer vous au guide d'utilisation pour plus d'information.\n");
system("PAUSE");
return 0;
}
refroidPtr->temp_airPtr = (int *) calloc(refroidPtr->num_columns, sizeof (int));
i = 0;
do
{
fscanf(filePtr,"%d", &refroidPtr->temp_airPtr[i]);
fscanf(filePtr,"%c", &c);
i += 1;
}
while(c != '\n');
refroidPtr->speed_windPtr = (int *) calloc(refroidPtr->num_rows, sizeof (int));
i = 0;
do
{
fscanf(filePtr,"%d", &refroidPtr->speed_windPtr[i]);
fscanf(filePtr,"%c", &c);
i += 1;
}
while(c != '\n');
refroidPtr->mat_tempspeedPtr = (float **) calloc(refroidPtr->num_rows, sizeof (float *));
for(i = 0; i < refroidPtr->num_rows; i++)
{
refroidPtr->mat_tempspeedPtr[i] = (float *) calloc(refroidPtr->num_columns, sizeof (float));
}
for(i = 0; i < refroidPtr->num_rows; i++)
{
j = 0;
do
{
fscanf(filePtr, "%f", &refroidPtr->mat_tempspeedPtr[i][j]);
fscanf(filePtr,"%c", &c);
j += 1;
y = feof(filePtr);
}
while( c != '\n' && y <= 0);
}
return 1;
}
int input_data(struct DATA *refroidPtr)
{
int compteur = 0;
double x;
FILE *filePtr1;
filePtr1 = fopen("inputData_temp&speed.txt", "w");
printf("Entrez la temperature de l'air ainsi que la vitesse du vent.\nPour indiquer la fin d'entrée, entrez le -1.\n");
do
{
x = 0;
printf("\n(Temperature)=> ");
x = validate_input_temp(0, refroidPtr);
if(x != 999)
{
fprintf(filePtr1, "%f\n", x);
}
if(x != 999)
{
printf("(vitesse)=> ");
x = validate_input_speed(0, refroidPtr);
if(x != 999)
{
fprintf(filePtr1, "%f\n", x);
compteur += 1;
}
}
}while(x != 999);
fclose(filePtr1);
return compteur;
}
float validate_input_temp(int disperror, struct DATA *refroidPtr)
{
//Déclarations de variables.
float choice;
int numchar = 0;
char c;
//Si disperror est égale à 1, un message d'erreur est imprimé.
if(disperror == 1)
{
printf("\nErreur, valeur endehors des bornes permises. Entrez une nouvelle valeur.\n=>");
}
//La valeur entrée par l'utilisateur est affecté à la variable choice.
scanf("%f", &choice);
if(choice == 999)
{
return 999.0;
}
//Tant et aussi longtemps que c n'est pas ègale à une nouvelle ligne, numchar est incrémenter de 1.
do
{
scanf("%c", &c);
numchar += 1 ;
} while(c != '\n');
//Si numchar n'égale pas 1, la fonction est appelée avec un paramètre de disperror égale à 1.
if(numchar != 1)
{
choice = validate_input_temp(1, refroidPtr);
}
//Si choice es plus petit ou égale à 0, la fonction est appelée avec un paramètre de disperror égale à 1.
if(choice > refroidPtr->temp_airPtr[0] || choice < refroidPtr->temp_airPtr[(refroidPtr->num_columns)-1])
{
choice = validate_input_temp(1, refroidPtr);
}
return choice;
}
float validate_input_speed(int disperror, struct DATA *refroidPtr)
{
//Déclarations de variables.
float choice;
int numchar = 0;
char c;
//Si disperror est égale à 1, un message d'erreur est imprimé.
if(disperror == 1)
{
printf("\nErreur, valeur endehors des bornes permises. Entrez une nouvelle valeur.\n=>");
}
//La valeur entrée par l'utilisateur est affecté à la variable choice.
scanf("%f", &choice);
if(choice == 999)
{
return 999.0;
}
//Tant et aussi longtemps que c n'est pas ègale à une nouvelle ligne, numchar est incrémenter de 1.
do
{
scanf("%c", &c);
numchar += 1 ;
} while(c != '\n');
printf("%c", c);
//Si numchar n'égale pas 1, la fonction est appelée avec un paramètre de disperror égale à 1.
if(numchar != 1)
{
choice = validate_input_speed(1, refroidPtr);
}
//Si choice es plus petit ou égale à 0, la fonction est appelée avec un paramètre de disperror égale à 1.
if(choice < refroidPtr->speed_windPtr[0] || choice > refroidPtr->speed_windPtr[(refroidPtr->num_rows)-1])
{
choice = validate_input_speed(1, refroidPtr);
}
return choice;
}
void calc_Reolien(struct DATA *refroidPtr)
{
int i = 0, a = 0, w, k = 0, temp2, speed2;
float Reolien, temp, speed, j;
printf("\nVoici les ou la temperature(s) de refroidissement eolien:\n");
FILE *filePtr1;
filePtr1 = fopen("inputData_temp&speed.txt", "r");
do
{
fscanf(filePtr1,"%f", &temp);
do
{
if(temp < refroidPtr->temp_airPtr[i])
{
i += 1;
}
else
{
j = ((float)refroidPtr->temp_airPtr[i] + ((float)refroidPtr->temp_airPtr[i-1])) / 2;
if(temp > j)
{
i = i -1;
k += 1;
}
else
{
k += 1;
}
}
}
while(k != 1);
temp2 = i;
i = 0;
k = 0;
fscanf(filePtr1, "%f", &speed);
do
{
if(speed > refroidPtr->speed_windPtr[i])
{
i += 1;
}
else
{
j = (refroidPtr->speed_windPtr[i + 1] + (refroidPtr->speed_windPtr[i])) / 2;
if(j <= temp)
{
i += 1;
k += 1;
}
else
{
k += 1;
}
}
}
while(k != 1);
speed2 = i;
i = 0;
k = 0;
printf("%d %d", temp2 ,speed2);
system("PAUSE");
Reolien = refroidPtr->temp_airPtr[temp2] - refroidPtr->mat_tempspeedPtr[speed2][temp2];
printf("\n%f",Reolien);
w = feof(filePtr1);
printf("%d", w);
}
while(w != 0);
fclose(filePtr1);
free(refroidPtr->temp_airPtr);
free(refroidPtr->speed_windPtr);
free(refroidPtr->mat_tempspeedPtr);
}