TheWebs Posted March 5, 2017 at 04:23 PM Report Share #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 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 05:32 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 05:38 PM Author Report Share #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) Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 05:41 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 05:43 PM Author Report Share #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! Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 05:50 PM Author Report Share #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! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 05:52 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 05:55 PM Author Report Share #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'. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 06:05 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 06:13 PM Author Report Share #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 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 06:15 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 06:17 PM Author Report Share #602897 Posted March 5, 2017 at 06:17 PM Suponho que 0 mas nao sei Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 06:21 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 06:26 PM Author Report Share #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); } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 06:28 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 06:30 PM Author Report Share #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? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 06:30 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 06:32 PM Author Report Share #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! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 5, 2017 at 06:55 PM Report Share #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 Link to comment Share on other sites More sharing options...
TheWebs Posted March 5, 2017 at 07:09 PM Author Report Share #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 Link to comment Share on other sites More sharing options...
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