Cette ligne ne sert à rien memset(val,0,sizeofval); autant initialiser ton tableau direct ça t'évite un memset.
Un else suffit ici, non ? elseif(!(*flags&INWORD))
Boarf, j'ai l'habitude d'éviter les trucs en dur dans le code. Quand je code j'écris directement puts(OPENFAIL) et je m'occupe de définir le truc qu'à la fin si je m'en souviens ou si le compilo me le demande.
Citation : Pouet_forever
Cette ligne ne sert à rien memset(val,0,sizeofval); autant initialiser ton tableau direct ça t'évite un memset.
Norme Epitech.
Citation : Pouet_forever
Un else suffit ici, non ? elseif(!(*flags&INWORD))
Non, sinon tu comptes un mot pour chaque caractère du mot. Le flag sert à savoir si on est dans un mot ou pas.
En fait, c'est surtout problématique avec stdin de ne pas tout faire à mesure.
Pardonne moi Marc mais je n'ai pas tout a fait compris ce que tu as dit
Si j'ai bien compris ce que tu as écrit à propos de ton code, il parcourait 3 fois tout le fichier. Si c'est bien cela, alors tant que les données sont dans un fichier, ça va (lentement). Mais si les données viennent de stdin?
@IATGOF : c'est bien dans l'ensemble, juste la norme EPITECH que j'aime pas trop mais bon.
Par contre on peut faire beaucoup plus court tout en étant aussi performant. (Pour analyser ton code source mon programme et le tient mettent entre 0.001 et 0.002 ms avec et sans les optimisations (-O2))
$ time ./lithrein12 iatgof.c
90 ligne(s) 184 mot(s) 1382 caractere(s)
real 0m0.001s
user 0m0.000s
sys 0m0.000s
$ time ./iatgof iatgof.c
90 184 1382
real 0m0.002s
user 0m0.000s
sys 0m0.000s
$ time ./iatgof lithrein12.c
47 131 889
real 0m0.001s
user 0m0.000s
sys 0m0.000s
$ time ./lithrein12 lithrein12.c
47 ligne(s) 131 mot(s) 889 caractere(s)
real 0m0.001s
user 0m0.000s
sys 0m0.000s
Les deux programmes ont été compilés avec les options suivantes :
$ gcc -std=c89 -pedantic -Werror -W -Wall -O2
Une remarque :
$ ./iatgof
usage: ./zwc file
Citation : Enoncé I)2.
Si aucun fichier n'est passé en argument vous récupérerez le texte sur l'entrée standard comme pour la première question.
juste la norme EPITECH que j'aime pas trop mais bon.
Ouais bon, un petit coup d'indentation automatique et c'est réglé, non?
Citation : Lithrein
Par contre on peut faire beaucoup plus court tout en étant aussi performant.
J'ai précisé que c'était une implémentation rapide, je l'ai codé comme ça venait sans me prendre la tête.
Mais si je doit faire la même chose en 47 lignes alors je relève le défi edit:
#include <stdio.h>
#include <ctype.h>
void proceed(FILE *f, unsigned int *v)
{
char buf[1024];
int i, iw;
while ((fgets(buf, 1024, f)))
{
iw = 0;
for (i = 0; buf[i]; i++)
{
v[2]++;
if (buf[i] == '\n')
v[0]++;
if (isspace((unsigned char)buf[i]))
iw = 0;
else if (!iw)
v[1]++, iw = 1;
}
}
}
int main(int ac, char **av)
{
unsigned int val[3] = {0};
FILE *f;
if (ac < 2)
{
proceed(stdin, val);
return printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]) & 0;
}
if (!(f = fopen(av[1], "r")))
return printf("Cannot open %s\n", av[1]) & 0;
proceed(f, val);
fclose(f);
return printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]) & 0;
}
Citation : Lithrein
$ ./iatgof
usage: ./zwc file
Oui bon J'avais la flemme.
#define USAGE "%s file\n"
printf(USAGE, av[0]);
Citation : Lithrein
Si aucun fichier n'est passé en argument vous récupérerez le texte sur l'entrée standard comme pour la première question.
Ok, ok. Remplacer le puts(USAGE); par un proceed(f,val),disp(val);. Et faire le memset avant aussi.
Vu que tu aime les défis, relèveras-tu celui-ci (si tu veux le code MP car, je n'ai pas le droit de participer puisque je suis l'organisateur) :
$ ./shortlithrein12 shortlithrein12.c
27 119 691
Ouais bon, là ça va vraiment devenir illisible mais pourquoi pas. Le but de mon code précédent était de montrer qu'on pouvait toujours faire plus court mais que c'est pas forcément mieux, mon premier est quand même beaucoup plus lisible.
Citation : Lithrein
J'adore tes return, mais je les aurais plus vus comme ça (au cas où printf plante) :
return printf("%s", "whatever you want") ^ 1;
Euh nan, printf renvoie le nombre de caractère écrits. Plutôt !printf() pour renvoyer 1 si printf n'a rien écrit, 0 sinon.
edit: Here you go.
#include <stdio.h>
#include <ctype.h>
void proceed(FILE *f, unsigned int *v)
{
char buf[1024];
int i, iw;
for (iw = 0; fgets(buf, 1024, f); iw = 0)
for (i = 0; buf[i]; i++, v[2]++)
(void)(((buf[i] == '\n') && (v[0]++ & 0)) || (isspace((unsigned char)buf[i]) && !(iw = 0)) || (!iw && (v[1]++, iw = 1)));
}
int main(int ac, char **av)
{
unsigned int val[3] = {0};
FILE *f;
if (ac < 2)
return proceed(stdin, val), !printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]);
if (!(f = fopen(av[1], "r")))
return !printf("Cannot open %s\n", av[1]);
return proceed(f, val), fclose(f), !printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]);
}
bonjour,
voici ma tentative pour la partie I, et la partie II
#include <stdio.h>
#include <stdlib.h>
//creation d'un type de variable personnelle
typedef struct data data;
struct data
{
long Ncaractere;
int Nmot;
int Nligne;
};
//creation de type énuméré
typedef enum Caracterespeciaux Caracterespeciaux;
enum Caracterespeciaux
{
espace = ' ', tabulation = '\t', retLigne = '\n' , retChariot ='\r'
};
typedef enum booleen booleen;
enum booleen
{
vrai=1 , faux=0
};
//fonction declaration
data zWc(FILE *fichier);
void affiche(data resultat);
int main(void)
{
data resultat;
printf("Hello world! exo zWc premiere quinzaine d'avril\n");
printf("Compte le nombre de caracteres , mots ,lignes d'un fichier\n");
printf("taper control Z pour finir la saisie \n\n\n");
//debut exo I
resultat=zWc(stdin);
affiche(resultat);
//debut exo II
FILE* fichier = NULL;
fichier = fopen("test.txt", "r");//lecture seulement
if (fichier != NULL)
{
resultat=zWc(fichier);
affiche(resultat);
fclose(fichier);
}
else
{
// On affiche un message d'erreur si on veut
printf("\n Impossible d'ouvrir le fichier test.txt\n");
printf("Compte le nombre de caracteres , mots ,lignes de 'stdin'\n");
printf("taper control Z pour finir la saisie \n\n\n");
resultat=zWc(stdin);
affiche(resultat);
}
return 0;
}
//fonctions
void affiche(data resultat)
{
//contrainte gestion du s pour le pluriel
if (resultat.Ncaractere >1)
{
printf("%ld caracteres\n",resultat.Ncaractere);
}
else
{
printf("%ld caractere\n",resultat.Ncaractere);
}
if (resultat.Nmot >1)
{
printf("%d mots\n",resultat.Nmot);
}
else
{
printf("%d mot\n",resultat.Nmot);
}
if (resultat.Nligne >1)
{
printf("%d lignes\n",resultat.Nligne);
}
else
{
printf("%d ligne\n",resultat.Nligne);
}
//attente clavier pour windows
getchar();
}
data zWc(FILE *fichier)
//contrainte perso pas d'entree/sortie du clavier/ecran
{
char c;
data resultat;
resultat.Ncaractere=0;
resultat.Nmot=0;
resultat.Nligne=0;
while ((c = fgetc(fichier)) != EOF)
{
//resultat.Ncaractere++;
switch (c)
{
case espace:
resultat.Nmot++;
resultat.Ncaractere++;
break;
case tabulation:
resultat.Nmot++;
resultat.Ncaractere++;
break;
case retLigne :
resultat.Nligne++;
resultat.Nmot++;
break;
case retChariot:
resultat.Nligne++;
resultat.Nmot++;
break;
default :
resultat.Ncaractere++;
break;
}
}
return resultat;
}
qu'en pensez vous ?
Pour la partie III vu que j'ai rien compris je vais commencer par decortiquer les codes qui sont dejà posté ici
Hello world! exo zWc premiere quinzaine d'avril
Compte le nombre de caracteres , mots ,lignes d'un fichier
taper control Z pour finir la saisie
AZERTY CLAVIER
EXO DU SITE DU ZERO
MOIS D'AVRIL
^Z
45 caracteres
9 mots
3 lignes
Impossible d'ouvrir le fichier test.txt
Compte le nombre de caracteres , mots ,lignes de 'stdin'
taper control Z pour finir la saisie
FIN
^Z
3 caracteres
1 mot
1 ligne
Process returned 0 (0x0) execution time : 98.514 s
Press any key to continue.
Dans votre code, le comptage des mots compte en fait les caractères blancs. Essayez par exemple avec plusieurs espaces entre deux mots.
Dans votre code, le comptage des caractères oublie les caractères de fin de ligne.
Dans votre code, le comptage des mots compte en fait les caractères blancs. Essayez par exemple avec plusieurs espaces entre deux mots.
Dans votre code, le comptage des caractères oublie les caractères de fin de ligne.
merci pour l'info je revoie ma copie!
par contre le caractere fin de ligne effectivement pour moi c'est pas un caractere!
je corrige
merci
Vu que plus personne ne participe je pense que je vais proposer une correction plus tôt que prévu (ce soir ou demain martin) et je lancerais le nouvel exercice.
Si vous n'êtes pas d'accord merci de me le faire savoir.
PS: Si la correction venez à ne pas être proposé ce soir ou demain, je la proposerais au alentours du 20 car je suis absent à partir de samedi 10 jusqu'au samedi suivant.
/home/emmanuel/Programmes en c/wc/main.c||In function ‘main’:|
/home/emmanuel/Programmes en c/wc/main.c|46|warning: suggest parentheses around ‘&&’ within ‘||’|
||=== Build finished: 0 errors, 1 warnings ===|
Je suis ouvert a toutes critiques sur mon code.
J'aimerais savoir, aussi, pourquoi j'ai le warning et comment y remédier.
Emmflo
J'ai cru comprendre que Lithrein proposera un exo... si ce n'est pas le cas, j'en ai un... Mais il est pas bien prepare... donc c'est vraiment si personne n'en a
J'ai cru comprendre que Lithrein proposera un exo... si ce n'est pas le cas, j'en ai un... Mais il est pas bien prepare... donc c'est vraiment si personne n'en a
Pour ma part peu importe pourvu qu il y ait un exo qui me fasse progresser...
@Adroneus : Je te conseille de proposer ton exercice.
Pour la correction, je suis désolé, je suis un petit peu pris de court, je ne pourrais donc proposer la correction qu'à partie du 18 avril car je ne vais plus pouvoir venir avant. Je vous prie de m'excuser.
@GurneyH : Je compte m'occuper encore de proposer les futurs exercices car même s'il y a peu de participants, j'ai vraiment l'impression que ces exercices font plaisir à ceux qui participent et qu'ils souhaitent que cela continu.
Je compte m'occuper encore de proposer les futurs exercices car même s'il y a peu de participants, j'ai vraiment l'impression que ces exercices font plaisir à ceux qui participent et qu'ils souhaitent que cela continu.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.