Ir ao conteúdo
  • Cadastre-se

C Problema em colocar uma struct dentro de uma matriz ixj


robson s martins

Posts recomendados

Oi pessoal, preciso de um auxilo com um problema passado em uma aula de algoritmos, cujo qual não consigo achar uma resposta.

a questão passada e a seguinte:

 

1) Desenvolva um sistema para controle de acentos para um teatro.  O sistema deve ser capaz de :

1.1 – Exibir todas as cadeiras do teatro

1.1.1 – Ao exibir as cadeiras deve ser  indicado um status para as cadeiras ocupadas, e para as cadeiras livres

1.1.2 – As cadeiras devem ser criadas como uma estrutura de dados, chamada  cadeira e com os seguintes elementos no mínimo:

1.2 - Exibir todas as cadeiras vazias/disponíveis

1.3 -  Exibir todas as cadeiras ocupadas

1.4 -  Cadastrar um cliente em uma cadeira(o status deve mudar)

1.5 – Excluir um cliente de uma cadeira (o status deve mudar)

1.6 – As cadeiras do teatro devem ser representada por uma matriz (5x4) com as bordas desenhadas; 

 

Eu consegui fazer uma a struct, fazer o progrmaa ler a struct, poderem nao consigo fazer ele mostrar a struct em ofrmato de matriz.

no momento estou usando "2 char" para fazer a visualização da matriz, ja que nao ocnsigo colocar a struct da forma como pedido,

 

o ponto em que preciso de ajuda e no 2 CASE

 

Algum pode me dar uma luz???

 

o meu codigo segue abaixo:

 

<#include <stdio.h>
#include <string.h>
struct cadeira
  {
    int fila;
    int col;
    int num_cad;
    char cliente[30];
    char status;
  };

int main (void)
{

    struct cadeira cad;

	int Caso_cadeira, i, j, fila, col, apaga, n;
	int poltrona[4] [5];
	char vazia[] = {"vazia"};
    char ocupada [] = {"Ocupada"};




	for(i=0 ; i<4; i++)
	{
		for(j=0 ; j<5 ; j++)
		{
			poltrona [i] [j]=0; //setei que todas as poltornas seriam zero
		}
	}
	do
	{
			printf("[1] - Escolher Cadeira\n");
			printf("[2] - Ver disposicao das cadeiras\n");
			printf("[3] - Cancelar cadeira\n\n");
			printf("[4] - Escolha concluida\n\n");
			scanf("%d", &Caso_cadeira);
			system("cls");

			switch(Caso_cadeira)
			{
				case 1: //Escolher Cadeira
					printf("Fila: ");
					scanf("%d", &cad.fila);
					printf("Coluna: ");
					scanf("%d",&cad.col);
					printf("Cadeira: ");
					scanf("%d",&cad.num_cad);
					printf("Cliente: ");
					scanf("%s",&cad.cliente);
					fflush(stdin);
					cad.fila = cad.fila-1;    //para sair na posicao correta
					cad.col = cad.col-1;      // idem
					if (cad.fila<4 && cad.col<5)
					{
						if (poltrona [cad.fila] [cad.col]==0)
						{
							poltrona [cad.fila] [cad.col]=1;
						}
						else
						{
							printf("******ATENCAO CADEIRA OCUPADA******\n\n");
						}
					}
					else
					{
						printf("******CADEIRA INEXISTENTE******");
					}
					printf("\n");
					printf("-------------------------------------------------------------\n");
					break;
				case 2: //ver caideiras
					n=1;
					printf("Listagem de cadeiras do Teatro vagas ou compradas: \n");
					printf("\n");
					printf("\tCorredor =>\n\n");
                    printf("FILAS");
                    printf("\n");


							for(i=0 ; i<4; i++){
                                printf("\t");
								for(j=0 ; j<5 ; j++)
								{
										if(poltrona[i] [j]==0)
									{
										printf("fila:%s   ",vazia);
										printf("\t");


                                        }
									else
										printf("fila:%d\ncoluna:%d   ",cad.fila,cad.col);

								}

							printf("\n");

					}
					printf("\nlegenda:");
					printf("\n Vazia = nao comprada");
					printf("\n Ocupada = ja comprada");
					printf("\n");
					printf("\n");
					printf("-------------------------------------------------------------\n");
					break;
				case 3: //esvaziar cadeiras
					printf("O que deseja fazer?\n");
					printf("[1] - Cancelar uma cadeira?\n");
					printf("[2] - Cancelar todas as cadeiras?\n");

					scanf("%d",&apaga);
						if(apaga == 1)
						{
							printf("\nFila: ");
							scanf("%d", &fila);
							printf("\nColuna: ");
							scanf("%d",&col);
							fila = fila - 1;
                            col = col - 1;
							if(fila<4 && col<5)
							{
								poltrona [fila] [col]=0;
							}
							else
							{
								printf("******CADEIRA INEXISTENTE******\n");
							}
						}
						else
						for(i=0 ; i<4; i++)
						{
							for(j=0 ; j<5 ; j++)
							{
								poltrona [i] [j]=0;
							}
						}
					printf("-------------------------------------------------------------\n");
					break;
				default:
					Caso_cadeira=0;

			}

	}while(Caso_cadeira!=0);
	system("pause");
	return(0);
}

 

Link para o comentário
Compartilhar em outros sites

Olá

 

Acho que muito do seu problema com o exercício vem do modo como tratou a estrutura...

 

Não é isso que se espera que você construa. Pense bem. Não acha estranho ter uma matriz de int chamada poltrona apesar de ter uma struct chamada cadeira? E não acha redundante ter as cadeiras com fila, coluna... e número? E não acha que a fila seria um char como em geral é?

 

Sugiro refazer sua lógica em torno de uma matriz de... cadeiras, claro,  onde as poltronas são identificadas por letra e número, por exemplo entre A1 e E4. Uma melhor abstração.

 

E não perder tempo com coisas não essenciais. Desenhe um gabarito com seu editor de texto. 5 minutos. Veja esse exemplo

0        1        2        3        4        5        6        7
0   *    0   *    0   *    0   *    0   *    0   *    0   *    0
|--------|--------|--------|--------|--------|--------|
|               A1    A2    A3    A4                  |
|             B1      B2      B3      B4              |
|           C1        C2        C3        C4          |
|         D1          D2          D3          D4      |
|       E1            E2            E3            E4  |          
-------------------------------------------------------
0        1        2        3        4        5        6        7
0   *    0   *    0   *    0   *    0   *    0   *    0   *    0

Já tem até um gabarito com números das colunas :)

 

E use maiúsculas para as poltronas livres, minúsculas para as ocupadas. Escreva uma função para mostrar a sala a partir de um óbvio ponteiro para uma matriz de cadeiras. Depois você pode trocar isso. Depois quer dizer depois que seu programa estiver PRONTO...

 

ch-191127-poltronas.txt

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

O problema é que não pode usar ponteiros @arfneto.

A ideia do trabalho é mostrar da seguinte maneira: 

Cadeira: %d%d - Linha coluna
Cliente: %s - Nome
Situação: %c - Livre ou Ocupada

Sendo que tudo acima é um struct, que deve ficar na posição 0x0 da matriz. E na posição 1x0 da matriz terá outro struct com os três elementos novamente. 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, José Mauro M M Filho disse:

O problema é que não pode usar ponteiros @arfneto.

A ideia do trabalho é mostrar da seguinte maneira: 

Cadeira: %d%d - Linha coluna
Cliente: %s - Nome
Situação: %c - Livre ou Ocupada

Sendo que tudo acima é um struct, que deve ficar na posição 0x0 da matriz. E na posição 1x0 da matriz terá outro struct com os três elementos novamente. 

 

Não entendi o que tem a ver os ponteiros com a estrutura. Como o tamanho já foi definido e é pequeno, porque não usar 

    cadeira    Cadeira[5][4];

e escrever com te expliquei, usando Letra e Número para identificar as poltronas e usando aquele texto que te mostrei como gabarito?

adicionado 20 minutos depois

São 5 filas de 4 poltronas então as fileiras começam em A e tem 4 cadeiras, e correspondem à linha da matriz. As colunas são 4 e você pode derivar os números direto,e pode usar maiusculas para as poltronas ocupadas, ou colocar parenteses em volta, ou mesmo mudar a cor, usando o gabarito que te mostrei.

Postei um programa hoje mesmo aqui que faz esse lance de mudar a cor por exemplo. Veja no tópico "problemas o full screen"

Se for usar maiúsculas para as poltronas ocupadas por exemplo, lembro que a diferença entre uma letra maiúscula e a minúscula correspondente é sempre 32 então mostrar o status fica bem fácil varre a matriz e para as poltronas ocupadas você subtrai 32 do valor...

Link para o comentário
Compartilhar em outros sites

21 minutos atrás, arfneto disse:

 

Não entendi o que tem a ver os ponteiros com a estrutura. Como o tamanho já foi definido e é pequeno, porque não usar 


    cadeira    Cadeira[5][4];

e escrever com te expliquei, usando Letra e Número para identificar as poltronas e usando aquele texto que te mostrei como gabarito?

adicionado 20 minutos depois

São 5 filas de 4 poltronas então as fileiras começam em A e tem 4 cadeiras, e correspondem à linha da matriz. As colunas são 4 e você pode derivar os números direto,e pode usar maiusculas para as poltronas ocupadas, ou colocar parenteses em volta, ou mesmo mudar a cor, usando o gabarito que te mostrei.

Postei um programa hoje mesmo aqui que faz esse lance de mudar a cor por exemplo. Veja no tópico "problemas o full screen"

Se for usar maiúsculas para as poltronas ocupadas por exemplo, lembro que a diferença entre uma letra maiúscula e a minúscula correspondente é sempre 32 então mostrar o status fica bem fácil varre a matriz e para as poltronas ocupadas você subtrai 32 do valor...

 

 

Acho que não ficou claro o enunciado do exercício no caso... Vou tentar explicar: 

ENUNCIADO:

1) Desenvolva um sistema para controle de acentos para um teatro.  O sistema deve ser capaz de :

1.1 – Exibir todas as cadeiras do teatro

1.1.1 – Ao exibir as cadeiras deve ser  indicado um status para as cadeiras ocupadas, e para as cadeiras livres

1.1.2 – As cadeiras devem ser criadas como uma estrutura de dados, chamada  cadeira e com os seguintes elementos no mínimo:

1.2 - Exibir todas as cadeiras vazias/disponíveis

1.3 -  Exibir todas as cadeiras ocupadas

1.4 -  Cadastrar um cliente em uma cadeira(o status deve mudar)

1.5 – Excluir um cliente de uma cadeira (o status deve mudar)

1.6 – As cadeiras do teatro devem ser representada por uma matriz (5x4) com as bordas desenhadas; 

 

EXPLICAÇÃO:

1.1 - Devem ser mostradas as cadeiras do teatro no formato de matriz, ou seja:
Usarei exemplo de uma matriz 1x3. Mas no exercicio deve ser uma 5x4.

Cadeira: %d%d - Linha coluna     |  Cadeira: %d%d - Linha coluna     |  Cadeira: %d%d - Linha coluna     |  
Cliente: %s - Nome                       |  Cliente: %s - Nome                      |  Cliente: %s - Nome                       |
Situação: %c - Livre ou Ocupada |  Situação: %c - Livre ou Ocupada |  Situação: %c - Livre ou Ocupada |

 

O problema é fazer com que seja mostrado um Struct na posição 0x0 da matriz. 
E esse struct deve ter o formato de: 

 

 

Você é obrigado a ter a cadeira com linha e coluna int. 

struct cadeira{

int linha;

int coluna;

}

 

struct teatro{
char nome[50];
int status;
struct cadeiras c;
};

 

Pois você também é obrigado a usar Struct dentro de Struct. 

Link para o comentário
Compartilhar em outros sites

2 minutos atrás, José Mauro M M Filho disse:

 

 

Acho que não ficou claro o enunciado do exercício no caso... Vou tentar explicar: 

ENUNCIADO:

1) Desenvolva um sistema para controle de acentos para um teatro.  O sistema deve ser capaz de :

1.1 – Exibir todas as cadeiras do teatro

1.1.1 – Ao exibir as cadeiras deve ser  indicado um status para as cadeiras ocupadas, e para as cadeiras livres

1.1.2 – As cadeiras devem ser criadas como uma estrutura de dados, chamada  cadeira e com os seguintes elementos no mínimo:

1.2 - Exibir todas as cadeiras vazias/disponíveis

1.3 -  Exibir todas as cadeiras ocupadas

1.4 -  Cadastrar um cliente em uma cadeira(o status deve mudar)

1.5 – Excluir um cliente de uma cadeira (o status deve mudar)

1.6 – As cadeiras do teatro devem ser representada por uma matriz (5x4) com as bordas desenhadas; 

 

EXPLICAÇÃO:

1.1 - Devem ser mostradas as cadeiras do teatro no formato de matriz, ou seja:
Usarei exemplo de uma matriz 1x3. Mas no exercicio deve ser uma 5x4.

Cadeira: %d%d - Linha coluna     |  Cadeira: %d%d - Linha coluna     |  Cadeira: %d%d - Linha coluna     |  
Cliente: %s - Nome                       |  Cliente: %s - Nome                      |  Cliente: %s - Nome                       |
Situação: %c - Livre ou Ocupada |  Situação: %c - Livre ou Ocupada |  Situação: %c - Livre ou Ocupada |

 

O problema é fazer com que seja mostrado um Struct na posição 0x0 da matriz. 
E esse struct deve ter o formato de: 

 

 

Você é obrigado a ter a cadeira com linha e coluna int. 

struct cadeira{

int linha;

int coluna;

}

 

struct teatro{
char nome[50];
int status;
struct cadeiras c;
};

 

Pois você também é obrigado a usar Struct dentro de Struct. 

 

Nada muda. Apenas coloque esse desenho da struct dentro daquele gabarito ao invés de usar só A1 .. E4

 

Faça um desenho com o bloco de notas usando isso e programa assim com as linhas e colunas. Se precisar de ajuda posso mostrar um gabarito pra voce logo mais

Link para o comentário
Compartilhar em outros sites

Ve se tu consegue me dar uma força... Antes de exibir a matriz bonitinha, eu quero fazer o programa funcionar certinho... 
Estou com problema no case 1: 

 

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

struct cadeiras{
int linha;
int coluna;
};

struct teatro{
char nome[50];
int status;
struct cadeiras c;
};

int main()
{
    int i, j, opcao, auxlinha, auxcoluna;
    struct teatro t[4][5];
    for(i=1;i<2;i++){
        for(j=1;j<2;j++){
                printf("Seu nome: \n");
                gets(t[j].nome);
        }
    }
    do{
    printf("O que voce quer fazer?\n[1] Ver todos os assentos\n[2] Comprar assento\n[3] Ver assentos Ocupados\n[4] Sair\n");
    scanf("%d", &opcao);
    switch(opcao){
    case 1:
    for(i=0;i<5;i++){
        for(j=0;j<4;j++){
            t[j].c.coluna=j;
            t[j].c.linha=i;
            t[j].status=0;
            if(t[j].status==0){
                        printf("Cadeira: %d%d\t | \nCliente: Livre\t | \nStatus:  Livre\t |\n\n\n", t[j].c.linha+1,t[j].c.coluna+1);
                    }
                        if(t[j].status==1){
                        printf("Cadeira: %d%d\t | \nCliente: %s\t | \nStatus: Ocupada\t |\n\n\n", t[j].c.linha,t[j].c.coluna, t[j].nome);
                    }
            }
        }break;
    case 2:
        printf("Digite a linha do assento:\n");
        scanf("%d", &auxlinha);
        printf("Digite a coluna do assento:\n");
        scanf("%d", &auxcoluna);
        t[auxcoluna][auxlinha].status=1;
    break;
    case 3:
            for(i=0;i<5;i++){
                for(j=0;j<4;j++){
                    t[j].c.coluna=j;
                    t[j].c.linha=i;
                    if(t[j].status==1){
                        printf("Cadeira: %d%d\t | \nCliente: %s\t | \nStatus: Ocupada\t |\n\n\n", t[j].c.linha,t[j].c.coluna, t[j].nome);
                    }
                }
            }
    }}while(opcao!=4);


}
 

Eu estou setando com o t[j].status=0; o status da cadeira para 0... Mas isso é um problema por que nunca vai entrar no segundo caso do if. Só que se eu tiro esse atribuição, ele para de mostrar vários itens da matriz. Mesmo que estejam vazios. Sabe me dizer porque?

Link para o comentário
Compartilhar em outros sites

Desculpa o erro... Por alguma razão o código saiu com uns pequenos bugs. 
Segue o correto com o bug que falei. 
 

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

struct cadeiras{
int linha;
int coluna;
};

