Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

iCl4w

[Resolvido] Ver Se a Mesma Variável já foi digitada

Recommended Posts

Olá,

 

Estou com um problema a resolver... Estou a fazer um projeto e ele pede que o codigo digitado não possa ser digitado novamente...

 

Tentei usar do-while mas não deu! Acredito que o maior problema seja que nenhuma outra variável foi adicionada, então ele não tem ninguém pra comparar. Aí fica na mesma, pedindo os dados normalmente. O que posso fazer? O que vcs sugerem? Continuo com o do-while?

 

void cad_disciplina()
{
    int i, verigual;
    char codigodisc[50];

    system("cls");
    for(i=0; i<6; i++)
    {
        do {
            cout<<"Digite o Codigo: ";
            gets(codigodisc);
            verigual=(strcmp(total_disc.dcod_disc,codigodisc));
        }while(verigual==0);

        strcpy(total_disc.dcod_disc,codigodisc);
        cout<<"Digite a Disciplina: ";
        gets(total_disc.descr);
    }
    getche();
    main();
}

Aguardo qualquer ajuda e explicação...

 

Abçs...

Compartilhar este post


Link para o post
Compartilhar em outros sites

simplesmente dizer que "não deu" é muito vago.

Diga-nos o que se passa. O erro é na hora da compilação ou execução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na execução...

 

Eu digito várias vezes o mesmo código e ele aceita! O que devo fazer?

 

Pensei até em usar o try... Mas, acho que o problema é em ele não reconhecer uma variável inicial!

 

você, por exemplo, como faria pra comparar esse códigos usando estruturas?

 

Aguardo respostas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sua condição do loop "do {...} while" está errada.

Repare que você manda repetir ENQUANTO a variável "verigual" for igual a zero, se não for, saia do loop.

 

http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então qual seria o modo correto?

 

void cad_disciplina()
{
    int i, verigual;
    char codigodisc[50];

    system("cls");
    for(i=0; i<6; i++)
    {
        do {
            cout<<"Digite o Codigo: ";
            gets(codigodisc);
        }while(strcmp(total_disc[i].dcod_disc,codigodisc) !=0 );

        strcpy(total_disc[i].dcod_disc,codigodisc);
        cout<<"Digite a Disciplina: ";
        gets(total_disc[i].descr);
        cout<<"Digite a Carga Horaria: ";
        cin>>total_disc[i].carga_hor;
    }
    getche();
    main();
}

Agora é que está dando errado mesmo... Pois, o nome é pulado! Nossa, é difícil assim fazer isso! Kramba!

 

Que dificuldade...

 

Continuo aguardando ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só um exemplo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
const char *code = "password";
char userCode[50];

	do
	{
		printf("Type the pass: ");
		scanf("%49[^\n]%*c", userCode);
	} while (strcmp(code, userCode) != 0);
	
	printf("Well done, you made it!\n");
	return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

É diferente!

 

Pois char code já tem um "valor" determinado que é "password"... No meu caso não há nenhum valor inicial!

 

Assim, é digamos Fácil...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não há um valor inicial?

Então você quer comparar o que com o que em:

strcmp(total_disc[i].dcod_disc,codigodisc) !=0

O membro dcod_disc, da estrutura total_disc TEM que ter um valor!

Caso contrário, esssa comparação não faz muito sentido!

 

Se você explicar melhor o que você quer fica mais fácil.

eu espero que total_disc.dcod_disc seja um ponteiro para char, e que não seja NULL...

Compartilhar este post


Link para o post
Compartilhar em outros sites

1- Não use gets.

 

2- Você está usando cout, então é C++. Se é C++ porque você fica se matando com array de char quando existe a classe string?

 

3- Evite usar system.

 

4- O que é aquele main feio perdido no final da função?

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 - Então o que devo usar?

 

2 - O uso de string elimina colocar array assim:

 

C

char nome[50];

C++

string nome;

Correto?

 

Se vou usar string, que função uso para lê-la e compará-la com strcmp?

 

Observe: O código da disciplina não pode ser igual, certo?

 

Então, veja o código:

struct aluno
{
string nome;
string disciplina; //Correto, não?
};

