• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoBlack

2 erros para descobrir!

18 mensagens neste tópico

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();

} 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sabia, obrigado por avisares.

A fuçao menup() retorna um inteiro, por isso pode escrever op=menup(); se  op for inteiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hmm porreiro mas como dentro da função menup() ele nao pos nenhum parametro :) fiquei apanhar do ar, mas ja entendi , muito obrigado :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para comparar strings usa-se o strcmp(string1,string2) e não string1==string2!!! É um erro grave  :eek:

Para alem disso, em vez de usares scanf("%s",var) usa antes gets(variavel) seguido de um fflush(stdin) para limpar o buffer.  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A variável b não é suposto ser uma 'char' para receber o caracter, e não um 'int' como declaraste?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ehh, como é que não reparei nisso!!! sou mesmo 'nabo'...

Ok, problem resolvido.

Obrigado neon_prannock   :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fflush(stdin); está errado. fflush() só se aplica a output streams.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 "";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, os dois problemas foram resolvidos e a dúvida esclarecida!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

continuo sem perceber o que é uma stream, usaste conteudos muito avançados que eu não apanhei nada :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Convidado
Este tópico está fechado a novas respostas.