struct teatro{
char nome[50];
int status;
struct cadeiras c;
};

int main()
{
    int i, j, opcao, auxlinha, auxcoluna;
    struct teatro t[4][5];
    for(i=1;i<2;i++){
        for(j=1;j<2;j++){
                printf("Seu nome: \n");
                gets(t[j].nome);
        }
    }
    do{
    printf("O que voce quer fazer?\n[1] Ver todos os assentos\n[2] Comprar assento\n[3] Ver assentos Ocupados\n[4] Sair\n");
    scanf("%d", &opcao);
    switch(opcao){
    case 1:
    for(i=0;i<5;i++){
        for(j=0;j<4;j++){
            t[j].c.coluna=j;
            t[j].c.linha=i;
            t[j].status=0;
            if(t[j].status==0){
                        printf("Cadeira: %d%d\t | \nCliente: Livre\t | \nStatus:  Livre\t |\n\n\n", t[j].c.linha+1,t[j].c.coluna+1);
                    }
                        if(t[j].status==1){
                        printf("Cadeira: %d%d\t | \nCliente: %s\t | \nStatus: Ocupada\t |\n\n\n", t[j].c.linha,t[j].c.coluna, t[j].nome);
                    }
            }
        }break;
    case 2:
        printf("Digite a linha do assento:\n");
        scanf("%d", &auxlinha);
        printf("Digite a coluna do assento:\n");
        scanf("%d", &auxcoluna);
        t[auxcoluna][auxlinha].status=1;
    break;
    case 3:
            for(i=0;i<5;i++){
                for(j=0;j<4;j++){
                    t[j].c.coluna=j;
                    t[j].c.linha=i;
                    if(t[j].status==1){
                        printf("Cadeira: %d%d\t | \nCliente: %s\t | \nStatus: Ocupada\t |\n\n\n", t[j].c.linha,t[j].c.coluna, t[j].nome);
                    }
                }
            }
    }}while(opcao!=4);


}
 

Link para o comentário
Compartilhar em outros sites

Vou dar uma olhada de novo logo mais.

 

Essa estrutura para representar o teatro não está boa e está jogando contra.


 

Citação

 

Você é obrigado a ter a cadeira com linha e coluna int

Pois você também é obrigado a usar Struct dentro de Struct. 
 

 

Não entendi onde está isso no enunciado. Você tem mais do enunciado que não postou?

 

O problema na representação

Quanto mais perto sua estrutura de dados estiver da realidade vai ficar mais fácil para programar a solução.

Se uma estrutura Teatro tem um nome deveria ser o nome da Sala e não do cliente que comprou um ticket para uma cadeira.

O nome e o status na estrutura teatro se referem a cadeiras. Pense bem.

struct cadeiras{
int linha;
int coluna;
};

struct teatro{
char nome[50];
int status;
struct cadeiras c;
};

struct teatro t[4][5];

Mais perto da realidade seria

struct cadeira
{
	int   coluna;
	int   linha;
	char  nome[50];
	int   status;
};
typedef struct cadeira		Cadeira;


struct teatro
{
	char		nome_da_sala[50];
	Cadeira		cadeiras[4][5];
};
typedef struct teatro		Teatro;

Você sabe escrever funções? São só blocos de código com um nome e uns detalhes, mas facilitam muito sia vida

Link para o comentário
Compartilhar em outros sites

#include <stdio.h>
#include <string.h>
struct cadeira
  {
    int fila;
    int col;
    char cliente[10];
    char status;
  };

int main (void)
{

    struct cadeira cad;

	int Caso_cadeira, i, j, fila, col, apaga, n,troco=0;
	int poltrona[4] [5];
	char vazia[] = {"vazia  "};
    char ocupada [] = {"Ocupada"};
    




	for(i=0 ; i<4; i++)
	{
		for(j=0 ; j<5 ; j++)
		{
			poltrona [i] [j]=0; //setei que todas as poltornas seriam zero
		}
	}
	do
	{
			printf("[1] - Escolher Cadeira\n");
			printf("[2] - Ver disposicao das cadeiras\n");
			printf("[3] - Cancelar cadeira\n\n");
			printf("[4] - Escolha concluida\n\n");
			scanf("%d", &Caso_cadeira);
			//system("cls");

			switch(Caso_cadeira)
			{
				case 1: //Escolher Cadeira
					printf("Fila: ");
					scanf("%d", &cad.fila);
					printf("Coluna: ");
					scanf("%d",&cad.col);
					printf("Cliente: ");
					scanf("%s",&cad.cliente);
                    cad.fila = cad.fila-1;    //para sair na posicao correta
					cad.col = cad.col-1;      // idem
					if (cad.fila<4 && cad.col<5)
					{
						if (poltrona [cad.fila] [cad.col]==0)
						{
							poltrona [cad.fila] [cad.col]=1;

						}
						else
						{
							printf("******ATENCAO CADEIRA OCUPADA******\n\n");
						}
					}
					else
					{
						printf("******CADEIRA INEXISTENTE******");
					}
					printf("\n");
					printf("-------------------------------------------------------------\n");
					break;
				case 2: //ver caideiras
					n=1;
					printf("Listagem de cadeiras do Teatro vagas ou compradas: \n");
					printf("\n");
					printf("\tCorredor =>\n\n");
                    printf("FILAS");
                    printf("\n");


							for(i=0 ; i<4; i++){
                                printf("    ");
								for(j=0 ; j<5 ; j++)
								{
                                        
										if(poltrona[i] [j]==0)
									{
										printf("polt-%d%d:%s     |",i,j+1,vazia);
										printf("\t\t");



                                        }
									else
                                        printf("polt-%d%d:%s - %s|\t\t",i,j+1,cad.cliente,ocupada);

								}

                            printf("\n");
                            printf("    _____________________________________________________________________________________________");
							printf("\n");

					}
					troco =0;
					printf("\nlegenda:");
					printf("\n Vazia = nao comprada         Polt = Poltrona");
					printf("\n Ocupada = ja comprada        Filas = 0 a 3 /Corredores = 1 a 5");
					printf("\n");
					printf("\n");
					printf("-------------------------------------------------------------\n");
					break;
				case 3: //esvaziar cadeiras
					printf("O que deseja fazer?\n");
					printf("[1] - Cancelar uma cadeira?\n");
					printf("[2] - Cancelar todas as cadeiras?\n");

					scanf("%d",&apaga);
						if(apaga == 1)
						{
							printf("\nFila: ");
							scanf("%d", &fila);
							printf("\nColuna: ");
							scanf("%d",&col);
							fila = fila - 1;
                            col = col - 1;
							if(fila<4 && col<5)
							{
								poltrona [fila] [col]=0;
							}
							else
							{
								printf("******CADEIRA INEXISTENTE******\n");
							}
						}
						else
						for(i=0 ; i<4; i++)
						{
							for(j=0 ; j<5 ; j++)
							{
								poltrona [i] [j]=0;
							}
						}
					printf("-------------------------------------------------------------\n");
					break;
				default:
					Caso_cadeira=0;

			}

	}while(Caso_cadeira!=0);
	system("pause");
	return(0);
}

consegui arrumar o meu codigo.. so nao sei porque ele nao salva o nome, cada vez que adiciono um cliente, ele substitui o nome anterior pelo q acabei de por.

Link para o comentário
Compartilhar em outros sites

20 minutos atrás, robson s martins disse:

consegui arrumar o meu codigo.. so nao sei porque ele nao salva o nome, cada vez que adiciono um cliente, ele substitui o nome anterior pelo q acabei de por.

 

Acho que está melhor seu código. Vou ver se entendo esse problema do nome a seguir.

 

Não respondeu ao que te perguntei:

  • você sabe escrever funções?
  • E aquela necessidade de ter int linha e coluna na struct
  • E aquilo de struct dentro de struct?
  • Onde está o resto do enunciado onde está escrito isso?

Não deve ler o nome do cliente antes de saber se a poltrona desejada está livre... Se a poltrona desejada já está ocupada apenas avise e volte para o menu para ele escolher outra

 

Exemplo de struct mais perto da realidade

struct cadeira
{
	char  nome[50];
	int   status;
};
typedef struct cadeira		Cadeira;

struct teatro
{
	char		nome_da_sala[50];
	Cadeira		cadeiras[5][4];
};
typedef struct teatro		Teatro;

Qual a diferença afinal?

