JoBlack Posted April 16, 2006 at 12:07 PM Report Share #22341 Posted April 16, 2006 at 12:07 PM Olá estou a iniciar um prg para um trab escolar http://www.estv.ipv.pt/PaginasPessoais/fmorgado/EDados/EnunciadoPratica.pdf e, depois de construir este pedaço de código surgem-me já 2 erros que não consigo descobrir! 1. Mesmo que coloque o utilizador e senha correctos aparece-me sempre a msg 'Utilizador ou senha errados'. Acho que o prob está no utilizador 'string' mas não consigo ultrapassá-lo! 2. No final coloquei uma confirmação para sair do prg mas quer escreva 's' ou 'n' não obtenho nenhum resultado! Será que me podem analisar o código e ver o que está mal? e, se não for pedir mto, comentem, dêem sugestões pq estou agora a iniciar-me em C. Obrigado #include <stdio.h> #include <string.h> void titulo() { printf("SIER - Sistema de Informacao de Estacao Radio"); printf("\n---------------------------------------------"); } int menup() { int a; do{ system("CLS"); titulo(); printf("\n\nMENU PRINCIPAL"); printf("\n\n\n1 - Tocar Musica"); printf("\n2 - Musicas..."); printf("\n3 - Autores..."); printf("\n4 - Utilitarios..."); printf("\n\n9 - SAIR"); printf("\n\n\nOpcao: "); scanf("%d",&a); }while(a<0 || a>10); return a ; } int menum() { int a; do{ system("CLS"); titulo(); printf("\n\nMENU MUSICAS"); printf("\n\n\n1 - Inserir"); printf("\n2 - Alterar"); printf("\n3 - Apagar"); printf("\n4 - Registo"); printf("\n\nListar por"); printf("\n5 - autor"); printf("\n6 - ano"); printf("\n7 - tipo"); printf("\n8 - as mais passadas"); printf("\n\n9 - Menu Principal"); printf("\n\n\nOpcao: "); scanf("%d",&a); }while(a<0 || a>10); return a ; } int menua() { int a; do{ system("CLS"); titulo(); printf("\n\nMENU AUTORES"); printf("\n\n\n1 - Inserir"); printf("\n2 - Alterar"); printf("\n3 - Apagar"); printf("\n\nListar por"); printf("\n4 - nome"); printf("\n5 - nacionalidade"); printf("\n6 - xxx"); printf("\n\n9 - Menu Principal"); printf("\n\n\nOpcao: "); scanf("%d",&a); }while(a<0 || a>10); return a ; } int menuu() { int a; do{ system("CLS"); titulo(); printf("\n\nMENU UTILITARIOS"); printf("\n\n\n1 - Inserir utilizador"); printf("\n2 - Alterar senha"); printf("\n3 - Listar utilizadores"); printf("\n4 - Gravar dados"); printf("\n5 - Ler dados"); printf("\n6 - Historico de accoes"); printf("\n\n9 - Menu Principal"); printf("\n\n\nOpcao: "); scanf("%d",&a); }while(a<0 || a>10); return a ; } void main() { char utilizador[]={"Visitante"}; char utiliz[10]; int senha, pw, op,op2,op3,op4,b; senha=12345; titulo(); printf("\n\nUtilizador: "); scanf("%s", utiliz); printf("\n\nSenha: "); scanf("%d", &pw); if (pw == senha && utiliz == utilizador) do{ op=menup(); switch(op) { case 1:printf("Titulo 1");break; case 2:op2=menum(); switch(op2) { case 1:printf("Musicas - Inserir");break; case 2:printf("Musicas - Alterar");break; case 3:printf("Musicas - Apagar");break; case 4:printf("Musicas - Apagar");break; case 5:printf("Lista autor");break; case 6:printf("Lista ano");break; case 7:printf("Lista tipo");break; case 8:printf("Lista as mais passadas");break; case 9:break; } break; case 3:op3=menua(); switch(op3) { case 1:printf("Autores - Inserir");break; case 2:printf("Autores - Alterar");break; case 3:printf("Autores - Apagar");break; case 4:printf("Lista nome");break; case 5:printf("Lista nacionalidade");break; case 6:printf("Lista xxx");break; case 9:break; } break; case 4:op4=menuu(); switch(op4) { case 1:printf("Inserir Utilizador");break; case 2:printf("Alterar senha");break; case 3:printf("Listar utilizadores");break; case 4:printf("Gravar dados");break; case 5:printf("Ler dados");break; case 6:printf("Historico");break; case 9:break; } break; case 9:printf("Deseja mesmo sair(s/n):"); do { scanf("%c",&b); }while(b!='s' && b!='n'); if(b=='s') { printf("Vou sair!"); exit(0); break; } else break; } } while(1); else printf("Utilizador ou Password errados!"); getch(); } Link to comment Share on other sites More sharing options...
Gurzi Posted April 16, 2006 at 12:40 PM Report Share #22343 Posted April 16, 2006 at 12:40 PM não percebo muito de c mas explica-me isto se faz favor if (pw == senha && utiliz == utilizador) do{ op=menup(); estás a atribuir uma função menup() a uma variavel ? Link to comment Share on other sites More sharing options...
Marino Posted April 16, 2006 at 12:42 PM Report Share #22344 Posted April 16, 2006 at 12:42 PM scanf("%s", utiliz); Falta o &, o resto nao vi Link to comment Share on other sites More sharing options...
Gurzi Posted April 16, 2006 at 12:48 PM Report Share #22346 Posted April 16, 2006 at 12:48 PM Marino, quando se le strings, não se usa o & Link to comment Share on other sites More sharing options...
Marino Posted April 16, 2006 at 12:51 PM Report Share #22347 Posted April 16, 2006 at 12:51 PM Não sabia, obrigado por avisares. A fuçao menup() retorna um inteiro, por isso pode escrever op=menup(); se op for inteiro. Link to comment Share on other sites More sharing options...
Gurzi Posted April 16, 2006 at 12:53 PM Report Share #22349 Posted April 16, 2006 at 12:53 PM hmm porreiro mas como dentro da função menup() ele nao pos nenhum parametro 🙂 fiquei apanhar do ar, mas ja entendi , muito obrigado 🙂 Link to comment Share on other sites More sharing options...
j0mi Posted April 16, 2006 at 01:13 PM Report Share #22350 Posted April 16, 2006 at 01:13 PM utiliz == utilizador ... Isso não são Strings? Então nada de == mas sim a função string compare -> strcmp USAGE: int strcmp ( const char * string1, const char * string2 ); return value description <0 string1 is less than string2 0 string1 is the same as string2 >0 string1 is greater than string2 Logo aí será ... && strcmp(utiliz, utilizador)==0 Espero ter ajudado Cumprimentos Link to comment Share on other sites More sharing options...
pkyer Posted April 16, 2006 at 01:26 PM Report Share #22351 Posted April 16, 2006 at 01:26 PM Para se receber string numa variavel n se usa o scanf mas sim o "gets(nome_variavel);" e convem fazer dps um "fflush(stdin);" em caso se dps se perguntar um nº para kem n sabe o ke a instrucção "fflush(stdin);", esta instrucção limpa o buffer. Fiquem bem e Boa Pascoa Link to comment Share on other sites More sharing options...
_Pedro_ Posted April 16, 2006 at 01:40 PM Report Share #22354 Posted April 16, 2006 at 01:40 PM Para comparar strings usa-se o strcmp(string1,string2) e não string1==string2!!! É um erro grave ? Para alem disso, em vez de usares scanf("%s",var) usa antes gets(variavel) seguido de um fflush(stdin) para limpar o buffer. 🙂 Link to comment Share on other sites More sharing options...
JoBlack Posted April 16, 2006 at 01:46 PM Author Report Share #22358 Posted April 16, 2006 at 01:46 PM 1.º erro resolvido, obrigado j0mi 🙂 Link to comment Share on other sites More sharing options...
neon_prannock Posted April 16, 2006 at 01:55 PM Report Share #22360 Posted April 16, 2006 at 01:55 PM A variável b não é suposto ser uma 'char' para receber o caracter, e não um 'int' como declaraste? http://sergiosantos.info http://ideias3.com http://takeoff.ideias3.com Link to comment Share on other sites More sharing options...
JoBlack Posted April 16, 2006 at 02:12 PM Author Report Share #22365 Posted April 16, 2006 at 02:12 PM Ehh, como é que não reparei nisso!!! sou mesmo 'nabo'... Ok, problem resolvido. Obrigado neon_prannock 🙂 Link to comment Share on other sites More sharing options...
nunoxyz Posted April 16, 2006 at 04:26 PM Report Share #22393 Posted April 16, 2006 at 04:26 PM nota: para tornar o programa legivel e k entendas o teu proprio codigo: // A usar a variavel 'a' como inteiro para ler a opção int a; // Esta função devolve o valor xyz para mais tarde tratar... o valor xyz e relativo a y int ksd (int arg1, char arg2, float argzzzz); nota: isto sao so exemplos para simplificar a leitura do codigo! nota final: akele abraço pra viseu! Link to comment Share on other sites More sharing options...
motherFFH Posted April 16, 2006 at 04:44 PM Report Share #22398 Posted April 16, 2006 at 04:44 PM fflush(stdin); está errado. fflush() só se aplica a output streams. Link to comment Share on other sites More sharing options...
Gurzi Posted April 16, 2006 at 04:54 PM Report Share #22400 Posted April 16, 2006 at 04:54 PM o que são outputs streams ? podes explicar melhor isso do fflush(stdin) e tipo, o fflush(stdin) normalmente usa-se antes do scanf() ou depois ? tipo printf(); scanf(); fflush(stdin); tendo em conta que ele pode guardar no scanf() o enter onde ponho o fflush(stdin); ah e alguem me xplica aquela cena do espaço que convem por no % tipo scanf(" %s",nome); o espaço do % asseguir ás ""; Link to comment Share on other sites More sharing options...
motherFFH Posted April 16, 2006 at 05:46 PM Report Share #22412 Posted April 16, 2006 at 05:46 PM O stdout é uma output stream, o stdin é uma input stream. Quando abres um ficheiro tens que especificar o modo, read ou write, e recebes uma stream da qual só podes ler (input stream) ou escrever (write stream). Existem modos de abertura que dão tanto para ler como para escrever, mas a cada momento a stream está em modo input only ou output only; para se comutar os modos usa-se um truque que consiste em fazer um fseek(f, 0,0). Quanto ao exemplo de código que dás, está errado! Não faz o que pretendes. Flush significa despejar. O fflush() é para escrever em disco coisas que estejam ainda em memória. Exemplo, se fizeres fprintf(f, "blabla"); "blabla" pode não ser escrito logo no ficheiro em disco. PAra que isso aconteça é necessário que f seja fechado fclose(f) ou que se faça o flush - fflush(f). Em streams de input fflush() -- pelo standard-- não faz nada. Aquilo que vocês querem é algo tipo discard_input(FILE *f); que não é standard em C, mas é facilmente realizável: void discard_input(FILE *f) { int c; while ((c = getc(f)) != EOF && c != '\n') ; } Finalmente, em relação ao espaço no scanf, isso é uma directiva que instrói o scanf a saltar todo o whitespace antes de fazer a conversão (portanto, nem sequer o tal discard_input será necessário normalmente). Só que isso já é feito por quase todas as conversões, pelo que fazer scanf(" %s") é igual a fazer scanf("%s") A grande excepção digna de realce é a conversao %c que extrai o primeiro char que lhe aparece. Neste caso scanf(" %c", &c) mete em "c" o primeiro char não whitespace scanf("%c", &c) meter em "c" o primeiro char que encontre, seja whitespace ou não. Link to comment Share on other sites More sharing options...
neon_prannock Posted April 16, 2006 at 05:48 PM Report Share #22413 Posted April 16, 2006 at 05:48 PM Bem, os dois problemas foram resolvidos e a dúvida esclarecida! http://sergiosantos.info http://ideias3.com http://takeoff.ideias3.com Link to comment Share on other sites More sharing options...
Gurzi Posted April 16, 2006 at 05:57 PM Report Share #22417 Posted April 16, 2006 at 05:57 PM continuo sem perceber o que é uma stream, usaste conteudos muito avançados que eu não apanhei nada 🙂 Link to comment Share on other sites More sharing options...
Recommended Posts