Ir ao conteúdo
  • Cadastre-se

C Trabalho : Criando um cofre virtual em linguagem C


Duarte2020

Posts recomendados

Amigos boa tarde, eu não entendo muito de programação não, estou começando agora, estou com esse trabalho para entregar, só que não estou conseguindo retornar ao início quando erro uma senha, para começar tudo de novo , só estou precisando jeitar Isso, vcs podem me explicar detalhadamente,  ficarei grato, um abraço a todos. 

 

Trabalho:

 

#include <stdio.h>
#include<stdlib.h>
#include <math.h>
#include <locale.h> //biblioteca que permite usar acentos 
//  1991757-5  - Meu RA 
//   01 99 17 57 50 - Meu RA Convertido em Dezenas 

float a1,a2, a3, a4,a5;  //define a quantidades de números a serem digitados 


void primeiro(){
  printf ("Digite o primeiro número: \n\n"); //pede para que o usuário digite a senha 
  scanf ("%f",&a1); //lê o número que foi digitado


  while (a1!=01) //enquanto o usuário errar o número  esse bloco será executado
  {

      printf("Você digitou um número incorreto\n\n"); 
          system("color CF");
      printf ("Tente novamente\n\n");
      scanf("%f",&a1);  
  }

  if (a1==01)  // se o usuário acertar o número esse bloco será executado 
  {
    printf("Você passou pela primeira etapa,continue\n\n");
    system("color 2A");
  }

}


void segundo(){
  printf ("Digite o segundo número: \n\n"); // pede para que o usuário digite a senha 
  scanf ("%f",&a2);//lê o número que foi digitado


  while (a2!=99) //enquanto o usuário errar o número  esse bloco será executado
  {
    system("color CF");    

    printf("Você digitou um número incorreto : \n\n"); 
    printf ("Tente novamente\n\n");
    if(a2!=99){
      primeiro();
    }else{
      scanf("%f",&a2);
    }
    
  }


  if (a2==99) // se o usuário acertar o número esse bloco será executado
  {
    printf("Você passou pela primeira etapa,continue !\n\n");
    system("color 2A");
  }

}


void terceiro(){
    printf ("Digite o terceiro número : \n\n"); // pede para que o usuário digite a senha 
  scanf ("%f",&a3);//lê o número que foi digitado

  while (a3!=17)  //enquanto o usuário errar o número  esse bloco será executado
  {

    printf("Você digitou um número incorreto ! \n\n"); 
      system("color CF");
    printf ("Tente novamente : \n\n");
    if(a3!=17){
      primeiro();
    }else{
      scanf("%f",&a3);
    }
    
  }

  if (a3==17)  // se o usuário acertar o número esse bloco será executado
  {
    printf("Você passou pela terceira etapa,continue ! \n\n");
      system("color 2A");
  }

}


void quarto(){
      printf ("Digite o quarto número : \n\n"); // pede para que o usuário digite a senha 
    scanf ("%f", &a4);//lê o número que foi digitado

    while (a4!=57) //enquanto o usuário errar o número  esse bloco será executado
    {

      printf("Você digitou um número incorreto ! \n\n"); 
        system("color CF");
      printf ("Tente novamente : \n\n");
      if(a4!=57){
        primeiro();
      }else{
        scanf("%f",&a4);
      }
    } 

    if (a4==57) //se  o usuário digitar o número correto esse bloco será executado
    {
      
      printf("Você passou pela quarta etapa,continue ! \n\n");
        system("color 2A ");
    }
}


void quinto(){
    printf ("Digite o quinto número: \n\n"); // pede para que o usuário digite a senha 
  scanf ("%f",&a5);//lê o número que foi digitado

  while (a5!=50) //enquanto o usuário errar o número  esse bloco será executado
  {

    printf("Você digitou um número incorreto ! \n\n"); 
      system("color CF");
    printf ("Tente novamente :  \n\n");
    if(a5!=50){
      primeiro();
    }else{
      scanf("%f",&a5);
    }
  }

  if  (a5==50)  // se o usuário acertar o número esse bloco será executado
  {
    printf("Você passou pela quinta etapa! \n\n");
      system("color 2A");
  }

}

int main ()

{
    setlocale (LC_ALL, "portuguese"); //define a localidade  

    primeiro();
    segundo();
    terceiro();
    quarto();
    quinto();
    
    
    
    if  (a1==01  &&a2==99  &&a3==17 &&a4==57 &&a5==50)
    
    
    {
      
      printf("PORTA LIBERADA , ENTRE ! \n\n");
      system("color 2A");
    }

    return '\0';

}

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Não sei se é um requisito do sistema, mas a sua lógica está desnecessariamente complicada para implementar a funcionalidade do cofre. Um cofre comum não pede que a pessoa digite novamente a senha se um grupo de números estiver errado. Poderia ter usado somente uma linha com `scanf()` para capturar todos os números separados por espaço e permitir o acesso se e somente se todos corresponderem aos valores esperados, por exemplo. Para facilitar a leitura e a edição do código poderia colocar os valores esperados em macros:

 

#define A1 (10)
#define A2 (15)
#define A3 (4)
#define A4 (98)


Há um problema grave no seu código: não se compara número com ponto flutuante usando `==` e muito menos se compara `float` com inteiros ou `doubles` literais. Para o seu código, o uso de ponto flutuante também não faz sentido pois está guardando apenas inteiros. Acredito também que o `locale` correto a usar seja `pt_BR.utf8`, padrão em um GNU/Linux com suporte a português brasileiro, mas isso depende do sistema.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Seu programa não está bom.

 

Notou que a diferença entre cada etapa é o número alvo e a ordem dela? Programou 5 funções e não esta única etapa?

 

Para voltar a ler precisa de um loop e não escreveu um. E sabe como orque escreveu outros nas funções...

 

Você tem um livro? Qual é? Sua escola não assina uma biblioteca virtual que você possa usar?
Sabe o que é um vetor? Algo como

    int Numeros[15]; // sim, 15 numeros inteiros, de Numero[0] a Numero[14]

 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

Caro Arfneto, me desculpa se eu fui grosseiro nas palavras ou no meu trabalho, Eu não estou aqui para receber críticas, Mais sim para receber apoio de pessoas no qual deseja ajudar alguém, eu fui bem claro quando falei que eu não sabia programar, estou começando agora, e está sendo muito difícil para mim, não sou um garoto de 17 anos  mais sim um senhor com 50 anos, desejando vencer uma batalha do qual está sendo muito difícil para mim, mais com força graças Deus só falta um ano para eu terminar, más mesmo assim fico grato pela sua ajuda, abraços 

adicionado 15 minutos depois
4 horas atrás, Davi Silva Santos disse:

Não sei se é um requisito do sistema, mas a sua lógica está desnecessariamente complicada para implementar a funcionalidade do cofre. Um cofre comum não pede que a pessoa digite novamente a senha se um grupo de números estiver errado. Poderia ter usado somente uma linha com `scanf()` para capturar todos os números separados por espaço e permitir o acesso se e somente se todos corresponderem aos valores esperados, por exemplo. Para facilitar a leitura e a edição do código poderia colocar os valores esperados em macros:

 


#define A1 (10)
#define A2 (15)
#define A3 (4)
#define A4 (98)


Há um problema grave no seu código: não se compara número com ponto flutuante usando `==` e muito menos se compara `float` com inteiros ou `doubles` literais. Para o seu código, o uso de ponto flutuante também não faz sentido pois está guardando apenas inteiros. Acredito também que o `locale` correto a usar seja `pt_BR.utf8`, padrão em um GNU/Linux com suporte a português brasileiro, mas isso depende do sistema.

Davi como eu disse, não entendo de programação , será que você poderia me ajudar amigo?

Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Duarte2020 disse:

Eu não estou aqui para receber críticas, Mais sim para receber apoio de pessoas no qual deseja ajudar alguém, eu fui bem claro quando falei que eu não sabia programar, estou começando agora, e está sendo muito difícil para mim, não sou um garoto de 17 anos  mais sim um senhor com 50 anos, desejando vencer uma batalha do qual está sendo muito difícil para mim, mais com força graças Deus só falta um ano para eu terminar, más mesmo assim fico grato pela sua ajuda

 

Você entendeu o que te expliquei? Levou a sério? Achou ofensivo o fato de eu dizer que seu programa não está bom E te dizer porque?

 

Eu por outro lado sou um senhor de 60 anos ajudando gratuitamente pessoas de qualquer idade com sugestões simples ou talvez sofisticadas dependendo da formação de cada um e do tipo de dúvida. 

 

Escrevo aqui desde o ano passado e já postei ao que diz aqui em torno de 1600 tópicos em uma ampla gama de assuntos relacionados. E centenas de programas. Sou --- ou deveria ser --- um especialista nessas coisas. Escrevo de graça e não vejo nada demais em dizer que um programa está ruim. Não se trata de diminuir o aluno ou meu funcionário ou nada disso.

 

Se entendeu o que eu te expliquei sua observação não foi bem colocada, eu acho. Poderia ter perguntado simplesmente algo como: "como eu faria para melhorar essas funções considerando suas observações, @arfneto

 

E eu teria te dito. Em geral eu programo uma solução curta e apenas algumas vezes eu posto, porque

  • os autores das questões desaparecem porque provavelmente encontraram solução por conta própria ou em outra fonte
  • os autores das questões às vezes parecem buscar apenas uma resposta pronta e não tem sequer paciência para ler explicações ou responder perguntas
  • o tópico virou discussão ideológica
  • eu tenho mais o que fazer na ocasião

Quando tento aprender algo --- e isso acontece toda hora --- costumo ter uma aproximação bem humilde em relação aos temas, e fico feliz se alguém tenta me ajudar e diz que o que fiz não está bom. Economiza o meu tempo.

 

Por outro lado, se entendeu o que eu disse então não eu acho que não deveria ter dito o que disse.

 

De volta a seu programa se ainda precisar de ajuda
 

Para você ver como pode ser diferente, eis uma função que faz o seu serviço

    int fase(int etapa, int alvo);

Você diz o número que espera ler e a etapa e pronto. Espero que entenda a diferença e entenda porque seu programa não está bom. Pode chamar assim a tal função:

	fase(1, 1);
	fase(2, 99);
	fase(3, 17);
	fase(4, 57);
	fase(5, 50);
	printf("\nPORTA LIBERADA!\n\n");

E ter o mesmo resultado de seu programa --- quando ele funcionar. Só que é muito mais compacto e fácil de entender do modo como te mostrei agora.

 

Veja um possível código para isso:

int fase(int etapa, int alvo)
{
	int numero = 0;

	printf("[Etapa %d de 5] Digite o numero: ", etapa);
	scanf("%d", &numero);

	while (numero != alvo)
	{
		printf("\nVoce digitou um numero incorreto!\n");
		printf("Tente novamente\n\n");
		printf("[Etapa %d de 5] Digite o numero: ", etapa);
		scanf("%d", &numero);
	};

	printf("voce passou pela etapa %d! Continue...\n\n", etapa);
	return alvo; // tanto faz
};

Pois é, umas 10 linhas

 

Como seria rodando num programa?
 

Algo assim

[Etapa 1 de 5] Digite o numero: 1
voce passou pela etapa 1! Continue...

[Etapa 2 de 5] Digite o numero: 17

voce digitou um numero incorreto!
Tente novamente

[Etapa 2 de 5] Digite o numero: 99
voce passou pela etapa 2! Continue...

[Etapa 3 de 5] Digite o numero: 17
voce passou pela etapa 3! Continue...

[Etapa 4 de 5] Digite o numero: 57
voce passou pela etapa 4! Continue...

[Etapa 5 de 5] Digite o numero: 51

voce digitou um numero incorreto!
Tente novamente

[Etapa 5 de 5] Digite o numero: 49

voce digitou um numero incorreto!
Tente novamente

[Etapa 5 de 5] Digite o numero: 50
voce passou pela etapa 5! Continue...


PORTA LIBERADA!

E como seria um programa que chama essa coisa?

int main()
{
	fase(1, 1);
	fase(2, 99);
	fase(3, 17);
	fase(4, 57);
	fase(5, 50);
	printf("\nPORTA LIBERADA!\n\n");
	return;
};

Mais legível, não é? Apenas as 5 fases, com números constantes, e os números alvo fornecidos na chamada.

Espero que te ajude a entender.

 

Eis o programa todo se quiser testar

#include "stdio.h"
int fase(int etapa, int alvo);

int main()
{
	fase(1, 1);
	fase(2, 99);
	fase(3, 17);
	fase(4, 57);
	fase(5, 50);
	printf("\nPORTA LIBERADA!\n\n");
	return;
};

int fase(int etapa, int alvo)
{
	int numero = 0;

	printf("[Etapa %d de 5] Digite o numero: ", etapa);
	scanf("%d", &numero);

	while (numero != alvo)
	{
		printf("\nVoce digitou um numero incorreto!\n");
		printf("Tente novamente\n\n");
		printf("[Etapa %d de 5] Digite o numero: ", etapa);
		scanf("%d", &numero);
	};

	printf("voce passou pela etapa %d! Continue...\n\n", etapa);
	return alvo; // tanto faz
};

Tem umas 20 linhas de código apenas

 

37 minutos atrás, Duarte2020 disse:

desejando vencer uma batalha do qual está sendo muito difícil para mim, mais com força graças Deus só falta um ano para eu terminar, más mesmo assim fico grato pela sua ajuda, abraços

 

Espero que vença sua batalha. Quanto ao "mesmo assim fico grato pela sua ajuda" não gostei do tom. Talvez deva ver o aprendizado com mais humildade. Minha opinião apenas. Esse é um forum de C, C++ e C# não de procedimentos sociais afinal. O forum é moderado e tem um botão para se queixar se achar que é o caso.

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto Gostaria de te parabenizar pela ajuda. Eu também estava um pouco perdido nessa matéria e sua explicação foi pontual em tirar as minhas dúvidas .Acredito que todos nós estamos aqui para nos ajudar e o senhor tem feito um papel bem legal ajudando o pessoal aqui ,até fiz um cadastro só para vir aqui e te agradecer a explicação e ajuda .Muito Obrigado .

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@Duarte2020 🤔

Sem o enunciado (formal) não digo com certeza se podemos usar float ou qualquer outro tipo não char!

Essas variáveis em sequência a1...a5 também me encomendam, um vetor é bem mais natural.

 

Coloque o enunciado formal, bem como, quais assuntos assistiu antes de se aventurar nessa questão.

Link para o comentário
Compartilhar em outros sites

 

Amigo muito show o que você fez muito prático, tenho uma dúvida que é : Por exemplo o usuario acertou a primeira senha e a segunda na terceira ele erra e aparece a senha incorreta, como fazer para que volte tudo do comeco, para que o cofre so abra se a senha for digitada na sequência exata se errar uma única vez tem que fazer novamente. Grato pela atenção e obrigado.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Tem um loop dentro da função que fica insistindo até o cara acertar cada senha. O que pode fazer por exemplo é mudar para retornar assim que ele digitar, retornando por exemplo 0 se o cara errou a senha, e no programa principal pegar as senhas na sequência como antes, mas dentro de um loop, algo assim como

int main()
{
	int tentativas = 3;
	int senhas = 5;
	int ok = 0;
	const int senha[5] = { 1, 99, 17, 57, 50 };

	// vai ter 'x' tentativas de acertar as 'y' senhas
	for (int t = 0; t < tentativas; t = t + 1)
	{   
		ok = 0;
		printf("\nTentativa %d de %d\n\n", 1 + t, tentativas);
		for (int f = 0; f < senhas; f = f + 1)
		{	// se o cara errou tenta ate 'tentativas'
			if (fase(f, senha[f]) == 0) break;
			ok = ok + 1; // passou mais uma
		};
		if (ok != senhas) continue; // outra tentativa

		printf("\nPORTA LIBERADA!\n\n");
		return 0;
	};
	printf("\nTente outra vez. Encerrando!...\n\n");
	return 0;
};

Nesse exemplo ele poderia tentar 3 vezes. 'ok' soma um pra cada senha certa. a variável 'senhas' tem o total de senhas então é só comparar. Agora a função fica sem aquele loop, certo?

int fase(int etapa, int alvo)
{
	int numero = -1;

	printf("[Etapa %d de 5] Digite o numero: ", 1+etapa);
	scanf("%d", &numero);

	/*while (numero != alvo)
	{
		printf("\nVoce digitou um numero incorreto!\n");
		printf("Tente novamente\n\n");
		printf("[Etapa %d de 5] Digite o numero: ", etapa);
		scanf("%d", &numero);
	};*/
	if (numero != alvo) return 0;
	printf("voce passou pela etapa %d! Continue...\n\n", 1+etapa);
	return 1; 
};

deixando como comentário o que tinha antes: retorna 0 se o cara errou ou o alvo se ele acertou.

 

Rodando seria algo assim

Tentativa 1 de 3

[Etapa 1 de 5] Digite o numero: 1
voce passou pela etapa 1! Continue...

[Etapa 2 de 5] Digite o numero: 12112

Tentativa 2 de 3

[Etapa 1 de 5] Digite o numero: 1
voce passou pela etapa 1! Continue...

[Etapa 2 de 5] Digite o numero: 99
voce passou pela etapa 2! Continue...

[Etapa 3 de 5] Digite o numero: 17
voce passou pela etapa 3! Continue...

[Etapa 4 de 5] Digite o numero: 57
voce passou pela etapa 4! Continue...

[Etapa 5 de 5] Digite o numero: 50
voce passou pela etapa 5! Continue...


PORTA LIBERADA!

Claro que há muitas maneiras de fazer isso, mas assim da pra rodar. Talvez pudesse dar umas chances dentro da fase() pro cara tentar umas vezes cada senha ao invés de uma só, ou não?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 20/06/2020 às 00:10, arfneto disse:

Tem um loop dentro da função que fica insistindo até o cara acertar cada senha. O que pode fazer por exemplo é mudar para retornar assim que ele digitar, retornando por exemplo 0 se o cara errou a senha, e no programa principal pegar as senhas na sequência como antes, mas dentro de um loop, algo assim como


int main()
{
	int tentativas = 3;
	int senhas = 5;
	int ok = 0;
	const int senha[5] = { 1, 99, 17, 57, 50 };

	// vai ter 'x' tentativas de acertar as 'y' senhas
	for (int t = 0; t < tentativas; t = t + 1)
	{   
		ok = 0;
		printf("\nTentativa %d de %d\n\n", 1 + t, tentativas);
		for (int f = 0; f < senhas; f = f + 1)
		{	// se o cara errou tenta ate 'tentativas'
			if (fase(f, senha[f]) == 0) break;
			ok = ok + 1; // passou mais uma
		};
		if (ok != senhas) continue; // outra tentativa

		printf("\nPORTA LIBERADA!\n\n");
		return 0;
	};
	printf("\nTente outra vez. Encerrando!...\n\n");
	return 0;
};

Nesse exemplo ele poderia tentar 3 vezes. 'ok' soma um pra cada senha certa. a variável 'senhas' tem o total de senhas então é só comparar. Agora a função fica sem aquele loop, certo?


int fase(int etapa, int alvo)
{
	int numero = -1;

	printf("[Etapa %d de 5] Digite o numero: ", 1+etapa);
	scanf("%d", &numero);

	/*while (numero != alvo)
	{
		printf("\nVoce digitou um numero incorreto!\n");
		printf("Tente novamente\n\n");
		printf("[Etapa %d de 5] Digite o numero: ", etapa);
		scanf("%d", &numero);
	};*/
	if (numero != alvo) return 0;
	printf("voce passou pela etapa %d! Continue...\n\n", 1+etapa);
	return 1; 
};

deixando como comentário o que tinha antes: retorna 0 se o cara errou ou o alvo se ele acertou.

 

Rodando seria algo assim


Tentativa 1 de 3

[Etapa 1 de 5] Digite o numero: 1
voce passou pela etapa 1! Continue...

[Etapa 2 de 5] Digite o numero: 12112

Tentativa 2 de 3

[Etapa 1 de 5] Digite o numero: 1
voce passou pela etapa 1! Continue...

[Etapa 2 de 5] Digite o numero: 99
voce passou pela etapa 2! Continue...

[Etapa 3 de 5] Digite o numero: 17
voce passou pela etapa 3! Continue...

[Etapa 4 de 5] Digite o numero: 57
voce passou pela etapa 4! Continue...

[Etapa 5 de 5] Digite o numero: 50
voce passou pela etapa 5! Continue...


PORTA LIBERADA!

Claro que há muitas maneiras de fazer isso, mas assim da pra rodar. Talvez pudesse dar umas chances dentro da fase() pro cara tentar umas vezes cada senha ao invés de uma só, ou não?

 

Bom dia, sou iniciante e estava tentando utilizar o exemplo que você disponibilizou, porém, estou com o seguinte problema, minha etapa ja esta começando a partir da etapa 2, exemplo: etapa 2 de 5. Sabe se coloquei algo errado? E também esta ocorrendo de quando eu erro acerto, por exemplo, a primeira etapa, a segunda, e em seguida erro a terceira, na tela aparece para começar a etapa 2 novamente, porém se eu digito a senha da 3 etapa, o sistema esta aceitando normalmente. olha o print, por gentileza.

Segue o código que estou usando:

 

#include <stdio.h>
int fase(int etapa, int alvo);

int main()
{
    fase(1, 01);
    fase(2, 91);
    fase(3, 29);
    fase(4, 75);
    fase(5, 55);
    printf("\nTRANCA LIBERADA, ABRA A PORTA!\n\n");
    return;
};

int fase(int etapa, int alvo)
{
    int numero = -1;

    printf("[Etapa %d de 5] Digite o numero: ", 1+etapa);
    scanf("%d", &numero);

    while (numero != alvo)
    {
        printf("\nVoce digitou um numero incorreto!\n");
        printf("Tente novamente\n\n");
        printf("[Etapa %d de 5] Digite o numero: ", etapa);
        scanf("%d", &numero);
    };
    if (numero != alvo) return 0;
    printf("voce passou pela etapa %d! Continue...\n\n", 1+etapa);
    return 1; 
};

 

 

 

 

 

Desde já, agradeço a atenção.

exemplo-tela.png

Link para o comentário
Compartilhar em outros sites

parece que você misturou os exemplos...

 

image.png.8d725f2786428d3aef0d396414a40368.png

 

Se as etapas em main() vão de 1 a 5 não deve somar 1 no prompt de leitura 

Esse exemplo de fase só retornava quando o cara acertava.

Um usuário perguntou se tinha como voltar pro início se o cara errasse uma das 5 senhas e aí tem outro exemplo. E nesse caso fase retornava zero ou um conforme a senha estivesse certa... Acompanhe o tópico desde o início e acho que vai entender

 

Cada exemplo um tem uma função fase uma função main() de acordo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Davi Silva Santos ". Um cofre comum não pede que a pessoa digite novamente a senha se um grupo de números estiver errado. "

 Mas o enunciado pede para fazer exatamente isso. 

 

""Foi solicitado a você que elabore um código em linguagem C que simule uma tranca de abertura de cofre onde os dígitos de seu RA (registro acadêmico de 9 ou 10 dígitos), de forma que sejam formados pares de dezenas para simular o número correto de cada etapa da tranca, ou seja, num RA fictício 19236798-5, converta para 01-92-36-79-85 para RAs com 9 dígitos ou sem acrescentar o 0 no caso de RAs com 10 dígitos.

Estes números devem ser os segredos que vão liberando a tranca etapa por etapa, sendo que a cada erro, reinicia-se a tranca e o usuário necessíta reiniciar a inserção dos números novamente, desde a primeira etapa, como no mecanismo de abertura de cofres mesmo.
Em caso do usuário não acertar as 5 dezenas, o processo é repetido infinitamente, como uma tranca normal, mas caso o usuário acerte os cinco números em sequência, uma mensagem deve ser exibida informando que a porta foi aberta.""

 

adicionado 19 minutos depois

@carlos.bozza Tentei o exemplo dele aqui, e sequer executa. nem copila. Aparece o seguinte erro: " [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode"

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, charles95 disse:

@carlos.bozza Tentei o exemplo dele aqui, e sequer executa. nem copila. Aparece o seguinte erro: " [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

 

Talvez não tenha lido a mensagem antes de copiar aqui...

 

1 hora atrás, charles95 disse:

e sequer executa. nem copila

 

primeiro teria que compilar. Aí gerar um executável que você pode por exemplo levar para outra máquina e executar lá

 

1 hora atrás, charles95 disse:

[Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

 

Pois é. Você postou essa mensagem em 2020. 1999 passou todinho. 2011 também. E você está usando um IDE configurado para a versão de C de 1998, algo como 22 anos atrás.

 

Deve haver um bom número de razões para você usar versões mais modernas de C ou C++, liberadas nos últimos 22 anos. E um IDE mais moderno talvez.

 

Seu IDE não mostrou também a clássica mensagem 
 

Citação

use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code

 

também, dizendo exatamente o que você deve fazer? Não tem uma versão em português?

 

Apenas inclua exatamente o que está escrito aí, nas opções do compilador: -std=gnu11 por exemplo

  • Haha 1
Link para o comentário
Compartilhar em outros sites

5 horas atrás, charles95 disse:

""Foi solicitado a você que elabore um código em linguagem C que simule uma tranca de abertura de cofre onde os dígitos de seu RA (registro acadêmico de 9 ou 10 dígitos), de forma que sejam formados pares de dezenas para simular o número correto de cada etapa da tranca, ou seja, num RA fictício 19236798-5, converta para 01-92-36-79-85 para RAs com 9 dígitos ou sem acrescentar o 0 no caso de RAs com 10 dígitos.

Estes números devem ser os segredos que vão liberando a tranca etapa por etapa, sendo que a cada erro, reinicia-se a tranca e o usuário necessíta reiniciar a inserção dos números novamente, desde a primeira etapa, como no mecanismo de abertura de cofres mesmo.
Em caso do usuário não acertar as 5 dezenas, o processo é repetido infinitamente, como uma tranca normal, mas caso o usuário acerte os cinco números em sequência, uma mensagem deve ser exibida informando que a porta foi aberta.""

Ah! Então é isso, Obrigado. Perguntei ao autor do tópico, porém fui ignorado ou não.

 

Em 16/06/2020 às 12:01, arfneto disse:

Seu programa não está bom.

Dizer coisas assim quase sempre não é ajuda, e na primeira linha, logo de cara parece grosseria.

 

Link para o comentário
Compartilhar em outros sites

29 minutos atrás, charles95 disse:

Pior é que eu nem lembro mais onde baixei isso, não sei se foi no site oficial. 

Como configura isso para a versão mais recente?

 

Provavelmente baixou depois de 2011, certo? :D apenas faça como está escrito na mensagem. Nas opções do compilador acrescente aquele parâmetro

use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code

 

39 minutos atrás, Mauro Britivaldo disse:

Dizer coisas assim quase sempre não é ajuda, e na primeira linha, logo de cara parece grosseria

 

O forum é moderado. Você e/ou o autor podem se queixar usando o botão "denunciar". Recomendo ler o que postei no tópico #5


e quem sabe perceber até onde eu fui para ajudar o autor, mesmo depois da resposta dele e que tem o tom da sua. Eu postei várias opções de como resolver o problema. Expliquei em português, com detalhes. Mostrei programas, opções e resultados.

 

Vou reproduzir um pedaço do parágrafo inicial apenas

  

Em 16/06/2020 às 16:43, arfneto disse:

Você entendeu o que te expliquei? Levou a sério? Achou ofensivo o fato de eu dizer que seu programa não está bom E te dizer porque?

 

Eu por outro lado sou um senhor de 60 anos ajudando gratuitamente pessoas de qualquer idade com sugestões simples ou talvez sofisticadas dependendo da formação de cada um e do tipo de dúvida. 

 

Escrevo aqui desde o ano passado e já postei ao que diz aqui em torno de 1600 tópicos em uma ampla gama de assuntos relacionados. E centenas de programas. Sou --- ou deveria ser --- um especialista nessas coisas. Escrevo de graça e não vejo nada demais em dizer que um programa está ruim. Não se trata de diminuir o aluno ou meu funcionário ou nada disso.

 

Se entendeu o que eu te expliquei sua observação não foi bem colocada, eu acho. Poderia ter perguntado simplesmente algo como: "como eu faria para melhorar essas funções considerando suas observações, @arfneto

 

E eu teria te dito. Em geral eu programo uma solução curta e apenas algumas vezes eu posto, porque

  • os autores das questões desaparecem porque provavelmente encontraram solução por conta própria ou em outra fonte
  • os autores das questões às vezes parecem buscar apenas uma resposta pronta e não tem sequer paciência para ler explicações ou responder perguntas
  • o tópico virou discussão ideológica
  • eu tenho mais o que fazer na ocasião

Quando tento aprender algo --- e isso acontece toda hora --- costumo ter uma aproximação bem humilde em relação aos temas, e fico feliz se alguém tenta me ajudar e diz que o que fiz não está bom. Economiza o meu tempo

 

Acho que leu o que o autor escreveu :D
 

Em 16/06/2020 às 15:57, Duarte2020 disse:

Eu não estou aqui para receber críticas, Mais sim para receber apoio de pessoas no qual deseja ajudar alguém, eu fui bem claro quando falei que eu não sabia programar, estou começando agora, e está sendo muito difícil para mim, não sou um garoto de 17 anos  mais sim um senhor com 50 anos, desejando vencer uma batalha do qual está sendo muito difícil para mim, mais com força graças Deus só falta um ano para eu terminar, más mesmo assim fico grato pela sua ajuda

 

Outros leitores não tem a mesma ideia. Veja o tópico seguinte 
 

Em 18/06/2020 às 14:48, Maicon Maia disse:

@arfneto Gostaria de te parabenizar pela ajuda. Eu também estava um pouco perdido nessa matéria e sua explicação foi pontual em tirar as minhas dúvidas .Acredito que todos nós estamos aqui para nos ajudar e o senhor tem feito um papel bem legal ajudando o pessoal aqui ,até fiz um cadastro só para vir aqui e te agradecer a explicação e ajuda .Muito Obrigado .


@Mauro Britivaldo sugiro atentar para todo o conteúdo que eu postei nesse tópico, mesmo apesar de eu em particular ter achado grosseira a reação do autor e recomendar a todos uma certa humildade quando se está prendendo. Eu de fato julguei o programa ruim e tenho dito isso para muitos programas. Eu estou trancado em um escritório com vários computadores há semanas e tenho tido tempo para escrever em vários forums, voluntariamente.  E tenho aprendido umas coisas de gente que diz que MEU programa está ruim. E eu agradeço de boa. Porque economiza meu tempo sempre que acontece


 

Link para o comentário
Compartilhar em outros sites

@arfneto Não posso fazer nada, foi a impressão que ficou. Ainda bem que há muitos que reconhecem sua postura corretamente, além de você mesmo claro.

 

19 minutos atrás, arfneto disse:

Eu de fato julguei o programa ruim e tenho dito isso para muitos programas.

O senso comum diz que um "programa ruim" é um programa que não funciona, e como a maioria procura o clube com programas ruins esse é o fato mais obvio. Não dizer pode pelo menos evitar conflitos.

 

Só isso.

 

 

Link para o comentário
Compartilhar em outros sites

59 minutos atrás, Mauro Britivaldo disse:

Não posso fazer nada, foi a impressão que ficou. Ainda bem que há muitos que reconhecem sua postura corretamente, além de você mesmo claro


Não tenho a pretensão de julgar minha própria postura.  Esse é um forum de C, C# e C++, e tomo a liberdade de julgar essas coisas aqui, C, C++ e C# e técnicas associadas, estruturas de dados, sistemas operacionais, protocolos de comunicação e coisas assim. Se algo em relação à postura aqui de alguém me incomoda eu posso escrever algo no post, como fiz aqui com esse tópico. Ou posso escrever para o usuário, como também já fiz. Ou me queixar aos moderadores. Nada que envolva muito tempo ou pensar muito. Ou posso ser alvo dessas coisas, claro.


Exemplo

Tempos atrás durante uma folclórica discussão sobre o que seriam  arquivos csv --- Um formato de intercâmbio consagrado há décadas e incorporado a produtos como Oracle DB, Excel, MySQL, Google Sheets, Lotus 123 e VisiCalc e todos os programas de mala direta do planeta ---  um usuário, ao mostrar sua distinta convicção sobre esse assunto, me dirigiu uma mensagem dessas que julguei exagerada. Eu me queixei aos moderadores e a mensagem foi removida em como 15 minutos. Curiosamente era uma mensagem sua para mim @Mauro Britivaldo desfazendo de algo técnico que eu havia escrito e terminado por  algo como "só rindo mesmo". 

 

1 hora atrás, Mauro Britivaldo disse:

O senso comum diz que um "programa ruim" é um programa que não funciona, e como a maioria procura o clube com programas ruins esse é o fato mais obvio. Não dizer pode pelo menos evitar conflitos

 

Não sei julgar o que é senso comum. Descartes, o filósofo,  escreveu na abertura do Discurso sobre o Método: 
 

Citação

"O bom senso é a coisa do mundo melhor distribuída, porque mesmo aqueles mais difíceis de contentar em todas as outras coisas não costumam aspirar a mais do que tem" 


Programas que funcionam também são às vezes ruins. Programas bem escritos por vezes não funcionam. Muitas vezes vemos programas bem escritos aqui --- a bem da verdade muitos podem ter sido copiados --- e que não funcionam. Já estive dos dois lados, escrevendo programas que acabaram ruins para substituir programas bem escritos e vice-versa.

 

Como eu disse, recomendo humildade ao receber críticas que sequer são pessoais, em especial para quem está aprendendo ou expondo uma dúvida. Ouvir que algo não está bom --- e ler uma explicação grátis e voluntária logo a seguir de porque não está bom --- não  devia ser uma situação conflitante, mas é só minha opinião.

 

Escrevo sistemas há cerca de 40 anos e já vivi muitos desses cenários. Em especial quando há uma hierarquia e dinheiro envolvido pessoas são às vezes cruéis até. Mas não acho que seja o caso de um forum moderado.

Link para o comentário
Compartilhar em outros sites

Coisas do tipo: Seu programa é ruim, Você errou muito, Seu programa não está bom, Seu programa não presta...  são gestos irrelevantes em qualquer discussão pessoal ou virtual que quando pensa não se fala. Mesmo sem maldade não contribui.

 

Não podemos introduzir os debates de qualquer maneira é preciso melhores gestos de chamar atenção do outro.

 

 

Link para o comentário
Compartilhar em outros sites

@Duarte2020 Para não ter que criar várias funções, você pode usar um loop e comparar os dígitos conforme a posição dos caracteres na string, p.ex

 

int main(){
    char senha[] = "0123456789", s[3];
    int i = 1, d = 1;
    
    while(i < 10){
        printf("%d° etapa: ", d);    
        scanf("%s", s);
        
        if(s[0]==senha[i - 1] && s[1]==senha[i]){
            i+=2;
            d++;
        }else{
            printf("Inválido\n");
            continue;
        }    
    }
    
    printf("Ok\n");
    
    return 0;
}

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Spoiler

 

@arfneto PRONTO!!! Acabei de terminar!!!   depois de tantos erros na hora de copilar. 



#include <math.h>
#include<stdio.h>
#include <conio.h>
int main(){
int valor;
int i=0;
for (;;)
{
printf("Digite o primeiro numero:\n");
    scanf("%d", &valor);    
    if(valor==02){
       printf("Primeira tranca destravada!\n");
       printf("Digite o segundo numero:\n");
       scanf("%d", &valor);
       if(valor==00){
            printf("Segunda tranca destravada!\n");
         printf("Digite o terceiro numero:\n");
            scanf("%d", &valor);
            if(valor==73){
                printf("Terceira tranca destravada!\n");
            printf("Digite o quarto numero:\n");
                scanf("%d", &valor);
                if(valor==32){
                    printf("Quarta tranca destravada!\n");
                printf("Digite o quinto numero:\n");
                    scanf("%d", &valor);
                    if(valor==55){
                    printf("Porta aberta!\n");
                i=i+1;
                    }
                }
            }
       }
    }

if (i == 1)
    {
      printf("entrando...\n");
      break;
}

}
return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

36 minutos atrás, charles95 disse:

PRONTO!!! Acabei de terminar!!!   depois de tantos erros na hora de copilar. 

 

Muito bem! Bom que conseguiu.

 

int fase(int etapa, int alvo)
{
	int numero = -1;
	printf("[Etapa %d de 5] Digite o numero: ", 1 + etapa);
	scanf("%d", &numero);
	if (numero != alvo) return 0;
	printf("voce passou pela etapa %d! Continue...\n\n", 1 + etapa);
	return 1;
};

Resolveu não seguir o caminho de usar uma função como no exemplo?

Link para o comentário
Compartilhar em outros sites

@arfneto @arfneto Esse código não copila aqui. Mesmo com o programa atualizado, nem declarar uma variável dentro de um for eu posso. Fiz uma modificações no código, e mesmo assim continua detectando outros erros. Não tive paciência não. Mas foi bom pra mim quebrar a cabeça com isso e desenvolver o meu próprio código usando apenas os conceitos que eu aprendi ate agora no curso, e bom que vou ganhando experiencia nessa linguagem. 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!