IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Modification de echo


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Par défaut Modification de echo
    Bonjour,
    je suis étudiant en informatique et dans le contexte de mes cours on m'a demandé de tout d'abord créer une commande echo en C qui s'arrête lorsqu'elle lie le nombre 42 et j'ai fait cela (le code est passé donc pour ça c'est bon) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void) {
    	int v;
    	while (fscanf(stdin, "%d", &v) != EOF) {
    		if (v == 42) {
    			break;
    		}
     
    		fprintf(stdout, "%d\n", v);
    	}
    	return EXIT_SUCCESS;
    }
    Mais maintenant on me demande d'arrêterez le traitement quand la somme des trois prochains nombres est égale à 42, et j'ai beau réfléchir je ne vois pas comment faire... J'ai essayé de stocker en créant un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(void) {
    	int tab[3] = { 0 };
    	fscanf(stdin, "%d", &tab[0]);
    	fscanf(stdin, "%d", &tab[1]);
    	while (fscanf(stdin, "%d", &tab[2]) != EOF) {
    		if (tab[0]+tab[1]+tab[2] == 42) { break; }
    		fprintf(stdout, "%d\n", tab[0]); 
    		tab[0] = tab[1];
    		tab[1] = tab[2];
    	}
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    mais ce code arrête le traitement trop tôt si on ne rencontre pas le cas où la somme des trois prochains nombre est égale à 42, j'ai essayé avec des fseek, rewind, en faisant 3 fois fscanf sur 3 variables différente puis en faisant 2 fseek pour revenir au bon endroit, mais je n'ai pas très bien compris ce qu'il se passait et ça ne marchait pas, ça n'affichait que le premier nombre entrée...
    J'ai l'impression que la solution est simple car ce n'est pas censé être un exercice difficile, mais j'ai beau cherché je ne trouve rien après plusieurs heures à chercher... Est-ce que vous pourriez m'aider ? Merci d'avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Agigas Voir le message
    Mais maintenant on me demande d'arrêterez le traitement quand la somme des trois prochains nombres est égale à 42, et j'ai beau réfléchir je ne vois pas comment faire
    Pourtant tu avais presque trouvé !!!
    Enlève les deux premier fscanf() totalement inutiles, et affiche tab[2] au lieu de tab[0].

    Citation Envoyé par Agigas Voir le message
    j'ai essayé avec des fseek, rewind, en faisant 3 fois fscanf sur 3 variables différente puis en faisant 2 fseek pour revenir au bon endroit, mais je n'ai pas très bien compris ce qu'il se passait et ça ne marchait pas,
    Interdit de faire rewind() ou fseek() sur stdin/stdout/stderr. Ce ne sont pas des périphériques adressables. (de même interdit aussi sur les bandes et autres supports de ce type). Et franchement tu es parti dans des profondeurs abyssales de complexité inutile.

    Citation Envoyé par Agigas Voir le message
    je ne trouve rien après plusieurs heures à chercher...
    N'exagère quand-même pas !!! Personne ne croira que tu es resté plusieurs "heures" à chercher...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Par défaut
    Bonjour, merci pour ta réponse,
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Pourtant tu avais presque trouvé !!!
    Enlève les deux premier fscanf() totalement inutiles, et affiche tab[2] au lieu de tab[0].
    J'ai essayé mais ça ne marche pas, il faut que le programme s'arrête avant le nombre qui a pour somme avec ses 2 suivants 42, par exemple :
    Input:
    1 2 88 42 99 1 1 40
    Output:
    1 2 88 42 99
    Alors qu'en enlevant les 2 premiers scanf et en affichant tab[2] on a :
    Output :
    1 2 88 42 99 1 1
    Est-ce que tu saurais comme faire pour s'arrêter avant ?


    Citation Envoyé par Sve@r Voir le message
    Interdit de faire rewind() ou fseek() sur stdin/stdout/stderr. Ce ne sont pas des périphériques adressables. (de même interdit aussi sur les bandes et autres supports de ce type). Et franchement tu es parti dans des profondeurs abyssales de complexité inutile.
    C'est ce que je me disais concernant rewind et fseek, mais j'étais désespéré...


    Citation Envoyé par Sve@r Voir le message
    N'exagère quand-même pas !!! Personne ne croira que tu es resté plusieurs "heures" à chercher...
    Tant pis si on ne me croit pas, mais j'ai bien passé 2h Samedi à chercher et 2h cet après-midi, à chercher sur internet des solution, tester pleins de choses différentes dans l'espoir que quelque chose marche...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Et si tu entres 1 1 40 tu n'affiches rien ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Et si tu entres 1 1 40 tu n'affiches rien ?
    Je suppose que oui, je n'ai comme données que l'énoncé que j'ai mis dans mon premier message et l'input/output que j'ai mis dans mon deuxième message.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Agigas Voir le message
    Alors qu'en enlevant les 2 premiers scanf et en affichant tab[2] on a :
    Output :
    1 2 88 42 99 1 1
    Oui c'est ça. Quand on entre 1 1 40, on a la somme des 3 derniers qui fait 42 donc il s'arrête. Mais bien entendu il ne s'arrête que quand on a entré le nombre final qui totalise 42 avec les deux avant-derniers. C'est bien dans ce sens que j'ai vu l'exo.

    Citation Envoyé par Agigas Voir le message
    il faut que le programme s'arrête avant le nombre qui a pour somme avec ses 2 suivants 42
    Mais c'est complètement con comme exo !!! Comme dit Bousk, tu entres 1 1 40 ça ne sort rien ? Super la nouvelle commandeecho
    En tout cas, la solution reste à peu près la même: faut stocker un historique de 4 nombres et afficher le nb[0] tandis qu'on évalue la somme de nb[1], nb[2] et nb[3]...

    Citation Envoyé par Agigas Voir le message
    Tant pis si on ne me croit pas, mais j'ai bien passé 2h Samedi à chercher et 2h cet après-midi, à chercher sur internet des solution, tester pleins de choses différentes dans l'espoir que quelque chose marche...
    Des solutions sur le net ? Oui pourquoi pas. Si tu as la chance qu'un autre internaute a eu un truc aussi débile à coder et qu'il l'a posté...
    Sans déconner. Quand on a un truc aussi atypique, le net ne sert à rien. La seule solution est de réfléchir.

    Bon je te donne la solution parce que cet exo m'énerve tellement il sert à rien
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main(void) {
    	int tab[4] = { 0 };
    	size_t i;
    	while (fscanf(stdin, "%d", &tab[3]) != EOF) {
    		fprintf(stdout, "tab=%d\n", tab[0]); 
    		if (tab[1]+tab[2]+tab[3] == 42) break;
    		for (i=0; i < 3; i++) tab[i]=tab[i+1];
    	}
    	return 0;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 5
    Par défaut
    Des solutions sur le net ? Oui pourquoi pas. Si tu as la chance qu'un autre internaute a eu un truc aussi débile à coder et qu'il l'a posté...
    Sans déconner. Quand on a un truc aussi atypique, le net ne sert à rien. La seule solution est de réfléchir.
    Pas des solutions dans ce sens, des solution dans des cours de C, voir si il y avait une commande que je ne connaissais pas qui permettrais de faire cet exercice plus facilement.

    Merci mais ce code ne marche pas non plus, si on le lance par exemple avec 2 nombres ça ne les renvoi pas.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Agigas Voir le message
    Merci mais ce code ne marche pas non plus, si on le lance par exemple avec 2 nombres ça ne les renvoi pas.
    Tu ne veux pas afficher les nombres s'ils se somment à 42 mais tu veux afficher 2 nombres. Ton énoncé n'a soit aucun sens soit tu l'as mal compris.
    Tu peux pas demander d'aller à gauche et te plaindre quand on va pas à droite.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 17h16
  2. [VB6] modification de menu
    Par rikko23 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/11/2002, 21h30
  3. [] Datagrid vide après modification des propriétés
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/09/2002, 16h37
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Réponses: 11
    Dernier message: 23/07/2002, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo