Jump to content

Programa não faz o esperado! Arrays


TheWebs

Recommended Posts

HappyHippyHippo

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 ?

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
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 post
Share on other sites
HappyHippyHippo
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 post
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 post
Share on other sites
HappyHippyHippo

diz-me isto : como estás a guardar os nomes ?

nota : eu sei como estás a fazer-lo, vamos ver é como está errado

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
HappyHippyHippo

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 ?

IRC : sim, é algo que ainda existe >> #p@p
Link to post
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 post
Share on other sites
HappyHippyHippo

ok ... vamos agora a mais um problema ...

o que é imprimido no segunite código ?

#include <stdio.h>

int main(void) {
    int value;

    printf("value = %d\n", value);
    return 0;
}

nota : responde sem compilar

IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
HappyHippyHippo
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 post
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 post
Share on other sites
HappyHippyHippo

ok ... se funciona porreiro.

no entanto lembra-te que apesar de funcionar, existem maneiras diferentes de o fazer, e talvez, algumas delas melhores ...

IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
1 minuto atrás, HappyHippyHippo disse:

ok ... se funciona porreiro.

no entanto lembra-te que apesar de funcionar, existem maneiras diferentes de o fazer, e talvez, algumas delas melhores ...

Alguma sugestao? Existe alguma forma de inicializar todos os membros de uma so vez?

Link to post
Share on other sites
Agora, HappyHippyHippo disse:

estas a pedir que faça o teu problema ao "meu estilo" ?

Sempre me disseram que o saber nao ocupa espaco, se possivel sim gostaria de ver uma segunda versao!

Link to post
Share on other sites
HappyHippyHippo

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 post
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 post
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.