Ir ao conteúdo

C como fazer uma cadeira que uma cadeira ja reservada nao seja mais reservada em c


Ir à solução Resolvido por Visitante,

Posts recomendados

Postado


boa noite pessoal, eu sou estudante de ADS , e sou novo na programacao, estou desenvolvendo 
um sisteminha para estudos na faculdade, um sistema de controle de entrada e saida de usuarios,
mas nele esta acontecendo um erro, quando eu digito um numero de uma cadeira que ja esta comprada
ele aceita,e ele nao deveria aceitar, estou vendo e revendo o codigo  mas nao vejo erro.
alguem pode apontar o meu erro?
obrigado, segue o codigo:

	#include <stdio.h>
	#include <time.h>
	#include <stdlib.h>
	#define linha 11
	#define coluna 11
	#define valor_minimo 29
	#define valor_maximo 121
	int valida(int num, int *ant, int cont);
	void edita (int sort,int cont);
	void chamaSorteio();
	void CadeiraNum();//declara a funcao que preenche os lugares com numeros
	void painel();//declara a funcao que mostra a matriz
	void compra();//declara a funcao que faz a compra dos lugares
	void cad();
	int resp;
	int matriz[linha][coluna];//
	FILE *ponteiroArquivo;   
	struct cadastro{
	    char nome [50];
	    char cpf [15];
	    char email [30];
	    };
	     struct cadastro aux;
	
	int main(){
		int opcao=0;
		int contador=0,lugares=92;
		int l,c;
		char nomes[30];
		char timeStr[9];
		
		struct tm *data_hora_atual;
		time_t segundos;
		time(&segundos);
		data_hora_atual = localtime(&segundos); 
		
		CadeiraNum(matriz);//aqui complementa a funcao cadeiraNum(); colocando os numeros.
		
		do{
			//a partir daqui e mostrado para o usuario as opções do programa principal
	         system("cls"); 
	         printf("\n\n                      MENU  \n\n");      
	         printf("                  1- Reservar Cadeira       (Ainda restam (%d) lugares)\n",lugares-contador);        
	         printf("                  2- Mostrar Painel de lugares\n"); 
			 printf("                  3- Sorteio\n");       
	         printf("                  4- SAIR           \n");        
	         printf("                   opcao: ");
			 scanf("%d",&opcao);               
	                       
	     switch(opcao){
	        case 1:
	          system("cls");          
			  //cad();
			 // getch();
	          system("cls"); 
	          painel(matriz);//antes de escolher o lugar antes e chamado a matriz e o usuario pode ver o painel, inclusive com os lugares do teatro comprados atualizados.
			  texto:
			  printf("\n\nDigite o numero da cadeira desejada: \n");
			  scanf("%d",&resp);
			   
			  if ((resp<=0) || (resp>=122)){  
	          	printf("Esta cadeira não existe!!!Escolha outra!\n");
	          	goto texto; 
				getch();          	
			}else if ((resp>=1) && (resp<=22)){  
	          	printf("Esta cadeira ja esta reservada!!!Escolha outra!\n");
	          	goto texto; 
				getch();          	
			}
			else if ((resp>=23) && (resp<=28)){  
	          	printf("Esta cadeira é preferencial!!!Escolha outra!\n");
	          	goto texto; 
				getch();          	
			}else if (matriz[l][c]==0){
	            printf("Esta cadeira esta ocupada!!! Escolha outra!\n");
	            goto texto;
	            getch();
	        }
			else (printf(" \n"));
	
	     	  ponteiroArquivo=fopen("arquivo.txt","r"); 
	          fgets(nomes,30,ponteiroArquivo);
	          
			  fclose(ponteiroArquivo);
			  system("cls"); 
			  
	         _strtime( timeStr );
	          printf_s( "\tParabens %s pela sua compra no dia %d/%d/%d as %s \n\nSeu ticket sera enviado por e-mail!!\n",aux.nome, data_hora_atual->tm_mday,data_hora_atual->tm_mon+1,data_hora_atual->tm_year+1900,timeStr);
	  		  printf("seu assento e %d\n",resp);
	  		  contador++;
		      system("pause");         
	          break;
	        
	        case 2:
	          system("cls");
	          system("cls");
	          painel(matriz);//chama a funcao painel que contem a matriz 
	          printf("\n\n");
	          system("pause");
	          break;
	          
	        case 3:
	          system("cls");
	          chamaSorteio();
		      system("pause");
	          break;
	          
	        //o usuario escolhendo este caso o programa retorna nada e fecha
	        case 4:
	          return 0;
	          break;
			     
	        default:
	        	printf("OPCAO INVALIDA!!!\n");
				system("pause");
	        break;
	     }
	  }while(1==1); 
	  
	    
	system("pause");	
	return(0);
	}
	
	//esta e a funcao responsavel por preencher todos os lugares do teatro com numeros!
	void CadeiraNum(){
		int c,l;
		int num;
		num=1;
		
		for(l=1;l<=linha;l++)
	     for(c=1;c<=coluna;c++){	  
	     matriz[l][c]=num;
	  	 num++; 
		}
		matriz[3][1]=333; 
		matriz[3][2]=333;
		matriz[3][3]=333;
		matriz[3][4]=333;
		matriz[3][5]=333;
		matriz[3][6]=333;
		/**/
		matriz[1][1]=222; 
		matriz[1][2]=222;
		matriz[1][3]=222;
		matriz[1][4]=222;
		matriz[1][5]=222;
		matriz[1][6]=222;
		matriz[1][7]=222;
		matriz[1][8]=222;
		matriz[1][9]=222;
		matriz[1][10]=222;
		matriz[1][11]=222;
		/**/
		matriz[2][1]=222;
		matriz[2][2]=222;
		matriz[2][3]=222;
		matriz[2][4]=222;
		matriz[2][5]=222;
		matriz[2][6]=222;
		matriz[2][7]=222;
		matriz[2][8]=222;
		matriz[2][9]=222;
		matriz[2][10]=222;
		matriz[2][11]=222;   
	}
	
	//esta e a funcao que cria as linhas e as colunas do teatro matriz
	void painel(){
	  
	  int c,l;
	  printf("\n            PAINEL DE OCUPACOES   \n\n");
	  printf("          ");
	   
	  
	  for(c=1;c<=coluna;c++)
	    printf("\t%d",c);
	  
	  for(l=1;l<=linha;l++){
	     printf("\n\n\t%d",l);
	     for(c=1;c<=coluna;c++)
	     
	       
	    if(matriz[l][c]==222){
	        printf("\t(R)");
	    }else if((matriz[l][c]==resp)||(matriz[l][c]==0)){
	        matriz[l][c]=0;
	        printf("\t(C)");
	    }/*else if(matriz[l][c]==0){
	        printf("\t(c)");
	    }*/
	    else if(matriz[l][c]==333){
	        printf("\t(P)");
	    }    else printf("\t(%d)",matriz[l][c]);
	
	}
		printf("\n\n\t(29-121) - LUGAR LIVRE    (p) - Assento preferencial   (C) - CADEIRA JA COMPRADA   (R) CADEIRA RESERVADA\n");
	} 
	
	//funcao que marca no lugar escolhido o valor 0 guardando o lugar 
	/*void compra(int l, int c){
	  
	  
	  if(resp==matriz[linha][linha]){
		matriz[linha][coluna] = 0;
	}
	} */
	void cad(){
	
	    
	    ponteiroArquivo=(fopen("arquivo.txt","a")); // "a"  - cria um arquivo novo, ou modifica um ja existente.
	    getchar();
	    printf("\t\tSEJA BEM VINDO AO TEATRO DA UNIP!!\n\n");
	    printf("Antes de comprar a cadeira vamos fazer um breve cadastro........\n\npresssione ENTER para continuar......\n\n\n");
	    getch();
	    printf("Digite seu nome: ");
	    fgets (aux.nome, 50 ,stdin);
	
	    getchar();
	    printf("Digite seu CPF: ");  
	    fgets (aux.cpf, 15 ,stdin);
	
	    getchar();
	    printf("Digite seu Email: ");
	    fgets (aux.email , 30 ,stdin);
	
	    //gravando com fprintf no arquivo
	    printf("\n");
	    
		fprintf(ponteiroArquivo, "\n------------------------\n");
	    fprintf(ponteiroArquivo,"nome: %s\n",aux.nome);
	    fprintf(ponteiroArquivo,"CPF: %s\n",aux.cpf);
	    fprintf(ponteiroArquivo,"Email: %s\n",aux.email);
	
	    fclose(ponteiroArquivo);//fecha o arquivo
	}
	void chamaSorteio(){
		int i;
		int sorteados[4];
		
		srand(time(NULL));
		
		printf("---------|SORTEIO\n\n");
		
		for(i=0;i<4;i++){
			sorteados[i] = valor_minimo+rand()%(valor_maximo-valor_minimo);
			if(i==0){
				edita(sorteados[i],i);
			}
			else {
				sorteados[i] = valida(sorteados[i],sorteados,i);
				edita(sorteados[i],i);
			}
		}
		printf("------------------------------------------");
			getch();
			printf("\nParabens a todos os premiados!!\n\n");
			getch();
	}
	
	int valida(int num, int *ant, int cont){
		int aux;
		
		for(aux=0;aux<cont;aux++){
			while(num==*(ant+aux)){
				num=valor_minimo+rand()%(valor_maximo-valor_minimo);
			}		
		}
		return num;
	}
	void edita (int sort,int cont){
				
			printf("\t%d°premiado usuario da caderia : %.2d\n",cont+1,sort);		
			
	}

 

