Algumas sugestões de melhoria.
Primeiro vc declara um array com 11 posições:
char *chairs[11];
Mas depois vc ignora a primeira posição, pois faz o for
começando do 1
. Mas a primeira posição de um array é zero, então não faz sentido ignorar a primeira posição.
Enfim, se quer 10 cadeiras, crie um array com 10 posições. Se o número da posição não corresponde ao da cadeira, basta somar/subtrair 1 conforme a necessidade.
Uma opção é definir a quantidade de cadeiras (logo depois dos include
's):
#define QTD_CHAIRS 10 // quantidade de cadeiras
E depois declare o array com este tamanho:
char *chairs[QTD_CHAIRS];
Na função que imprime as cadeiras, não precisa de todas essas strings intemediárias, basta imprimir direto o que vc quer para cada caso:
void print_chairs(char *chairs[]) {
printf("Cadeiras disponíveis:\n");
for (int i = 0; i < QTD_CHAIRS; i++) {
if (strcmp(chairs[i], "C") == 0) {
printf("[B%d] ", i + 1);
} else {
printf("[--] ");
}
}
printf("\n");
}
E o main
ficaria assim - com as devidas correções:
int main() {
char *chairs[QTD_CHAIRS];
for (int i = 0; i < QTD_CHAIRS; i++) {
chairs[i] = malloc(2);
strcpy(chairs[i], "C");
}
while (1) {
clear_screen();
print_chairs(chairs);
char cadeira[4];
printf("Reservar a cadeira: ");
scanf("%3s", cadeira);
for (int i = 0; cadeira[i]; i++) {
cadeira[i] = toupper(cadeira[i]);
}
int numeroCadeira = atoi(cadeira + 1);
if (cadeira[0] != 'B' || numeroCadeira < 1 || numeroCadeira > QTD_CHAIRS) {
printf("Cadeira inválida!\n");
} else if (strcmp(chairs[numeroCadeira - 1], "C") == 0) {
strcpy(chairs[numeroCadeira - 1], "--");
printf("Cadeira %s RESERVADA!\n", cadeira);
} else {
printf("Cadeira %s já está reservada!\n", cadeira);
}
char opcao[2];
printf("Quer reservar outra cadeira? [S/N] ");
scanf(" %1s", opcao);
for (int i = 0; opcao[i]; i++) {
opcao[i] = toupper(opcao[i]);
}
if (strcmp(opcao, "S") != 0) {
printf("Fim Das Escolhas!\n");
break;
}
}
for (int i = 0; i < QTD_CHAIRS; i++) {
free(chairs[i]);
}
return 0;
}
Alternativa
Mas será que precisa ser um array de strings? Se o array só guarda a informação sobre a cadeira (se está ou não reservada), poderia muito bem ser um array de inteiros. Por exemplo, se o valor for zero, indica que está vago, se for 1, está ocupado. Ficaria assim:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define QTD_CHAIRS 10 // quantidade de cadeiras
void clear_screen() {
system("cls");
}
void print_chairs(int chairs[]) {
printf("Cadeiras disponíveis:\n");
for (int i = 0; i < QTD_CHAIRS; i++) {
if (chairs[i] == 0) { // disponível
printf("[B%d] ", i + 1);
} else { // ocupado
printf("[--] ");
}
}
printf("\n");
}
int main() {
// todos os elementos são inicializados com zero
int chairs[QTD_CHAIRS] = { 0 };
while (1) {
clear_screen();
print_chairs(chairs);
char cadeira[4];
printf("Reservar a cadeira: ");
scanf("%3s", cadeira);
int numeroCadeira = atoi(cadeira + 1);
if (toupper(cadeira[0]) != 'B' || numeroCadeira < 1 || numeroCadeira > QTD_CHAIRS) {
printf("Cadeira inválida!\n");
} else if (chairs[numeroCadeira - 1] == 0) {
chairs[numeroCadeira - 1] = 1; // indica que a cadeira está ocupada
printf("Cadeira %s RESERVADA!\n", cadeira);
} else {
printf("Cadeira %s já está reservada!\n", cadeira);
}
char opcao[2];
printf("Quer reservar outra cadeira? [S/N] ");
scanf(" %1s", opcao);
for (int i = 0; opcao[i]; i++) {
opcao[i] = toupper(opcao[i]);
}
if (strcmp(opcao, "S") != 0) {
printf("Fim Das Escolhas!\n");
break;
}
}
return 0;
}