TheWebs Posted March 5, 2017 at 04:23 PM Report #602879 Posted March 5, 2017 at 04:23 PM (edited) Fiz um programa muito simples em C mas que nao faz o que pretendia. Quando imprimo a turma todas as informações saem mal excepto o nome do professor, o numero da turma e o numero de elementos da mesma! Codigo do programa: https://github.com/TheWebs/SimpleC Saida: Edited March 5, 2017 at 05:27 PM by TheWebs
HappyHippyHippo Posted March 5, 2017 at 05:32 PM Report #602885 Posted March 5, 2017 at 05:32 PM 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 ? 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
TheWebs Posted March 5, 2017 at 05:38 PM Author Report #602887 Posted March 5, 2017 at 05:38 PM 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)
HappyHippyHippo Posted March 5, 2017 at 05:41 PM Report #602888 Posted March 5, 2017 at 05:41 PM 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 ... 2 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
TheWebs Posted March 5, 2017 at 05:43 PM Author Report #602889 Posted March 5, 2017 at 05:43 PM 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!
TheWebs Posted March 5, 2017 at 05:50 PM Author Report #602890 Posted March 5, 2017 at 05:50 PM Eu ja atualizei o codigo com as alteracoes que achei que eram corretas. Os numeros estao bem agora mas o nome imprimido nao e o correto. O link e o mesmo!
HappyHippyHippo Posted March 5, 2017 at 05:52 PM Report #602891 Posted March 5, 2017 at 05:52 PM (edited) 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 March 5, 2017 at 05:53 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
TheWebs Posted March 5, 2017 at 05:55 PM Author Report #602892 Posted March 5, 2017 at 05:55 PM Estou a guarda los num array com 30 elementos. Para efeitos de teste todos os nomes sao iguais a 'p'. Igualo o indice 0 do array a 'p'.
HappyHippyHippo Posted March 5, 2017 at 06:05 PM Report #602893 Posted March 5, 2017 at 06:05 PM 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 Portugol Plus
TheWebs Posted March 5, 2017 at 06:13 PM Author Report #602895 Posted March 5, 2017 at 06:13 PM 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
HappyHippyHippo Posted March 5, 2017 at 06:15 PM Report #602896 Posted March 5, 2017 at 06:15 PM 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 Portugol Plus
TheWebs Posted March 5, 2017 at 06:17 PM Author Report #602897 Posted March 5, 2017 at 06:17 PM Suponho que 0 mas nao sei
HappyHippyHippo Posted March 5, 2017 at 06:21 PM Report #602898 Posted March 5, 2017 at 06:21 PM 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 Portugol Plus
TheWebs Posted March 5, 2017 at 06:26 PM Author Report #602899 Posted March 5, 2017 at 06:26 PM 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); }
HappyHippyHippo Posted March 5, 2017 at 06:28 PM Report #602900 Posted March 5, 2017 at 06:28 PM 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 Portugol Plus
TheWebs Posted March 5, 2017 at 06:30 PM Author Report #602901 Posted March 5, 2017 at 06:30 PM 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?
HappyHippyHippo Posted March 5, 2017 at 06:30 PM Report #602902 Posted March 5, 2017 at 06:30 PM estas a pedir que faça o teu problema ao "meu estilo" ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
TheWebs Posted March 5, 2017 at 06:32 PM Author Report #602903 Posted March 5, 2017 at 06:32 PM 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!
HappyHippyHippo Posted March 5, 2017 at 06:55 PM Report #602905 Posted March 5, 2017 at 06:55 PM 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 Portugol Plus
TheWebs Posted March 5, 2017 at 07:09 PM Author Report #602906 Posted March 5, 2017 at 07:09 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now