Postado
int main(){
    ....
    int matriz[linha*coluna];

    cadeiraNum(matriz);//aqui complementa a funcao cadeiraNum(); colocando os numeros.

    do{
        //a partir daqui e mostrado para o usuario as opções do programa principal
        ....

        switch(opcao){
            case 1:
                system("cls");
                //cad();
                // getch();
                system("cls");
                painel(matriz);//antes de escolher o lugar antes e chamado a matriz e o usuario pode ver o painel, inclusive com os lugares do teatro comprados atualizados.
                while(1){
                    printf("\n\nDigite o numero da cadeira desejada: \n");
                    scanf("%d",&resp);

                    if ((resp<=0) || (resp>=122)){
                        printf("Esta cadeira não existe!!!Escolha outra!\n");
                        getch();
                    }else if (matriz[resp-1] == 222){
                        printf("Esta cadeira ja esta reservada!!!Escolha outra!\n");
                        getch();
                    }else if (matriz[resp-1] == 333){
                        printf("Esta cadeira é preferencial!!!Escolha outra!\n");
                        getch();
                    }else if (matriz[resp-1]==0){
                        printf("Esta cadeira esta ocupada!!! Escolha outra!\n");
                        getch();
                    }else {
                        matriz[resp-1] = 0;
                        printf(" \n");

                        break;
                    }
                }

                ponteiroArquivo=fopen("arquivo.txt","r");
                fgets(nomes,30,ponteiroArquivo);

                fclose(ponteiroArquivo);
                system("cls");

                _strtime( timeStr );
                printf_s( "\tParabens %s pela sua compra no dia %d/%d/%d as %s \n\nSeu ticket sera enviado por e-mail!!\n",aux.nome, data_hora_atual->tm_mday,data_hora_atual->tm_mon+1,data_hora_atual->tm_year+1900,timeStr);
                printf("seu assento e %d\n",resp);
                contador++;
                system("pause");
                break;

            case 2:
                system("cls");
                painel(matriz);//chama a funcao painel que contem a matriz
                printf("\n\n");
                system("pause");
                break;
            case 3:
                system("cls");
                chamaSorteio();
                system("pause");
                break;

                //o usuario escolhendo este caso o programa retorna nada e fecha
            case 4:
                return 0;
                break;

            default:
                printf("OPCAO INVALIDA!!!\n");
                system("pause");
            break;
         }
    }while(1==1);


    system("pause");
    return(0);
}

    //esta e a funcao responsavel por preencher todos os lugares do teatro com numeros!
void cadeiraNum(){
    int c,l;
    int num = 1;

    for(l=0;l<linha;l++)
        for(c=0;c<coluna;c++,num++){
            matriz[l*linha+c]=num;
        }
    matriz[2*linha+0]=333;
    matriz[2*linha+1]=333;
    matriz[2*linha+2]=333;
    matriz[2*linha+3]=333;
    matriz[2*linha+4]=333;
    matriz[2*linha+5]=333;
    /**/
    matriz[0*linha+0]=222;
    matriz[0*linha+1]=222;
    matriz[0*linha+2]=222;
    matriz[0*linha+3]=222;
    matriz[0*linha+4]=222;
    matriz[0*linha+5]=222;
    matriz[0*linha+6]=222;
    matriz[0*linha+7]=222;
    matriz[0*linha+8]=222;
    matriz[0*linha+9]=222;
    matriz[0*linha+10]=222;
    /**/
    matriz[1*linha+0]=222;
    matriz[1*linha+1]=222;
    matriz[1*linha+2]=222;
    matriz[1*linha+3]=222;
    matriz[1*linha+4]=222;
    matriz[1*linha+5]=222;
    matriz[1*linha+6]=222;
    matriz[1*linha+7]=222;
    matriz[1*linha+8]=222;
    matriz[1*linha+9]=222;
    matriz[1*linha+10]=222;
}

//esta e a funcao que cria as linhas e as colunas do teatro matriz
void painel(){
    int c,l;
    printf("\n            PAINEL DE OCUPACOES   \n\n");
    printf("          ");


    for(c=0;c<coluna;c++)
        printf("\t%d",c+1);

    for(l=0;l<linha;l++){
        printf("\n\n\t%d",l+1);
        for(c=0;c<coluna;c++)
            if(matriz[l*linha+c]==222){
                printf("\t(R)");
            }else if((matriz[l*linha+c]==0)){
                printf("\t(C)");
            }/*else if(matriz[l][c]==0){
                printf("\t(c)");
            }*/
            else if(matriz[l*linha+c]==333){
                printf("\t(P)");
            }else
                printf("\t(%d)",matriz[l*linha+c]);

    }
    printf("\n\n\t(29-121) - LUGAR LIVRE    (P) - Assento preferencial   (C) - CADEIRA JA COMPRADA   (R) CADEIRA RESERVADA\n");
}

não use goto (é uma má pratica de programação), use while, do while, for, funções

matrizes e vetores começam da posição 0 e a ultima posição é n-1, o n é nulo (mesmo que c deixe mexer não mexa)

o resp tu esta usando ele para referenciar um lugar que é uma posição na matriz, então porque não utilizar a matriz como um vetor?

linha=2

coluna=2

matriz[2*2]; //2 linhas 2 colunas = 4 posições

matriz[0*linha+1] //linha 0 coluna 1

resp 1 //lugar 1

matriz[resp-1]=0 //comprado

os códigos que usavam as cadeiras compradas não estavam bem estruturados

Postado

@Gabriel_Moro Quando você entende que 

matriz[ 2 ][ 2 ] é equivalente a matriz[ 4 ] ou matriz[ 2 * 2 ]; Por que prefere o último caso? Vejo o último caso como forçar duas notações (a de ponteiros e de vetores) isso é interessante porque explicitas as operações interna as matrizes, que na verdade, são realizadas sobre dados lineares na memória, ou seja, as matrizes não são quadrados de memória, e sim um linha de tamanho igual ao produto de suas dimensões (y * x).

 

  • Curtir 1
  • Solução
Postado

valeu @Gabriel_Moro, eu nao pensei que teria que alterar tanta parte do codigo, eu demorei um pouco pra entender suas alteracoes porque pra min e um pouco complexo ,ate porque eu sou novo na programacao , mas compreendi elas valeu man, salvou!!

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!