Langage C

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Oct 2013, 15:37

Hello; cette fois j'ai bien fais des recherches avant de venir poster ici; mais je me retrouve tout de même bloqué.



J'ai réalisé une fonction qui transforme une minuscule en majuscule et inversement.
Elle est testé et fonctionne comme il faut.

[CODE]char inverseChar(char N)
{
if (N>=65 && N=91 && N bONJOUR.

J'ai donc besoin de traiter chaque caractère individuellement.

Je crois que vous m'aviez déjà conseiller l'utilisation d'une autre fonction que scanf pour ce genre de chose; mais ça reste un peu flou vu que je ne les ai jamais rencontré ailleurs.

Cdlt; une nouvelle fois merci du temps que vous passez tous à m'aider.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 11 Oct 2013, 16:39

Salut, dans le deuxième code, la condition doit être
Code: Tout sélectionner
while (p[cpt-1] != '.')


Ou alors:
Code: Tout sélectionner
  char p[50];
  int cpt=0;
  printf("Entrez une phrase: ");
  do
    {
      scanf("%c",&p[cpt]);
    } while (p[cpt] != '.' && ++cpt);

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 11 Oct 2013, 16:59

Code: Tout sélectionner
while (p[cpt-1] != '.')


Suis je bête; je pensais que c'était une spécificité du code en c, mais effectivement ça venait bien du compteur que j'incrémente une fois de plus même en ayant tapé le point.


Mon programme fonctionne donc bien correctement.


Enfin; avec un petit détail prêt sur lequel j'aimerais avoir votre avis.


Je tape Bonjour

ET il me renvoit: >bONJOUR

EN réalité; lorsque j'appuie sur ma touche pour faire la majuscule; il prend cela comme une caractère à part entière; y a t'il un moyen d'éviter cela ?


Egalement, ta seconde structure m'intrigue; pourquoi ++cpt et non cpt++ ? Peut on fait l'incrémentation du compteur de cette façon comme on le ferait dans un for ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 11 Oct 2013, 17:46

Bonjour,
Il y a plusieurs choses à dire.
1- le terme "structure a un sens très précis en C, il faudrait dire à la place, par exemple : "le second bout de code".
2- si écrit cpt++, le compteur est incrémenté APRèS, si on écrit ++cpt le compteur est incrémenté AVANT. Dans le cas présent, ça ne change rien, par contre Tab[++cpt] ne donnera pas la même chose que Tab[cpt++].
3- le scanf est à mon avis à éviter dans tous les cas. la bonne écriture serait
Code: Tout sélectionner
char Ligne[80]={0};
if (fgets(Ligne,79,stdin) != NULL)
{
  // le chaine Ligne, c'est un tableau avec 0 terminal, contient ce qui a été tapé avant le frappe de ENTER
unsigned char c=Ligne[4];  // c est égal au 5ème caractère de Ligne;
}

Le scanf sert à décoder une chaine. A mon avis, il faut se limiter à l'utilisation de la forme sscanf(...).
Par exemple si la vigne tapée contient un mot (ie une chaine), un entier et 2 flottants, le code pourrait être ceci
Code: Tout sélectionner
char Ligne[80];
char Mot[8];
int code;
float V1, V2;
if (fgets(ligne, stdin) != NULL)
{
  sscanf(Ligne,"%s %d %f %f",Mot, &code, &V1, &V2);
}

Ceci est ma méthode, chacun a ses petites habitudes.
A suivre éventuellement.

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 11 Oct 2013, 18:10

Rockleader a écrit:EN réalité; lorsque j'appuie sur ma touche pour faire la majuscule; il prend cela comme une caractère à part entière; y a t'il un moyen d'éviter cela ?
Je n'ai pas ce problème, tu pourrais mettre le code que tu utilises si ça ne te dérange pas ?

Egalement, ta seconde structure m'intrigue; pourquoi ++cpt et non cpt++ ? Peut on fait l'incrémentation du compteur de cette façon comme on le ferait dans un for ?


Code: Tout sélectionner
int i = 3;
int j = i++; // j vaut 3, i vaut 4

Code: Tout sélectionner
int i = 3;
int j = ++i; // j vaut 4; i vaut 4


Dans l'instruction suivante:
Code: Tout sélectionner
while(p[cpt] != '.' && ++cpt)
on test si p[cpt]!='.', si c'est le cas, alors on incrémente cpt, et on continue si la (nouvelle) valeur de cpt est différente de 0.
Si on met cpt++, il y aura un problème lors de la première itération où cpt=0

;);););););););););););););););););)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 11 Oct 2013, 18:29

