Jump to content
JoBlack

2 erros para descobrir!

Recommended Posts

JoBlack

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

} 

Share this post


Link to post
Share on other sites
Gurzi

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 ?

Share this post


Link to post
Share on other sites
Marino

Não sabia, obrigado por avisares.

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

Share this post


Link to post
Share on other sites
Gurzi

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

Share this post


Link to post
Share on other sites
j0mi

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

Share this post


Link to post
Share on other sites
pkyer

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


--Pkyer The One

Share this post


Link to post
Share on other sites
_Pedro_

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.  :)

Share this post


Link to post
Share on other sites
JoBlack

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

Ok, problem resolvido.

Obrigado neon_prannock   :)

Share this post


Link to post
Share on other sites
nunoxyz

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!


.·.·->EOF<-·.·.·.

Share this post


Link to post
Share on other sites
Gurzi

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

Share this post


Link to post
Share on other sites
motherFFH

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.

Share this post


Link to post
Share on other sites
Gurzi

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • 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.