Jump to content

Programa não faz o esperado! Arrays


TheWebs

Recommended Posts

10 minutos atrás, HappyHippyHippo disse:

vais fazer este simples exercício :


#include <stdio.h>

void foo(int i, int r) {
    r = i + 2;
}

int main(void)
{
    int i = 2,
        r = 0;

    foo(i, r);
    printf("r = %d\n", r);

    return 0;
}

que valor é apresentado na consola ? porque ?

A consola apresenta 0 porque a funcao foo e do tipo void logo nao devolve nada apenas faz operacoes com copias das variaveis passadas nos argumentos. Correto? (peco desculpa pela falta de acentos mas este teclado que tenho de momento e americano)

Link to comment
Share on other sites

4 minutos atrás, TheWebs disse:

A consola apresenta 0 porque a funcao foo e do tipo void logo nao devolve nada apenas faz operacoes com copias das variaveis passadas nos argumentos. Correto? (peco desculpa pela falta de acentos mas este teclado que tenho de momento e americano)

o tipo de retorno não nada haver com o problema. o mesmo aconteceria caso fosse:

#include <stdio.h>

int foo(int i, int r) {
    r = i + 2;
    return r;
}

int main(void)
{
    int i = 2,
        r = 0;

    foo(i, r);
    printf("r = %d\n", r);

    return 0;
}

agora, vamos supor que a função em vez de se chamar foo, se chama inscreverAluno ... hum ...

  • Vote 2
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

6 minutos atrás, HappyHippyHippo disse:

o tipo de retorno não nada haver com o problema. o mesmo aconteceria caso fosse:


#include <stdio.h>

int foo(int i, int r) {
    r = i + 2;
    return r;
}

int main(void)
{
    int i = 2,
        r = 0;

    foo(i, r);
    printf("r = %d\n", r);

    return 0;
}

agora, vamos supor que a função em vez de se chamar foo, se chama inscreverAluno ... hum ...

Ja entendi, o meu problema!!! Muito obrigado pela ajuda!

Link to comment
Share on other sites

6 minutos atrás, HappyHippyHippo disse:

por enquanto, vamos só corrigir o que disseste, não estás a igualar nada a um array 'p', 'p' é um valor númerico simples ... nada de array

segundo, o que é uma string ?

terceiro, como se copia strings ?

Penso que ja corrigi tudo isso, mudei para strcpy(). Ultimo problema que tenho agora e que o programa imprime todos os elementos do array em vez de apenas os que teem a propriedade valid == 1. O codigo foi atualizado online

Link to comment
Share on other sites

2 minutes ago, TheWebs said:

Suponho que 0 mas nao sei

o segredo é "não sei", e é essa a resposta certa. nem sabes tu nem sei eu. na realidade ninguem sabe, isto porque a variavel nunca foi inicializada.

com esta dica, achas que consegues corrigir o teu problema ?

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

3 minutos atrás, HappyHippyHippo disse:

o segredo é "não sei", e é essa a resposta certa. nem sabes tu nem sei eu. na realidade ninguem sabe, isto porque a variavel nunca foi inicializada.

com esta dica, achas que consegues corrigir o teu problema ?

Muito obrigado pela ajuda! Tudo em ordem agora! Percebi que tinha que inicializar todos os membros do array de alunos!

Inseri este pedaco de codigo no "construtor" da turma:

for(int i = 0; i<30;i++)
    {
        turma.alunos[i] = criarAluno(0, 0, "", 0);
    }
Link to comment
Share on other sites

bem ... cheguei a pensar e quando eficiente iria fazer o código, mas acho que se o fizesse, não irias pescar nada .. por isso simplesmente alterei o teu para ficar "mais bonito"

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

// CONSTANTS

#define MAX_NAME_SIZE 30
#define MAX_ALUNOS_POR_TURMA 30

// TYPEDEFS

typedef struct
{
    size_t id;
    unsigned int idade;
    char nome[MAX_NAME_SIZE];
    int valid:1;
} Aluno;

typedef struct
{
    size_t id;
    char prof[MAX_NAME_SIZE];
    struct
    {
        Aluno list[MAX_ALUNOS_POR_TURMA];
        size_t count;
    } alunos;
} Turma;

Aluno criarAluno(size_t id, unsigned int idade, char * nome);
int imprimeAluno(Aluno * aluno);