Bonjour Iroh,
while(p[cpt] != '.' && ++cpt)

Oui, effectivement, j'avais pas vu la finesse pour cpt=0.
Mais je ne comprends pas l'intérêt de ce test, s'il n'y a pas de '.', faute de l'utilisateur, cpt va s'incrémenter indéfiniment, à mon avis.
C'est l'une des raisons pour lesquelles je préfère lire une chaine et travailler avec.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 11 Oct 2013, 19:42

et accessoirement cpt<50 :D
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 11 Oct 2013, 21:49

fatal_error a écrit:et accessoirement cpt<50 :D

Bonsoir,
Si cpt = n'importe quoi supérieur à 50, que se passe-t-il ?
p[cpt] != '.' sauf coup de chance assez peu probable, mais de toute façon, ce sera faux.
cpt est vrai, puisqu'il n'est pas nul, alors la condition du while est toujours vraie.

Par contre, si au lieu de ? ++cpt != 0 il avait ? p[++cpt] != '\0' ou ? p[++cpt] != 0 ou ? p[++cpt] != NULL , là je comprend.

cpt n'est qu'un compteur, cette variable n'a aucun rapport avec le dimension maximale du tableau p[]. Une des caractéristique fondamentale du C est qu'il n'y a jamais de contrôle de dépassement de limite d'un tableau.
Un tableau est seulement une description de son point de départ et de son type. En d'autres termes, si on déclare un tableau Tab[10] et qu'on 'écris val=Tab[100], on aura naturellement n'importe quoi dans val mais probablement pas d'erreur, ni à la compilation ni à l'exécution si pas malchance la valeur pointée par Tab[100] est en accord avec ce qui est attendu.

Ceci est tout de même fondamental en C.

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 15:31

par joel76 » 11 Oct 2013, 22:16

Dlzlogic a écrit:Par exemple si la vigne tapée contient un mot (ie une chaine), un entier et 2 flottants, le code pourrait être ceci
Code: Tout sélectionner
char Ligne[80];
char Mot[8];
int code;
float V1, V2;
if (fgets(ligne, stdin) != NULL)
{
  sscanf(Ligne,"%s %d %f %f",Mot, &code, &V1, &V2);
}

Ceci est ma méthode, chacun a ses petites habitudes.
A suivre éventuellement.

Encore plus sûr, tester le retour de sscanf qui compte le nombre de conversions réussies, on l'oublie souvent.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 11 Oct 2013, 22:28

Un tableau est seulement une description de son point de départ et de son type. En d'autres termes, si on déclare un tableau Tab[10] et qu'on 'écris val=Tab[100], on aura naturellement n'importe quoi dans val mais probablement pas d'erreur, ni à la compilation ni à l'exécution si pas malchance la valeur pointée par Tab[100] est en accord avec ce qui est attendu.


Ceci est tout de même fondamental en C.


Si fondamental que tu préconises les undefined behaviour. Excellent!
la vie est une fête :)

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 15:31

par joel76 » 11 Oct 2013, 22:42

fatal_error a écrit:Si fondamental que tu préconises les undefined behaviour. Excellent!
C'est le classique "Je ne comprends pas, ça marche chez moi".

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 12 Oct 2013, 12:55

Le soucis venant du > qui s'était glissé à mon exécution était du à une coquille de ma part; désolé d'en avoir affolé certain !

Merci pour ces différents points de vue que je ne manquerais pas de prendre en compte afin de forger le mien :)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 16:05

Salut; je n'ai pas trouvé de syntaxe pour initialiser un tableau à deux dimensions.

Au final; j'ai un tableau T[100][2]

Chaque T[k] va pointer vers les valeurs 0 et 1 de la dimension 2.

Mais lorsque j'initialise T[100][2]={0} comme je le ferais sur un tableau à une dimension ça bloque; enfin j'ai seulement des warnings qui me disent qu'il manque des accolades; hors j'ai beau essayé plusieurs truc soit je prend une erreur soit le même warning.


D'où ma question; comment initialiser un tableau à double entrée :)

EDIT

Second soucis; je n'arrive pas à récupérer les valeurs du dit tableau pour pouvoir ensuite faire des affichages hors d'une fonction.


Admettons que j'ai une fonction

int f (int x)
{
int T[100][2] = /*initialisation ???? */

traitement

} return /*que dois je mettre exactement pour que f renvoie mon tableau ?*/


Et une fois dans le main comment utiliser exactement ?

On crée un tableau du même type avec un appel de ce style ?

Tprime[100][2] = f(x);
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 31 Oct 2013, 16:24

