Exercice de tableau redimension

Fermé
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018 - 16 mai 2018 à 19:38
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 25 mai 2018 à 12:43
Bonjour, voici un algorithme donnée : Variables Nb, i en entier
Variable Flag en booléen
Tableau T() en entier
Début
Écrire "Entrez le nombre de valeurs : "
Lire Nb
Redim T(Nb – 1)
Pour i ← 0 à Nb – 1
Écrire "Entrez le nombre no", i + 1
Lire T(i)
i Suivant
Flag ← Vrai
Pour i ← 1 à Nb – 1
Si T(i) <> T(i – 1) + 1 alors
Flag ← Faux
FinSi
i Suivant
Si Flag alors
Écrire "Les nombres sont consécutifs"
Sinon
Écrire "Les nombres ne sont pas consécutifs"
FinSi
Fin

TRADUCTION C :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>


int main(void)
{
    int nb, i;
    bool flag;
    int T[0];

    printf("Entrez le nombre de valeurs:\n");
    scanf("%d", &nb),
    redim T("%d", &nb-1);
    for (i = 0; nb-1)
    {
        printf("entrez le no\n")
        i+1;
    }

    scanf("%d", T[&i]);
    i++;


            return 0;

}

-Il faut donc crée un tableau non dimensionner au début pour le redimensionner par la suite, j'ai donc ecrit au début, int T[0], pensez vous que c'est correct?

-Je reste bloqué sur la ligne 15, je ne sais pas comment redimensionner un tableau... la fonction "redim" ne doit sûrement pas existé, avez vous une solution? Pareil pour retrancher -1 à nb, j'ai un gros doute sur mon codage.

-Pour la ligne 19, j'ai un doute, si ce n'est pas plûtot "i++" au lieu de "i+1" lol.

-Ligne 22 j'ai mis le pointeur "&" pour insérer i dans T.

-j'ai pas bien saisis le "i Suivant" en algorithme, alors j'ai retranscris en C "i++"?



3 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 17 mai 2018 à 10:58
Salut ninrin,

ton compilateur avec Codeblocks devrait être gcc, et par défaut il est paramétré par Codeblocks pour générer des warnings (et bien sûr des erreurs de compilation), et donc ta tentative de compilation de ton programme devrait te dire ceci :

$ gcc -Wall 35367100.c
35367100.c: In function ‘main’:
35367100.c:15:5: error: ‘redim’ undeclared (first use in this function)
redim T("%d", &nb-1);
^
35367100.c:15:5: note: each undeclared identifier is reported only once for each function it appears in
35367100.c:15:11: error: expected ‘;’ before ‘T’
redim T("%d", &nb-1);
^
35367100.c:16:21: error: expected ‘;’ before ‘)’ token
for (i = 0; nb-1)
^
35367100.c:19:9: error: expected ‘;’ before ‘i’
i+1;
^
35367100.c:22:18: error: array subscript is not an integer
scanf("%d", T[&i]);
^
35367100.c:11:9: warning: variable ‘T’ set but not used [-Wunused-but-set-variable]
int T[0];
^
35367100.c:10:10: warning: unused variable ‘flag’ [-Wunused-variable]
bool flag;
^

Utilise ces informations pour corriger ton code.

Quelques indications en réponse à tes question :

-Il faut donc crée un tableau non dimensionner au début pour le redimensionner par la suite, j'ai donc ecrit au début, int T[0], pensez vous que c'est correct?

Non. C'est sans doutes juste un pointeur sur int qu'on te demande de déclarer, que tu utilises une fois que tu connais le nombre d'éléments pour allouer l'espace nécessaire avec malloc. Tu pourras ensuite passer d'un élément à l'autre avec l'opérateur d'indexation
[ ]
comme si tu avais déclaré un tableau.

-Je reste bloqué sur la ligne 15, je ne sais pas comment redimensionner un tableau... la fonction "redim" ne doit sûrement pas existé, avez vous une solution? Pareil pour retrancher -1 à nb, j'ai un gros doute sur mon codage.

En C, si tu dois allouer de l'espace mémoire avec malloc pour 10 éléments int, il te faut une taille de
sizeof(int) * 10
et pas de
sizeof(int) * (10 - 1)
, sinon tu déborderas d'espace mémoire alloué en stockant le 10ème élément

-Pour la ligne 19, j'ai un doute, si ce n'est pas plûtot "i++" au lieu de "i+1" lol.

Là tu exagères vraiment. Vois ton cours ou ton manuel sur les boucles for et sur l'incrémentation de variables.

-Ligne 22 j'ai mis le pointeur "&" pour insérer i dans T.

Ton scanf n'est pas dans la boucle. Il ne sera donc exécuté qu'une fois.

L'opérateur
&
permet d'obtenir l'adresse de quelque chose. Tu l'utilises dans scanf, car scanf a besoin de l'adresse de la variable dont le contenu mémoire doit être modifié. Ce n'est donc pas à l'index que tu dois appliquer l'opérateur. Imagine que l'adresse mémoire de i soit 3220574636 et que tu as dimensionné ton tableau pour 10 éléments (heureusement, le compilateur génère une erreur de compilation, car il considère qu'une adresse mémoire n'est pas un type entier utilisable pour un index de tableau) ... cela devrait donc être
scanf("%d", &T[i]);
...

-j'ai pas bien saisis le "i Suivant" en algorithme, alors j'ai retranscris en C "i++"?

Si tu utilises une boucle for, ses 3 arguments vont te permettre de définir la valeur de départ de i, la condition de sortie et l'incrémentation de i à chaque itération.

Alors, à cet endroit, tu auras juste besoin d'une accolade fermante.


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 17 mai 2018 à 11:11
J'ajouterai qu'un algorithme n'est pas un programme informatique et qu'il ne fait que décrire une séquence d'opérations logiques, lesquelles peuvent être exprimées dans un langage de programmation sous une forme propre, qui peut être fortement différente, tout en exprimant les mêmes idées.

Tu ne dois pas te focaliser sur la recherche d'une traduction de chaque "mot", mais sur l'expression correcte des idées véhiculées par l'algorithme dans le langage de programmation.
0
ok , donc voici une version "amélioré" de la traduction en C :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

  int nb;
    int flag =1;

    int T[0];

int main(void)
{
    int flag =1;
       if(flag)
        {
        printf("vrai\n");

    }
    else
    {
        printf("faux\n");
    }

    printf("Entrez le nombre de valeurs:\n");
    scanf("%d", &nb);
    T = malloc(sizeof(int));
    for (i = 0; nb-1 ; i++)
    {
        printf("entrez le no\n");
         scanf("%d", &T[i]);
    }

    flag = vrai;

    for (i = 1; nb-1)
    {
        if(T <> T(i-1))+1
        {
            flag = faux;
        }
    }
if(flag)
{
    printf("Les nombvres sont consecutifs\n");
}
else
{
    printf("Les nombres ne sont pas consécutifs\n");
}
            return 0;

}


J'aurais besoin d'aide pour la ligne 26 de malloc, avec un error: assignement to expression with array. Je suis largué, c'est la 1ère fois que j'utilise les fonction d'allocation dynamique
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
25 mai 2018 à 12:43
Comme dans ton code initial, tu déclares T comme un tableau, alors que je t'indiquais que tu devais le déclarer comme pointeur sur
int
pour l'utiliser avec malloc.

Voilà un code illustrant comment utiliser un pointeur sur
int
pour allouer dynamiquement un espace de stockage et accéder aux éléments de cet espace avec l'opérateur
[ ]
:

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

int main(void) {
    int * T;    /* T est une variable contenant un pointeur
                   sur int */

    /* on réserve avec malloc un espace mémoire de la
     * taille de 3 int, et on affecte l'adresse de cet
     * espace mémoire à la variable T */
    T = malloc(sizeof(int) * 3);
    /* si l'allocation mémoire a échoué, on termine
     * le programme */
    if (T == NULL) {
        printf("Erreur d'allocation mémoire\n");
        return 1;
    }
    /* on demande à l'utilisateur combien il veut stocker 
     * d'entiers (simulation) */
    int nb = 3;
    /* on se sert du pointeur T et de l'opérateur
     * [ ] pour accéder aux emplacements de stockage 
     * disponibles */
    int i;
    printf("Saisissez %d entiers svp :\n", nb);
    for (i = 0; i < nb; i++)
        scanf("%d", &T[i]);
    printf("Merci, voici les nombres entiers saisis :\n");
    for (i = 0; i < nb; i++)
        printf("nombre n°%d : %d\n", i, T[i]);

    /* on libère la mémoire pointée par T */
    free(T);                                                                                            

    return 0;
}

Le code, et les commentaires devraient le permettre de saisir les choses.

T n'est pas de type tableau, mais
[ ]
permet une itération sur les éléments stockés en mémoire à partir de l'adresse du premier élément, grâce à l'arithmétique de pointeurs, la taille d'un
int
étant connue du compilateur.

Dal
0