Partage
  • Partager sur Facebook
  • Partager sur Twitter

inverser mon code en language C

8 août 2020 à 18:10:34

Bonjour tout le monde,

Je suis super contente je viens de prendre des cours de code et le monde de la programmation est encore tout nouveau j'ai encore l'euphorie des débuts mais je vous avoue que le language C me donne du fil à retorde 😅.

Alors voilà j'ai créer un code le voilà: 

int main(void)
{
    int n;
    do
    {
        n = get_int("Height: ");

    }

    while (n < 1 || n > 8 );
do{
   for (int i = 0; i < 8 - n; i++)
          {
              printf(" ");

          }

    for (int i = 0; i < n; i++)
        {
            printf("#");

        }

            printf("  ");

    for (int i = 0; i < n; i++)
        {
            printf("#");

        }

        printf("\n");
} while ( n-- ); }

Seulement le résultat que je veux avoir c'est plutôt ça (pour n'importe quel n entre 1 et 8 mais ça normalement j'ai réussie à régler le paramètre) :

$ ./execute
Height: 8
       #  #
      ##  ##
     ###  ###
    ####  ####
   #####  #####
  ######  ######
 #######  #######
########  ########

Et ce j'ai c'est ça (haha je sens que je tiens un truc mais vu que ça fait seulement 3 mois que j'ai commencé je vois pas comment inverser le truc en ma faveur 😂) :

Height: 8
########  ########
 #######  #######
  ######  ######
   #####  #####
    ####  ####
     ###  ###
      ##  ##
       #  #

Je vous remercie en tout cas d'avoir lu mon message jusque là 😅 et hésitez pas à dire ce que vous pensez de mon programme ou de la programmation en générale et si vous avez des petites astuces ou infos qui me serrait utile pour la suite de mon aventure dans la programmation. Toute info est bonne à prendre 😇

🦋

-
Edité par tinapow3 16 août 2020 à 15:04:55

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2020 à 18:13:53

Hello,

Evite les printscreens: 


Et je te conseille de commencer tout de suite à indenter ton code, pour toi comme pour les autres lecteurs

-
Edité par edgarjacobs 8 août 2020 à 18:18:02

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

8 août 2020 à 18:31:55

Merci "edgarjacobs" pour l'astuce c'est vrai que c'est plus clair mnt 😊


edgarjacobs a écrit:

Hello,

Evite les printscreens: 


Et je te conseille de commencer tout de suite à indenter ton code, pour toi comme pour les autres lecteurs

-
Edité par edgarjacobs il y a 12 minutes



  • Partager sur Facebook
  • Partager sur Twitter
8 août 2020 à 19:22:54

Tu arrive a obtenir quelque chose ? Car chez moi ton code ne compile pas ! Notamment la ligne 33. Le while n'aime pas le point virgule dans sa condition ! 

EDIT : J'édite, car mon message n'a plus de sens vu que tinapow3 à modifié son code sans en faire mention !

-
Edité par rouloude 16 août 2020 à 18:27:29

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2020 à 20:00:43

Merci rouloude pour ta réponse !

Oui de mon coté le programme s'exécute bien sans problème... c'est possible qu'un programme fonctionne bien dans une sandbox mais pas dans une autre ? 


rouloude a écrit:

Tu arrive a obtenir quelque chose ? Car chez moi ton code ne compile pas ! Notamment la ligne 33. Le while n'aime pas le point virgule dans sa condition ! 



  • Partager sur Facebook
  • Partager sur Twitter
8 août 2020 à 21:42:41

tinapow3 a écrit:

c'est possible qu'un programme fonctionne bien dans une sandbox mais pas dans une autre ? 

Change de SandBox !

  • Partager sur Facebook
  • Partager sur Twitter
9 août 2020 à 12:57:00

Pourquoi changer de SandBox si dans la mienne ça fonctionne bien ? Et pour être honnête ça m'avance pas beaucoup dans mon problème 😂


rouloude a écrit:

tinapow3 a écrit:

c'est possible qu'un programme fonctionne bien dans une sandbox mais pas dans une autre ? 

Change de SandBox !



  • Partager sur Facebook
  • Partager sur Twitter
9 août 2020 à 13:59:26

Si ton code compile, on ne peut pas t'aider, car nous on fait du C avec des compilateurs qui suivent la norme du langage C.

Et sur ces compilateurs ton code ne compile pas ! Alors si tu veux que l'on aide change moi cette ligne 33 avec un code correcte !

EDIT : J'édite, car mon message n'a plus de sens, vu que tinapow3 à modifié son code sans en faire mention !

-
Edité par rouloude 16 août 2020 à 18:26:51

  • Partager sur Facebook
  • Partager sur Twitter
9 août 2020 à 18:29:51

tinapow3 a écrit:

Pourquoi changer de SandBox si dans la mienne ça fonctionne bien ? Et pour être honnête ça m'avance pas beaucoup dans mon problème 😂

Je pense que tu aurais intérêt à utiliser une boucle 'for' plutôt que 'while'. En particulier ça permettrait d'éviter le point-virgule signalé par rouloude.

En fait, en regardant le programme, je trouve normal qu'il dessine la pyramide à l'envers. Je me suis dit : corriger ça va être simple, il suffit d'inverser l'ordre de parcours de la boucle. Sauf que c'est un 'while' et non un 'for', et surtout un 'while' bizarre...

Je pense que tu ne devrais pas utiliser comme indice de boucle, dans le 'while', la variable 'n'. Cette variable représente la taille de la pyramide, elle ne devrait pas varier. En tout cas, la voir comme variable de boucle m'a embrouillé : je ne sais pas comment inverser le sens de parcours avec ce 'while'. J'ai l'impression qu'on mélange plusieurs choses.

Si c'était moi, je définirais deux variables :

- 'nbdieses' : le nombre de dièses à afficher à gauche (ou à droite) ;

- 'nbblancs' : le nombre de blancs à afficher à gauche (ou à droite) (ah non, pas besoin à droite).

On bouclerait sur le nombre de dièses (de 1 à n), et à l'intérieur de la boucle, on calculerait 'nbblancs'.

-
Edité par robun 9 août 2020 à 19:01:03

  • Partager sur Facebook
  • Partager sur Twitter
9 août 2020 à 19:27:39

Hello,

Pour information: si on connait printf(), voici ce qu'on peut écrire (ici basé sur le fait qu'il n'y aura que 8 # au plus (ça fonctionne aussi si ligne 7 on met len à une valeur >0 et <=8))

#include <stdio.h>

#define NBRSPACE		2

int main(void) {
	char card[]="########";
	int len=sizeof(card)-1;				// attention à ça, mais pas besoin de strlen()
	
	for(int i=0;i<len;i++)
		printf("%*s%.*s%*s%.*s\n",len-i," ",i+1,card,NBRSPACE," ",i+1,card);
	
	return(0);
	
}	


Défaut de ce code: il affiche toujours un espace avant d'afficher les #. Mais c'est facilement évitable.

-
Edité par edgarjacobs 9 août 2020 à 20:09:42

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

16 août 2020 à 15:07:07

Merci beaucoup pour vos réponses edgarjacobs et robun !

Ce que j'aimerais c'est de respecter la structure de mon code et changer que le fond. Parce que au fond ce que je veux c'est garder mes variables et changer la disposition du programme.

-
Edité par tinapow3 16 août 2020 à 15:08:04

  • Partager sur Facebook
  • Partager sur Twitter
16 août 2020 à 16:41:39

tinapow3 a écrit:

Seulement le résultat que je veux avoir c'est plutôt ça (pour n'importe quel n entre 1 et 8 mais ça normalement j'ai réussie à régler le paramètre) :

$ ./execute
Height: 8
       #  #
      ##  ##
     ###  ###
    ####  ####
   #####  #####
  ######  ######
 #######  #######
########  ########

C'est pas compliqué, tu te prends par la main et tu comptes :

  • Ligne 1 : 7 espaces, 1 diese 2 espaces, 1 diese
  • Ligne 2 : 6 espaces, 2 dieses 2 espaces, 2 diese
  • Ligne 3 : 5 espaces, 3 dieses 2 espaces, 3 diese
  • ...
  • ligne 8 : 0 espaces, 8 dièses, 2 espaces, 8 dièses

A partir de là, tu vois que

  • le nombre de dièses va de 1 à 8
  • le nombre d'espaces + le nombre de dièses = 8
  • donc nombre d'espaces = 8 - nombres de dièses.

Donc le code

pour nombre de dièses allant de 1 à 8
   calculer nombre d'espaces = 8 - nombre de dièses
   afficher ....

> Parce que au fond ce que je veux c'est garder mes variables et changer la disposition du programme.

ça c'est le bagnard qui voudrait aller ailleurs, mais qui tient à garder son boulet.




  • Partager sur Facebook
  • Partager sur Twitter
16 août 2020 à 19:37:17

tinapow3 a écrit:

Ce que j'aimerais c'est de respecter la structure de mon code et changer que le fond. Parce que au fond ce que je veux c'est garder mes variables et changer la disposition du programme.

#include <stdio.h>

int main(void)
{
    int n;
    scanf("%d", &n);
    int ci = n;

    do
    {
        for (int i=0; i<ci; i++)
        {
            putchar(' ');
        }

        for (int i = 0; i<n-ci; i++)
        {
             putchar('#');
        }

        printf("  ");

        for (int i=0; i<n-ci; i++)
        {
            putchar('#');
        }

        puts("");
    }
    while(ci--);

    return 0;
}



  • Partager sur Facebook
  • Partager sur Twitter
16 août 2020 à 20:47:49

Faudrait penser à changer de ligne.
  • Partager sur Facebook
  • Partager sur Twitter
16 août 2020 à 21:04:10

michelbillaud a écrit:

Faudrait penser à changer de ligne.


C'est fait: puts("");
  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

16 août 2020 à 22:54:36

C'est curieux ce mélange de putchar,  puts et printf....

Ainsi que de boucles do et for.

Le mieux serait quand même d'écrire (et utiliser) une fonction qui affiche n fois un caractère. 

  • Partager sur Facebook
  • Partager sur Twitter
16 août 2020 à 23:55:15

michelbillaud a écrit:

C'est curieux ce mélange de putchar,  puts et printf....

C'est pour la déco !

michelbillaud a écrit:

Le mieux serait quand même d'écrire (et utiliser) une fonction qui affiche n fois un caractère. 

#include <stdio.h>

void putnchar(char c, int n)
{
    for (int i=0; i<n; i++) putchar(c);
}

int main(void)
{
    int n;
    scanf("%d", &n);

    for(int i=n-1; i>=0; i--)
    {
        putnchar(' ', i);
        putnchar('#', n-i);

        putchar(' ');
        putchar(' ');

        putnchar('#', n-i);

        putchar('\n');
    }
    return 0;





  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2020 à 23:40:16

Tu es un génie ! Je te remercie tellement 👍🏻🥳

Si tu pouvais m'expliquer la ligne 6&7 stp ça serait gentil 😇

rouloude a écrit:

tinapow3 a écrit:

Ce que j'aimerais c'est de respecter la structure de mon code et changer que le fond. Parce que au fond ce que je veux c'est garder mes variables et changer la disposition du programme.

#include <stdio.h>

int main(void)
{
    int n;
    scanf("%d", &n);
    int ci = n;

    do
    {
        for (int i=0; i<ci; i++)
        {
            putchar(' ');
        }

        for (int i = 0; i<n-ci; i++)
        {
             putchar('#');
        }

        printf("  ");

        for (int i=0; i<n-ci; i++)
        {
            putchar('#');
        }

        puts("");
    }
    while(ci--);

    return 0;
}






-
Edité par tinapow3 3 décembre 2020 à 0:10:54

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 3:36:21

On t'avais recommandé de remplacer le printf par soit le puts("") que tu donnes, soit un putchar('\n')
Est-ce que ton code fait ce que tu souhaites? Je ne crois pas.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

3 décembre 2020 à 8:46:33

michelbillaud a écrit:

Le mieux serait quand même d'écrire (et utiliser) une fonction qui affiche n fois un caractère. 

Pour moi ce serait de construire la chaîne dans une fonction puis de l'afficher, style

    do
    {
        puts(newString(ci, n))
    }
    while(ci--);



  • Partager sur Facebook
  • Partager sur Twitter

Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

3 décembre 2020 à 9:58:04

joel76 a écrit:

Pour moi ce serait de construire la chaîne dans une fonction puis de l'afficher

Bof ! je préfère celle de Michel ! Ta fonction n'a que peu d’intérêt et son nom n'est pas évocateur !

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 10:43:05

Désolé, il faut séparer la fabrication de la réponse de son affichage.

-
Edité par joel76 3 décembre 2020 à 10:43:32

  • Partager sur Facebook
  • Partager sur Twitter

Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

3 décembre 2020 à 10:51:49

Il est difficile de définir le moment qui fait que le «trop de fonctions» tue les fonctions 😇

C'est aussi pour cela que quelles que soient les conventions il y en aura toujours qui seront pour les uns des «absurdités» et pour les autres des «évidences».

Mais l'important dans tout ça c'est surtout tout ce qui se passe avant : comprendre le problème et avoir les outils  pour le résoudre pour pouvoir en implémenter une solution.

Mais c'est clair que la version joel avec des noms plus évocateurs est plus pédagogique.

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 11:27:40

rouloude a écrit:

michelbillaud a écrit:

C'est curieux ce mélange de putchar,  puts et printf....

C'est pour la déco !

michelbillaud a écrit:

Le mieux serait quand même d'écrire (et utiliser) une fonction qui affiche n fois un caractère. 

#include <stdio.h>

void putnchar(char c, int n)
{
    for (int i=0; i<n; i++) putchar(c);
}

int main(void)
{
    int n;
    scanf("%d", &n);

    for(int i=n-1; i>=0; i--)
    {
        putnchar(' ', i);
        putnchar('#', n-i);

        putnchar(' ',2);
        putnchar('#', n-i);

        putchar('\n');
    }
    return 0;







  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 11:39:57

La fonction, il faut qu'elle retourne la chaîne, il faut donc l'allouer dans la fonction, il ne faudra pas oublier de la libérer. Ça va faire un truc compliqué pour un simple exercice d'affichage. Après, c'est mon point de vue, je suis plutôt terre à terre, je fais au plus simple en fonction du but à obtenir et non pas en fonction de styles de codage.

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 11:58:36

Il n'y a aucune raison de construire un objet intermédiaire pour représenter une ligne (et pourquoi pas tout le sapin ???). Surtout que ça ne simplifie absolument pas les choses (*)

Ce qu'on demande, c'est d'écrire du code qui affiche un sapin. Si on veut découper, on peut faire

int main() 
{
   int hauteur = demander_entier("hauteur du sapin");
   afficher_sapin(hauteur);
   return 0;
}

Au moins, ce sont deux actions clairement identifiées, et le première sera réutilisable.

int demander_entier(char message[])
{
    printf("%s : ", message);
    int reponse;
    scanf("%d", &reponse);
    return reponse;
}

(*) et si on programme en C, c'est dans l'optique (espoir souvent futile) d'exploiter au mieux les ressources de la machine. Allouer et libérer des chaines de caractères quand ce n'est pas nécessaire, ça ne va pas dans ce sens.

-
Edité par michelbillaud 3 décembre 2020 à 12:04:48

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 11:59:16

Le problème du C, au début, est que pour les affichages, on n'envisage que la console, si on fait de l'interface graphique, ça change le concept.

On peut pour le problème actuel faire

char *maNouvelleLigne(char buf[], int curLine, int maxLine)
{
    ....
    return buf;
}

do
{
    char buf[256] = {0};
    puts(maNouvelleLigne(buf, ci, n))
}
while(ci--);



  • Partager sur Facebook
  • Partager sur Twitter

Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

3 décembre 2020 à 12:08:00

Montre ton code en entier qu'on voie en quoi c'est mieux que les autres solutions !

-
Edité par michelbillaud 3 décembre 2020 à 12:12:33

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 12:28:10

Sinon il y a la version libc classique

#include <stdio.h>

int main(void)
{
    int height=-1;
    do {
        printf("height = ");
        scanf("%i", &height);
    } while ( (height<1) || (20<height) );

    char line[]="#########################";
    for(int i=1; i<=height; i++) {
        printf("%*.*s  %-*.*s\n", height, i, line, height, i, line);
    }

    return 0;
}

quelques lignes typiques d'un bouquin avec des exemples ; évidemment la description suivrait cet encart de code.

-
Edité par White Crow 3 décembre 2020 à 12:29:35

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2020 à 12:36:48

Mais ça serait plus un exemple sur la manipulation des spécifications de format, qu'un exercice classique pour apprendre à faire des boucles sur un intervalle.

-
Edité par michelbillaud 3 décembre 2020 à 12:37:05

  • Partager sur Facebook
  • Partager sur Twitter