Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/10/2014, à 17:43

quentino18

Passage en variable locale

Pour les cours de programmation en C , mon prof m'a demandé de faire un programme qui prend un vecteur en entrée ,et sort le vecteur normalisé.
Pas de problème.  smile
( mis a part la taille non dynamique du vecteur ... mais c'est un détail )
Le problème , c'est que vu que j'avais fini , il m'a demandé de passer toutes mes variables globales toutes moches en haut de mon programme en variables locales ...
Sauf que dans celles-ci , j'ai notamment un vecteur ---> tableau , je vois pas comment passer par des variables locale sans le mettre dans toutes les fonctions ...
C'est ce qu'il faut faire ?
Et pour les autres petites variables ( genre calcul du nombre d'éléments dans un vecteur ) , je dois enlever la variable globale et recréer une autres petite fonction qui sort ce nombre d'éléments ?

Si vous avez d'autres suggestions au passage ( sur mon code ou autre ...  smile )

Merci d'avance ,  Pour les très motivés ... : voici mon code :

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

float vect[100] = {0};
float vectnorm[100] = {0};
int nbmots = 0;
float nbnorme = 0;

void affiche(float* vect);
float norme(float* vect);
float* calc();
float* normalize(float* vect, float norme);


float* calc()        /* calcul du vecteur */
{
	char nombrecarac[15];
	char carac = '0';
	int i=0 ,j=0, *nbm = &nbmots;
	printf("Donnez votre vecteur sous la forme : XXX XX XXXXX XX XX XXX ... \n");
	while ((carac = getchar()) != '\n')
		if (carac == ' ')                              /* si le caractère est un espace ( donc 
								entre 2 nombres) */ 
		{
			vect[*nbm] = (float) strtol( nombrecarac, NULL , 10 );        /*  transformation
			 						de la chaine de caractère en nombre dans "vect [ ènième nombre]" */
			(*nbm)++;     					 /* indentation du nombre de mot*/
			for (j=0 ; j<i+1 ; j++)     		/* tableau de caractère remis a 0*/
			{
				nombrecarac[j] ='\0';
			}
			i=0;
			
		}
		else 
		{
			nombrecarac[i] = carac;        /* stockage du chiffre dans le tableau de caractère : 
								nombrecarac [ ènième chiffre du nombre] */
			i++;
		}
	vect[*nbm] = (float) strtol( nombrecarac, NULL , 10 );
	(*nbm)++;
	return vect;
}

void affiche(float* vect)           /*affichage du vecteur*/
{		
	int i=0, *nbm = &nbmots;	
	printf("Vecteur normalisé = ");
	for (i = 0 ; i < *nbm ; i++)
        	printf("%.3f   ", vect[i]);
	printf("\n");
}

float norme(float* vect)           /*calcul de la norme du vecteur */
{
	int i=0, *nbm = &nbmots;
	for (i = 0 ; i < *nbm ; i++)
        	nbnorme += (vect[i])*(vect[i]);
        nbnorme = sqrt (nbnorme);
	return nbnorme;
}

float* normalize(float* vect, float norme)          /* normalisation du vecteur par la norme*/
{
	int i=0, *nbm = &nbmots;
	for (i = 0 ; i < *nbm ; i++)
        	vectnorm[i] = (vect[i] / norme);
	return vectnorm;
}

int main()
{
	calc(vect);
	affiche(normalize (vect, norme(vect)));
	return 0;
}
		

Hors ligne

#2 Le 14/10/2014, à 21:24

pingouinux

Re : Passage en variable locale

Bonsoir,

  • Pour les variables, tu peux les déclarer dans main, et les passer en arguments aux fonctions.

  • Remarque 1 : Si tu mets plusieurs espaces entres les coordonnées quand tu lis le vecteur, il rajoute des coordonnées nulles

  • Remarque 2 :
    Prototype de la fonction calc : float* calc();
    Appel de cette fonction : calc(vect);
    Il n'y pas d'erreur à la compilation, et j'en suis surpris.

Hors ligne

#3 Le 14/10/2014, à 22:26

quentino18

Re : Passage en variable locale

[*]d'accord , je vais essayer ça smile [/*]
[*]Ahh oui , effectivement , et j'ai remarqué que je traite pas le vecteur nul aussi mais bon ... [/*]
[*]ah oui  Oo   , bizarre qu'il n'y ai meme pas de Warning [/*]

Merci beaucoup pour cette analyse , je passe en résolu dès que j'ai réussi smile

Hors ligne