Nesse modelo uma cadeira tem apenas um status e um nome de cliente. Todas cadeiras são iguais afinal. A posição física dela vai dar um número de fileira e um número de coluna E ao ser vendida passa a ter um cliente para uma certa sessão.

Um teatro tem um nome e as poltronas e a posição delas na matriz cadeiras fornece a fileira e a poltrona, usando a nomenclatura mais comum nos teatros.

 

E com esse modelo abstrato mais perto da realidade tudo fica mais fácil.

 

Exemplo

vamos imaginar um programa que inicie com as poltronas disponíveis claro, aí mostramos as disponíveis, marcamos umas como ocupadas e mostramos as disponíveis e as ocupadas.

 

Usar nomes e estrutura mais próximos da realidade também facilita ler o programa. Veja a seguir.

 

Marcar as poltronas como livres fica simples

    for (int fileira = 0; fileira < 5; fileira += 1)
    {
        for (int coluna = 0; coluna < 4; coluna += 1)
        {
            sala.cadeiras[fileira][coluna].nome[0] = 0;    // sem nome
            sala.cadeiras[fileira][coluna].status = 0;    // disponivel
        }    // for
    }    // for

Mostrar as poltronas livres também

	printf("\nMostra poltronas LIVRES\n\n");
	n = 0;
	for (int fileira = 0; fileira < 5; fileira += 1)
	{
		char f = 'A' + fileira;	// pra facilitar
		printf("Fileira %c: ", f );
		for (int coluna = 0; coluna < 4; coluna += 1)
		{
			if (sala.cadeiras[fileira][coluna].status == 0)
			{
				printf("%c%d ", f, coluna + 1);
				n = n + 1;
			}
		}	// for
		printf("\n");
	}	// for
	printf("\n%d poltronas livres\n\n", n);

"Vendendo" as das diagonais para clientes com nomes diferentes para poder ver na listagem  

    sala.cadeiras[0][0].status = 1;
    strcpy(sala.cadeiras[0][0].nome, "Cliente na Poltrona A1");

    sala.cadeiras[1][1].status = 1;
    strcpy(sala.cadeiras[1][1].nome, "Cliente na Poltrona B2");

    sala.cadeiras[2][2].status = 1;
    strcpy(sala.cadeiras[2][2].nome, "Cliente na Poltrona C3");

    sala.cadeiras[3][3].status = 1;
    strcpy(sala.cadeiras[3][3].nome, "Cliente na Poltrona D4");

    sala.cadeiras[4][0].status = 1;
    strcpy(sala.cadeiras[4][0].nome, "Cliente na Poltrona E1");

    printf("\nMarcadas como ocupadas A1 B2 C3 D4 E1\n\n");

Mostrar as poltronas ocupadas é quase igual

	printf("\nMostra poltronas OCUPADAS\n\n");
	n = 0;
	for (int fileira = 0; fileira < 5; fileira += 1)
	{
		char f = 'A' + fileira;	// pra facilitar
		printf("Fileira %c:\n", f);
		for (int coluna = 0; coluna < 4; coluna += 1)
		{
			if (sala.cadeiras[fileira][coluna].status == 1)
			{
				printf("    %c%d %s\n", 
					f, coluna + 1,	// poltrona
					sala.cadeiras[fileira][coluna].nome	// nome
				);
				n = n + 1;
			}
		}	// for
	}	// for
	printf("\n%d poltronas ocupadas\n", n);

Um programa usando esse código e essas estruturas mostraria


Mostra poltronas LIVRES

Fileira A: A1 A2 A3 A4
Fileira B: B1 B2 B3 B4
Fileira C: C1 C2 C3 C4
Fileira D: D1 D2 D3 D4
Fileira E: E1 E2 E3 E4

20 poltronas livres


Marcadas como ocupadas A1 B2 C3 D4 E1


Mostra poltronas LIVRES

Fileira A: A2 A3 A4
Fileira B: B1 B3 B4
Fileira C: C1 C2 C4
Fileira D: D1 D2 D3
Fileira E: E2 E3 E4
15 poltronas livres

Mostra poltronas OCUPADAS

Fileira A:
    A1 Cliente na Poltrona A1
Fileira B:
    B2 Cliente na Poltrona B2
Fileira C:
    C3 Cliente na Poltrona C3
Fileira D:
    D4 Cliente na Poltrona D4
Fileira E:
    E1 Cliente na Poltrona E1

5 poltronas ocupadas

Eis o programa todo

#define			_CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <windows.h>

struct cadeira
{
	char  nome[50];
	int   status;
};
typedef struct cadeira		Cadeira;


struct teatro
{
	char		nome_da_sala[50];
	Cadeira		cadeiras[5][4];
};
typedef struct teatro		Teatro;


int main(int argc, char** argv)
{
	Teatro	sala;
	int		n;

	// prepara tudo: todas livres

	for (int fileira = 0; fileira < 5; fileira += 1)
	{
		for (int coluna = 0; coluna < 4; coluna += 1)
		{
			sala.cadeiras[fileira][coluna].nome[0] = 0;	// sem nome
			sala.cadeiras[fileira][coluna].status = 0;	// disponivel
		}	// for
	}	// for

	// mostra as livres
	printf("\nMostra poltronas LIVRES\n\n");
	n = 0;
	for (int fileira = 0; fileira < 5; fileira += 1)
	{
		char f = 'A' + fileira;	// pra facilitar
		printf("Fileira %c: ", f );
		for (int coluna = 0; coluna < 4; coluna += 1)
		{
			if (sala.cadeiras[fileira][coluna].status == 0)
			{
				printf("%c%d ", f, coluna + 1);
				n = n + 1;
			}
		}	// for
		printf("\n");
	}	// for
	printf("\n%d poltronas livres\n\n", n);

	// marca algumas como ocupadas

	sala.cadeiras[0][0].status = 1;
	strcpy(sala.cadeiras[0][0].nome, "Cliente na Poltrona A1");

	sala.cadeiras[1][1].status = 1;
	strcpy(sala.cadeiras[1][1].nome, "Cliente na Poltrona B2");

	sala.cadeiras[2][2].status = 1;
	strcpy(sala.cadeiras[2][2].nome, "Cliente na Poltrona C3");

	sala.cadeiras[3][3].status = 1;
	strcpy(sala.cadeiras[3][3].nome, "Cliente na Poltrona D4");

	sala.cadeiras[4][0].status = 1;
	strcpy(sala.cadeiras[4][0].nome, "Cliente na Poltrona E1");

	printf("\nMarcadas como ocupadas A1 B2 C3 D4 E1\n\n");

	// mostra as livres de novo
	printf("\nMostra poltronas LIVRES\n\n");
	n = 0;
	for (int fileira = 0; fileira < 5; fileira += 1)
	{
		char f = 'A' + fileira;	// pra facilitar
		printf("Fileira %c: ", f);
		for (int coluna = 0; coluna < 4; coluna += 1)
		{
			if (sala.cadeiras[fileira][coluna].status == 0)
			{
				printf("%c%d ", f, coluna + 1);
				n = n + 1;
			}
		}	// for
		printf("\n");
	}	// for
	printf("%d poltronas livres\n", n);

	// agora mostra as ocupadas
	printf("\nMostra poltronas OCUPADAS\n\n");
	n = 0;
	for (int fileira = 0; fileira < 5; fileira += 1)
	{
		char f = 'A' + fileira;	// pra facilitar
		printf("Fileira %c:\n", f);
		for (int coluna = 0; coluna < 4; coluna += 1)
		{
			if (sala.cadeiras[fileira][coluna].status == 1)
			{
				printf("    %c%d %s\n", 
					f, coluna + 1,	// poltrona
					sala.cadeiras[fileira][coluna].nome	// nome
				);
				n = n + 1;
			}
		}	// for
	}	// for
	printf("\n%d poltronas ocupadas\n", n);
	return 0;
}

Vi que mudou o tamanho do nome de 50 para 10. Mas pensando no inicial de 50 podia usar algo assim para o status

0        1        2        3        4        5        6        7
0   *    0   *    0   *    0   *    0   *    0   *    0   *
****************************
* Cadeira:        A 1      *
* Situação:    OCUPADA     * 
*  012345678901234567890   *
*  012345678901234567890   *
*  01234567890             *
****************************

****************************
* Cadeira:        A 1      *
* Situação:    LIVRE       * 
*                          *
*                          *
*                          *
****************************

Claro que as primeiras linhas são só uma régua para numerar as colunas

 

Isso deve ajudar a ver como endereçar as estruturas e entender como linha e coluna são implícitas no modelo

 

 

 

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