void cad()
{
string code;

cout<<"Digite o Codigo: ";
cin>>code;
if (strcmp(total_disc.codigo,code)==0))
for(i=0;i<10;i++)
{
...

Ok! Mas, e você, o que faria pra comparar esses códigos? Desse jeito vai continuar dando erro, pelo menos acredito!

 

3 - Se não usar system("cls") que função devo usar? A função clrscr(); não roda no Code::Blocks nem no Dev-C++!

 

4 - o "main() feio", é o que usei para ele voltar à função principal! É tão estranho assim, fazer isso?

 

Aguardando novas respostas...

E agradeço a ajuda...

Abçs...

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 - Então o que devo usar?

 

Procure no fórum. O tópico é grande e eu não vou reescrever tudo aqui.

 

2 - O uso de string elimina colocar array assim:

 

C

char nome[50];

C++

string nome;

Correto?

 

Se vou usar string, que função uso para lê-la e compará-la com strcmp?

 

http://www.google.com.br/search?q=C%2B%2B+string&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pt-BR:official&client=firefox-a

 

 

3 - Se não usar system("cls") que função devo usar? A função clrscr(); não roda no Code::Blocks nem no Dev-C++!

 

O clear screen é algo que depende do tipo do terminal.

http://www.cplusplus.com/forum/articles/9678/

http://www.cplusplus.com/forum/articles/10515/

 

4 - o "main() feio", é o que usei para ele voltar à função principal! É tão estranho assim, fazer isso?

 

Não se faz isso. É porco e causa estouro de pilha

O que acontece quando uma função é chamada é que um espaço é criado na pilha e lá são colocados o endereço de onde partiu a chamada, os argumentos da função e mais alguns ponteiros ($ebp, $sp - dependendo do tipo da arquitetura). No retorno de uma função, os arugmentos são empilhados e o endereço de origem da chamada é salvo num registrador e uma instrução ret é executada. É isso que faz a função voltar ao ponto de chamada.

Alguns loops infinitos e chamadas cruzadas de função e você acaba com a memória disponível do pc e tenta escrever em espaço protegido pelo SO. E depois vem postar perguntando porque o programa fecha na cara.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado...

 

Mas, enfim, desculpa porque EM 7 POSTS, eu AINDA não descobri uma maneira de comparar as strings em uma Estrutura!

 

Meu problema ainda NÃO foi resolvido, e eu ganhei um monte de dúvidas pra pesquisar(isso não é uma reclamação, pelo contrário!).

 

Eu CONTINUO aguardando uma solução!

 

Ainda tenho esperança, porque, afinal, esse é um dos melhores fóruns de programação que conheço.

 

Abçs...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já te dei uma solução, mas pelo visto você não clicou no link e não viu o primeiro resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu resolvi passar todo o código para C.

 

Como iniciante, eu percebi tarde demais que as mudanças do C para C++ não são pequenas... No inicio, eu até achei que a diferença estava no cout e cin! Grande professor que tenho! Mas, estou me esforçando... Irei me dedicar ao C, e depois estudar C++... É o melhor que faço... E agradeço muito a ajuda de vocês...

 

_Isis_ gostaria de informar que os livros que você me indicou tem versões traduzidas...

C++ A Linguagem de Programação

C++ Absoluto do Savitch [Ótimo]

 

Grande dica! Os livros são ótimos! O do savitch então... do intermediário a avançado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

strcpy(not_f,tot_m[i].nota_f_um);
strcpy(carg_h,tot_d[i].carga_h);
strcpy(tot_f,tot_m[i].total_f_um);
calc_carg=(0.25 * carg_h);
if (not_f<7 && tot_f > calc_carg)
printf("O Aluno foi Reprovado na Disciplina!");
else printf("O Aluno foi Aprovado na Disciplina!");
printf("\n");

As variáveis são char... Logo não podem ser colocadas nas operações... Logo, o que DEVO fazer para informar se a nota final for maior que 7 e que o total de faltas seja 25% da carga horária?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei que existem versões traduzidas, mas nunca leio livro de programação traduzido porque revisão é feita, normalmente, por quem não é da área. E as traduções ficam extremamente porcas.

Compre o livro Groovy em Ação e peça seu dinheiro de volta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.