Turma criarTurma(size_t id, char * prof);
int inscreverAluno(Turma * turma, Aluno aluno);
int inscreverAlunoEx(Turma * turma, size_t id, unsigned int idade, char * nome);
int desinscreverAluno(Turma * turma, size_t id);
int contarAlunos(Turma * turma);
int imprimeTurma(Turma * turma);

Aluno criarAluno(size_t id, unsigned int idade, char * nome)
{
    Aluno aluno;

    aluno.id = id;
    aluno.idade = idade;
    strncpy(aluno.nome, nome, MAX_NAME_SIZE);
    aluno.valid = 1;

    return aluno;
}

int imprimeAluno(Aluno * aluno)
{
    if (!aluno)
        return -1;

    printf("[Nome=%s][Numero=%lu][Idade=%u]\n", aluno->nome, aluno->id, aluno->idade);
    return 0;
}

Turma criarTurma(size_t id, char * prof)
{
    Turma turma;

    turma.id = id;
    strncpy(turma.prof, prof, MAX_NAME_SIZE);
    memset(turma.alunos.list, 0, sizeof(Aluno) * MAX_ALUNOS_POR_TURMA);
    turma.alunos.count = 0;

    return turma;
}

int inscreverAluno(Turma * turma, Aluno aluno)
{
    if (!turma)
        return -1;

    if(turma->alunos.count == MAX_ALUNOS_POR_TURMA)
    {
        printf("A turma ja esta cheia!\n");
        return -2;
    }
    else
    {
        for (size_t index = 0; index < MAX_ALUNOS_POR_TURMA; ++index)
        {
            if (! turma->alunos.list[index].valid)
            {
                turma->alunos.list[index] = aluno;
                turma->alunos.list[index].valid = 1;
                turma->alunos.count++;
                return 0;
            }
        }
    }
    
    return -3;
}

int inscreverAlunoEx(Turma * turma, size_t id, unsigned int idade, char * nome)
{
    return inscreverAluno(turma, criarAluno(id, idade, nome));
}

int desinscreverAluno(Turma * turma, size_t id)
{
    if (!turma)
        return -1;

    for (size_t index = 0; index < MAX_ALUNOS_POR_TURMA; ++index)
    {
        if (turma->alunos.list[index].id == id)
        {
            turma->alunos.list[index].valid = 0;
            turma->alunos.count--;
            return 0;
        }
    }

    printf("O aluno em causa nao se encontra inscrito!\n");
    return -2;
}

int contarAlunos(Turma * turma)
{
    if (!turma)
        return -1;

    return turma->alunos.count;
}

int imprimeTurma(Turma * turma)
{
    if (!turma)
        return -1;

    printf("[Turma: %d][Professor: %s]\n", turma->id, turma->prof);

    for (size_t index = 0; index < MAX_ALUNOS_POR_TURMA; ++index)
    {
        if (turma->alunos.list[index].valid != 0)
            imprimeAluno(& turma->alunos.list[index]);
    }
}

int main(void) {
    Turma turma = criarTurma(2, "Julia Juliano");

    inscreverAlunoEx(& turma, 160221011, 18, "Francisco Leal");
    inscreverAlunoEx(& turma, 160221039, 19, "Hugo Ferreira");
    inscreverAlunoEx(& turma, 160221013, 13, "Gabriel Ambrosio");
    inscreverAlunoEx(& turma, 160221058, 19, "Diogo Silva");
    inscreverAlunoEx(& turma, 160221050, 21, "Bruno Dias");

    printf("Numero de alunos: %d\n", contarAlunos(& turma));

    imprimeTurma(& turma);

    return (EXIT_SUCCESS);
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Agradeco a nao optimizacao do codigo! Provavelmente nao iria perceber!

Ok, tenho algumas duvidas:

1- Qual a diferenca entre -> e ponto final?

2- int valid:1; quer dizer que se nada for especificado fica 1?

3- size_t O que e?

4- char * nome Qual a diferenca para char nome[30]?

5- Aluno * aluno Porque o * ?

6- strncpy qual a diferenca para strcpy?

7-  if (!aluno)
        return -1;

O que e que este codigo faz?

8- inscreverAlunoEx(& turma, 160221011, 18, "Francisco Leal"); Porque e que nao se iguala a nada e porque o uso do & antes de turma? 

Agradeco a paciencia

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.