Ir ao conteúdo
  • Cadastre-se

C Matriz em C para reservar lugar?


Reila

Posts recomendados

Estou com dúvidas em como criaria uma matriz e definiria lugares a ela, como por exemplo 100 lugares e depois conseguiria seleciona-los e "ocupa-los" incapacitando de serem selecionados mais que uma vez, caso fizesse um vetor linha, coluna e definisse os com 1 ou 0, 1 ocupado e 0 livre, e verificasse, daria certo? Como executar?

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

@Reila   com matriz seria melhor ,  entao se voce declarar essa matriz la em cima antes da main  ela seria inicializada com todos os elementos zerados , assim entao todos os lugares estariam vagos e quando forem ocupados voce coloca o numero 1 nessa posicao para informar  que o lugar esta ocupado .     poste seu codigo para vermos como esta  .

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

Si e existem diversas formas de fazer, a mais C da vida é com funções. É bem simples dado um par ordenado da matriz teste por um expressão de controle ou decisão se aquela coordenada dada tem um valor diferente de 0, se tem então retorna 0 indicando falha para inserção nas coordenadas.

 

int minha_matriz_set( int   y_vlor, 
                      int   x_vlor,
                      int   vlor 
                      int * matriz );

 

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

@devair1010 a verificação ocorreria como?

primeiro a pessoa escolheria tipo 

int lugares [10][10];

int i, j;

printf("Escolha um lugar, fileira e coluna respectivamente: \n");

scanf("%d, %d", &i, &j);

matriz [j] = 1;

e caso fosse escolher de novo e já estivesse ocupado

if(matriz [j] = 1){

printf("O local ja esta ocupado");

 

procederia assim? n sei se to fazendo td errado..

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

@Reila    isso mesmo , para comparar se eh igual voce usa dois sinais de igual , entao se na posicao digitada pelo usuario tiver o numero 1 entao escolha outro lugar .    e caso esteja ocupado precisa voltar na linha onde pede para digitar a posicao e para voltar voce pode usar um loop.  do / while  e uma variavel de controle , que recebe o valor zero , e caso o lugar esteja ocupado entao coloque o valor 1 nessa variavel , assim  no while se for zero ele nao repete , mas sendo 1 ele repete para pegar o valor da nova podicao .

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

@devair1010 Por que seriam dois sinais de igual? 

Não sei como encaixar o do while também porque como eu botei logo após a pessoa selecionar a fileira e coluna o valor virar 1, e logo depois verifica, então ai já dá que o lugar tá ocupado mesmo não estando porque eu botei pra virar 1 logo após selecionar... tô perdida 😧 

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

@Reila    na linguagem c  é assim mesmo , não sei bem por que mas creio que seja para diferenciar quando se quer adicionar um valor à variável  , que é o sinal de igual simples ,  de quando se quer comparar uma variável com outra ,     você pegou o valor de duas variáveis , i e j , então logo em seguida você compara se naquela posição da matriz é o número 1 ou o número zero , então seu código seria assim  :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>  
int poltrona_vazia(matriz[]){
    int x,y,t=0,aux;
    for(x=0;x<10;x++)
        for(y=0;y<10;y++)
            if(matriz[x] [y] == 0){
                t=1;
                break;
            }
    if(t == 1)printf("Tem Uma Vaga Na Posicao %d %d\n",x,y);
    return t;
}
int main(){
    int lugares [10][10];
    int i, j,flag;
  char sair;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
            matriz[i][j] = 0 ;
    do{
        do{
            flag = 0;
            printf("Escolha um lugar, fileira e coluna respectivamente :  ");
            scanf("%d, %d", &i, &j);
            if(matriz[i][j] == 1) {
                printf("O local ja esta ocupado\n"); 
                flag = 1;
            }
            aux = poltrona_vazia(matriz);
            if(t == 0) {
                printf("Todos Os Lugares estão Ocupados\n\n");
                break;
            }
        }while(flag == 1);
        matriz [i] [j] = 1;
        printf("Quer Escolher Outra Poltrona  S / N ");
    }while(toupper(sair) != 'N');
    return 0;    
}

 

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

Sobre os dois iguais, é igual o @devair1010 falou, pois ao colocar somente =, o compilador deve entender que você está tentando inserir um valor, e não comparar, então resolveram colocar == para comparar e não haver confusão.

 

Agora o seu exercício, fiz um aqui também, usando seu código e do @devair1010, espero que ajude em algo.

 

#include <stdio.h>
#include <ctype.h>

int linhas=10;   //variavel global para linhas
int colunas=10; //variavel global para colunas

void iniciar(int matriz[linhas][colunas]){ //funcao para inicilizar todas posições com 0

    for(int i=0; i<linhas; i++){
        for(int j=0; j<colunas; j++){
            matriz[i][j]=0;
        }
    }
}

int verificar(int matriz[linhas][colunas], int x, int y){

    int aux = 0;

    for(int i=0; i<linhas; i++)
        for(int j=0; j<colunas; j++)
            if(matriz[i][j]==0){ //compara se há algum lugar == 0, que é um lugar livre
                aux=1; //insere 1 na variavel aux, e ja da um break para sair do laço
                break;
            }
  

    if(aux==0){ 
      
      	 /* se aux ficar 0, é porque nao achou nenhum lugar livre no teste acima, 
    		então finaliza a função retornando 0 */
      
        printf("\n\nInfelizmente as vagas se esgotaram :( !\n\n");
        return 0;
    }

    if(aux == 1 && matriz[x][y]==1){ 
      //se estiver espaço livre, mas o escolhido for ocupado, vamos procurar um livre

        while(matriz[x][y]==1){ //enquanto o lugar escolhido for ocupado, repita.
            printf("\nLugar Nao Disponivel, escolha outro: ");
            scanf("%d,%d", &x, &y);
        }
    }
        //caso nao estiver ocupado e tiver espaço ele nem passará pelos if's, virá aqui de cara
        //no caso de entrar no if de ocupado, ao sair do laço, tb sairá do if e virá aqui

        matriz[x][y]=1;
        printf("\nLugar [%d][%d] escolhido com sucesso!\n", x, y);
  
    return 1;

}

int main(){

    int lugares [linhas][colunas], i, j, k;
    char op;

    iniciar(lugares);

    do{
        printf("\nEscolha um lugar, fileira e coluna respectivamente: ");
        scanf("%d,%d", &i, &j);

        k=verificar(lugares, i, j);

        printf("\nDeseja continuar?[S/N]: ");
        scanf(" %c", &op);

    }while(toupper(op)!='N' && k!=0);

	return 0;
}

 

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

Seria bom que a quantidade de lugares vazios estivesse em uma variável, só assim para não testar disponibilidade toda vez que ocupar um lugar novo.

 

Seria bom também um conjunto de funções para aplicar as operações do conjunto, por exemplo; uma função só para testar disponibilidade, iniciar, ocupar e desocupar lugares e tantas outras operações como desocupar uma fila inteira, ou ocupar um fila inteira.

 

Atualmente temos aqui só duas funções.

 


00:08 Atualização

enum pos 
{ fileiras= 10, 
  cadeiras= 10,
};

int main( void )
{ char opcao; 
   int lugares [fileiras][cadeiras], k= (fileiras * cadeiras),
       lugar [2]= { 0, 0 },
       totais= 0;

  lugares_iniciar( lugares );

  do 
  { printf( "Escolha um lugar, fileira e cadeira respectivamente: " );
    lugares_pegar( lugar );
   
    if( lugares_verificar(lugares, lugar) )lugares_ocupar( lugares, lugar, (& totais) );
    else printf( "Lugar ocupado!\n" );
   
    printf( "Atualmente tem ocupado %u lugar(es). ", totais );
    printf( "Deseja continuar ( [S] | N )? " ); scanf( " %c", (& opcao) );
   
  } while( (totais <= k)&&(toupper(op) != 'N') );
 
  return 0;
}

 

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

@devair1010 @Asrety Deu vários erros aqui o de vocês, não sei se faltou eu inserir alguma coisa.

@AnsiC Na seleção do seu só consigo selecionar a fileira, se boto 2 3 vai só [2] [0] 

Desculpa gente, sou bem iniciante então provavelmente eu que tô errando no programa de vocês 😧

Com o básico que minha professora me ensinou consegui fazer isso aqui, não inseri outras bibliotecas porque não aprendemos mas pra o que ela pediu terei que inserir depois.

Citação

#include <stdio.h>
#include <stdlib.h>
void main (){
    int i, j, lin, col, cont;
    int lugares [10][10];
    
    for (lin = 0; lin < 10; lin ++){
        for(col = 0; col < 10; col ++){
            lugares[lin][col] = 0;
        }
}

    for (lin = 0; lin < 10; lin ++){
        for(col = 0; col < 10; col ++){
            printf("[ % d ]", lugares[lin][col]);
        }
printf("\n");
}
for (cont =1; cont <=100; cont++){ // DUVIDAS EM relação A ESTA LINHA POIS O CONT SO REPETIRA, SEM CONTAR SE O LUGAR ESTA OCUPADO JA OU NAO, DEVERIA CONTAR DENTRO DAS 100X APENAS LUGARES NAO OCUPADOS
printf("Escolha uma fileira 0-9 \n");
scanf("%d", &i);
printf("Escolha uma coluna 0-9 \n");
scanf("%d", &j);

if (lugares [j] == 0){
    lugares [j] = 1;
} else {
    printf("O lugar ja esta ocupado \n");
}
    for (lin = 0; lin < 10; lin ++){
        for(col = 0; col < 10; col ++){
            printf("[ %d ]", lugares[lin][col]);
        }
        printf("\n");
    }
}
system("pause");
}

Em relação ao cont alguém saberia como resolver? E também como inserir o horário em que a pessoa escolhe o lugar, tem algum comando?

Obrigado por terem ajudado já com tudo isso 😃

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

 for (cont =1; cont <=100; ) /* aqui voce pode retirar o cont++, e colocar ele dentro do if 
 que compara se está livre, ai sim só irá aumentar de acordo com as compras realizadas.*/

if (lugares [i][j] == 0){ 
    lugares [i][j] = 1; 
   cont++; //cont deverá ser incrementado aqui.
}

Agora sobre o horário não sei te ajudar, sou novato também, não duvido ter um método pra isso, mas acredito não ser muito simples extrair a hora e vincular com cada posição, e uma dica que te dou é utilizar funções, seu programa pode ser simplificado e organizado se utilizar funções como, iniciar lugares, mostrar lugares, etc, o código fica melhor, e quando for postar o seu código utilize o botão Code < > e não citação, tive dificuldades para compilar aqui, enfim, essas foram as minhas dicas.

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

@Reila Olá!

Então isso que eu escrive ainda não é um programa, é apenas algo para melhorar os estudos que ainda estão no comecinho, coisa para o futuro.

 

Outro problema é também que, existem muitas maneiras de se resolver o seu projeto, ajudaria muito se você listar os temas e os assuntos que você aprendeu da linguagem, pois ficamos sabendo exatamente aquela forma ideal de te ajudar, que mais se aproxima do seu nível de estudos. Dessa forma também todos que se interessarem contribuirão sistematicamente e homogonicamente com o programa.

 

 

 

 

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

@Asrety Consegui!! Não sabia, vou colar o andamento do código com sua ajuda só que agora na versão de code.

@AnsiC Verdade, por enquanto não aprendi tanto, aprendi de biblioteca apenas o stdio.h (mas ela disse que posso inserir outras no programa que é o trabalho semestral) for, while, do while, vetor, matriz, modularização, ponteiros, pilha e fila, embora os ultimos três eu ainda não sei tanto, mas aprendemos já.

#include <stdio.h>
#include <stdlib.h> /* embora eu não seja muito bem pra que ela serve, foi o único jeito de rodar por algum motivo, 
colei aleatoriamente de um outro programa que me ajudaram mas o erro é no system do final, 
eu deveria usar o return então? e tirar essa biblioteca */
void main (){
	int i, j, lin, col, cont;
	int lugares [10][10];
	
	for (lin = 0; lin < 10; lin ++){
		for(col = 0; col < 10; col ++){
			lugares[lin][col] = 0;
		}
}

	for (lin = 0; lin < 10; lin ++){
		for(col = 0; col < 10; col ++){
			printf("[ % d ]", lugares[lin][col]);
		}
printf("\n");
}
for (cont =1; cont <=5; ){ /* variavel para repetir o contador o tanto 
de vezes que ainda existem assentos disponiveis */
printf("Escolha uma fileira 0-9 \n");
scanf("%d", &i);
printf("Escolha uma coluna 0-9 \n");
scanf("%d", &j);

if (lugares [i][j] == 0){
	lugares [i][j] = 1;
	cont++; /* contador inserido aqui para apenas aumentar 
de acordo com os assentos desocupados apenas */
}
 else {
	printf("O lugar ja esta ocupado \n");
}
	for (lin = 0; lin < 10; lin ++){
		for(col = 0; col < 10; col ++){
			printf("[ %d ]", lugares[lin][col]);
		}
		printf("\n");
	}
}
system("pause");
}

 

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

36 minutos atrás, Reila disse:

 


#include <stdlib.h> /* embora eu não seja muito bem pra que ela serve, foi o único jeito de rodar por algum motivo, 
colei aleatoriamente de um outro programa que me ajudaram mas o erro é no system do final, 
eu deveria usar o return então? e tirar essa biblioteca */

 

Sim, nesse código não há necessidades da stdlib.h, e esse system pause pode fazer o que você disse, alguns utilizam esse system pause, ou um getchar no final do código apenas para garantir que o terminal não feche sozinho quando terminar a execução.

  • Curtir 1
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!