Bonjour,
En C, un tableau à 2 dimensions est un tableau de tableau.
En fait en C, la notion de tableau à plusieurs dimensions n'existe pas.
Ce tableau est un tableau de 100 lignes avec 2 colonnes, comme on traite habituellement une tableau de 100 points défini par X et Y.
C'est à dire si j'écris X = T[25][0]. j'aurais bien l'X du 25è point.
Pour initialiser un tel tableau, je fais comme ça;
for (i=0; i<100; i++)
{
T[i][0]=0;
T[i][1]=0;
}
Quand tu aura appris à utiliser les alloc, tu comprendras que même si on trouve de raccourcis, ça revient à ça.

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 31 Oct 2013, 16:26

Bonjour,

Tu peux également l'initialiser comme ceci :

Code: Tout sélectionner
int tab[100][2] = {{0}};


Ensuite il faut savoir que lorsque tu déclares une variable dans une fonction, celle-ci est "détruite" à la fin de cette fonction.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 16:27

Dlzlogic a écrit:Bonjour,
En C, un tableau à 2 dimensions est un tableau de tableau.
En fait en C, la notion de tableau à plusieurs dimensions n'existe pas.
Ce tableau est un tableau de 100 lignes avec 2 colonnes, comme on traite habituellement une tableau de 100 points défini par X et Y.
C'est à dire si j'écris X = T[25][0]. j'aurais bien l'X du 25è point.
Pour initialiser un tel tableau, je fais comme ça;
for (i=0; i<100; i++)
{
T[i][0]=0;
T[i][1]=0;
}
Quand tu aura appris à utiliser les alloc, tu comprendras que même si on trouve de raccourcis, ça revient à ça.


Ok pour cette partie là; il n'y a donc pas d'autre solution.

Mon problème principal reste quand même de retourner et d'utiliser un tel tableau (déjà un tableau simple qui ne pointe pas je n'arrive pas à le retourner comme il faut^^)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 31 Oct 2013, 16:30

Tu dois utiliser les pointeurs pour ce genre de genre.

Tu as plusieurs solutions :

- Construire ton tableau dans le main et passer &tab dans tes fonctions

- Créer ton tableau dynamiquement avec l'initialisation (calloc ou malloc et memset) sans oublié la libération de mémoire après (free)

- ...

Pour l'initialisation je t'ai mis une autre solution un peu plus haut.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 16:46

ampholyte a écrit:Bonjour,

Tu peux également l'initialiser comme ceci :

Code: Tout sélectionner
int tab[100][2] = {{0}};


Ensuite il faut savoir que lorsque tu déclares une variable dans une fonction, celle-ci est "détruite" à la fin de cette fonction.



Super merci ça fonctionne; c'est toujours plus rapide que d'écrire la boucle; en revanche je suppose qu'en terme d'exécution; le compilateur fait tout de même le même travail derrière.

Pour la destruction de la variable après une fonction; oui j'avais compris; ça reste encore assez logique pour moi^^




Pour préciser l'utilisation de mon tableau je vais mettre un bout de code

Code: Tout sélectionner

int parfIntervalle(int n1, int n2); /*retourne dans un tableau les parfait de l'intervalle n1 n2*/
int main()
{
 int Parfait[100]={0};
...
...
Parfait[100]=parfIntervalle(a,b);

return 0;
}

int parfIntervalle(int n1, int n2)
{
 int Parfait[100]={0}; /*je donne le même nom que le tableau du main mais je suis bien conscient que ce n'est pas le même et qu'il est détruit en sorti de fonction*/

/*traitement je stocke à partir de 0 les parfait...les valeurs restantes restent à 0*/

return Parfait[100];
}


Je suis conscient que cette syntaxe n'est pas correcte; mais je n'arrive pas à comprendre pourquoi et comment faire pour retourner le dit tableau.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 31 Oct 2013, 16:48

As-tu vu les pointeurs car sans eux tu ne pourras pas t'en sortir ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 31 Oct 2013, 16:52

ampholyte a écrit:As-tu vu les pointeurs car sans eux tu ne pourras pas t'en sortir ?


Oui; le principe seulement...mis à part ça on n'a pas vu de syntaxe en cours à part les simple printf et scanf...donc au final on est en autodidacte ...


Je pense pouvoir être capable de comprendre comment ça fonctionne; mais je dois voir la syntaxe au moins une fois avant; c'est pas suffisamment intuitif pour le coup pour que je la trouve par moi même...


Cela dit; on n'a pas réellement fait un cours à part entière sur les pointeurs...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite