Sistemas Operacionais e Introdução a Programação (diário 2009-2) - Defesa do código final

De MediaWiki do Campus São José
Revisão de 18h46min de 13 de dezembro de 2009 por Etorresini (discussão | contribs) (New page: =Alysson e Deivid= <syntaxhighlight lang=c> // Inclusão de bibliotecas de funções prontas em C. #include <stdio.h> // entrada e saída de dados do usuário. #include <time.h> // manipula o r...)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Alysson e Deivid

// Inclusão de bibliotecas de funções prontas em C.
#include <stdio.h>	// entrada e saída de dados do usuário.
#include <time.h>		// manipula o relógio do sistema.
#include <string.h>



// Primeira parte do programa:
// - declaração das estruturas de dados
struct evento
{
	char titulo[50];				// Título do evento
	char dataDeInicio[11];		// Data de início
	char horarioDeInicio[6];	// Horário de início
	char dataDeTermino[11];		// Data de término
	char horarioDeTermino[6];	// Horário de término
	char dataDeCriacao[11];		// Data de criação do evento (1 byte a mais para \0)
	char horarioDeCriacao[6];		// Hora de criação do evento (1 byte a mais para \0)
	char descricao[100];			// Um texto explicativo do evento
	char local[100];				// Local de realização
	char estado[20];				// Estados: confirmado, a confirmar, etc.
	char categoria[10];			// Categoria: pessoal, trabalho, etc.
	char recorrencia[20];		// Quantas vezes se repete?
	char linha[500];
	char *leu;
};



// Segunda parte do programa:
// - funções auxiliares
//
// função dia_mes_ano(): mostra a data atual do relógio do sistema
char* dia_mes_ano(char * data)
{
	time_t     agora;
	struct tm  ts;

	agora = time(NULL);
	ts = *localtime(&agora);
	strftime(data, 11, "%d/%m/%Y", &ts);
}
//
// função hora_minuto(): mostra a hora atual do relógio do sistema
char* hora_minuto(char * data)
{
	time_t     agora;
	struct tm  ts;

	agora = time(NULL);
	ts = *localtime(&agora);
	strftime(data, 6, "%H:%M", &ts);
}
//
// função lerNumero(): lê um número via teclado do usuário
int lerNumero()
{
	int numero;
	int leuNumero = 1;
	do
	{
		if (leuNumero == 0)
		{
			printf("Ops! Problemas ao ler o número. Digite-o novamente: ");
		}
		leuNumero = scanf("%d", &numero);	// Se aparecer algo diferente de número
		if (leuNumero == 0)						// A função retornará zero.
		{
			leuNumero = scanf("%*[^\n]");		// Ou seja, "sujeira" como uma vogal.
		}
	} while (leuNumero == 0);					// E a função não encerrará até que o
	return numero;									// digite, mesmo, um número.
}
//
// função lerLinha: lê uma linha inteira até o usuário digitar <ENTER>
void lerLinha(char* linha)
{
	scanf(" %[^\n]", linha); // Com isso, lê-se uma linha inteira.
}



// Função principal
// É aqui em que se define, de fato, o programa.
int main()
{
   FILE *arq1;
	char nomeDoArquivo[100];
	char linha[500];
	char *leu;
        char *auxiliar;
	int opcao; // opção do usuário: criar evento, ler, etc.
	int indice = 0; // quantidade de eventos já cadastrados; ou seja, nenhum (0).
	int indiceTemporario; // índice temporário, baseado na variável índice.
	struct evento eventos[100]; // até 100 eventos possíveis.

	// O programa vai mostrar o menu indefinidamente.
	// O usuário escolherá quando parar.
	do
	{
		// Menu de opções
		printf("\n\nOpção 1: criar um evento.\n");
		printf("Opção 2: mostrar um evento já criado.\n");
		printf("Opção 3: gravar os eventos em um arquivo.\n");
		printf("Opção 4: Leitura e escrita de um arquivo.\n");
		printf("Opção 5: Sair do programa.\n");
		printf("Digite a sua opção: ");
		//
		// O usuário escolhe a opção.
		opcao = lerNumero();
                printf("\n");
		//
		// Para cada opção, um conjunto de instruções a executar.
		switch(opcao)
		{
			// Opção 1: criar um evento.
			case 1:
				printf("\nSobre o evento, informe:\n");
				printf("Título: ");
				lerLinha(eventos[indice].titulo);
				printf("Data de início (dia/mês/ano):");
				lerLinha(eventos[indice].dataDeInicio);
				printf("Hora de início (hora:minuto):");
				lerLinha(eventos[indice].horarioDeInicio);
				printf("Data de término (dia/mês/ano):");
				lerLinha(eventos[indice].dataDeTermino);
				printf("Hora de término (hora:minuto):");
				lerLinha(eventos[indice].horarioDeTermino);
				dia_mes_ano(eventos[indice].dataDeCriacao);		// automático: data do sistema
				hora_minuto(eventos[indice].horarioDeCriacao);	// automático: hora do sistema
				printf("Descrição:");
				lerLinha(eventos[indice].descricao);
				printf("Local de realização:");
				lerLinha(eventos[indice].local);
				printf("Estado (confirmado, a confirmar, etc):");
				lerLinha(eventos[indice].estado);
				printf("Categoria (pessoal, estudos, trabalho, etc):");
				lerLinha(eventos[indice].categoria);
				printf("Recorrência (taxa de repetição):");
				lerLinha(eventos[indice].recorrencia);
				indice = indice + 1; // Um evento foi adicionado. Incrementa o indice.

				break;
			// Opção 2: mostrar um evento já cadastrado.
			case 2:
				if(indice == 0)
				{
					printf("Não há eventos cadastrados.\n");
				}
				else
				{
					printf("Há %d eventos cadastrados.\n", indice);
					printf("Escolha um evento entre 0 e %d: ",indice-1);
					opcao = lerNumero();
					if (opcao < 0 || opcao > indice)
					{
						printf("Número fora dos limites.\n");
					}
					else
					{
						printf("\nEvento número: %d\n", opcao);
						printf("Título: %s\n", eventos[opcao].titulo);
						printf("Data de início: %s\n", eventos[opcao].dataDeInicio);
						printf("Hora de início: %s\n", eventos[opcao].horarioDeInicio);
						printf("Data de término: %s\n", eventos[opcao].dataDeTermino);
						printf("Hora de término: %s\n", eventos[opcao].horarioDeTermino);
						printf("Data de criação: %s\n", eventos[opcao].dataDeCriacao);
						printf("Hora de criação: %s\n", eventos[opcao].horarioDeCriacao);
						printf("Descrição: %s\n", eventos[opcao].descricao);
						printf("Local de realização: %s\n", eventos[opcao].local);
						printf("Estado: %s\n", eventos[opcao].estado);
						printf("Categoria: %s\n", eventos[opcao].categoria);
						printf("Recorrência: %s\n", eventos[opcao].recorrencia);
					}
				}
				break;
			// Opção padrão: é interessante criar uma opção padrão para
			// informar o usuário quando ele digita um número fora da lista
			// de opções. Neste caso, 1 > número > 3.
			case 3:
				printf("Informe o nome completo do arquivo: ");
				lerLinha(nomeDoArquivo);
				arq1 = fopen("/home/aluno/Desktop/teste.txt", "w");
				if (arq1)
				{
					for(indiceTemporario=0; indiceTemporario < indice; indiceTemporario++)
					{
						printf("Gravando evento número %d...\n", indiceTemporario); // vai pra tela (printf)
//						fprintf(arq1, "Evento número %d:\n", indiceTemporario);  // vai pro arquivo (fprintf)
						fprintf(arq1, "Título: %s\n", eventos[indiceTemporario].titulo);
						fprintf(arq1, "Data de Incício: %s\n", eventos[indiceTemporario].dataDeInicio);
						fprintf(arq1, "Hora de Início: %s\n", eventos[indiceTemporario].horarioDeInicio);
						fprintf(arq1, "Data de Termino do evento: %s\n", eventos[indiceTemporario].dataDeTermino);
						fprintf(arq1, "Horário de termino: %s\n", eventos[indiceTemporario].horarioDeTermino);
						fprintf(arq1, "Data de criação: %s\n", eventos[indiceTemporario].dataDeCriacao);
						fprintf(arq1, "Hora de Criação: %s\n", eventos[indiceTemporario].horarioDeCriacao);
						fprintf(arq1, "Descrição do evento: %s\n", eventos[indiceTemporario].descricao);
						fprintf(arq1, "Local do evento: %s\n", eventos[indiceTemporario].local);
						fprintf(arq1, "Estado: %s\n", eventos[indiceTemporario].estado);
						fprintf(arq1, "Categoria do evento: %s\n", eventos[indiceTemporario].categoria);
						fprintf(arq1, "Recorrência: %s\n", eventos[indiceTemporario].recorrencia);

					}
					fclose(arq1);
					printf("Arquivo %s gravado com sucesso.\n", nomeDoArquivo);
				}
				break;
			case 4:
				printf("Informe o nome completo do arquivo: ");
				lerLinha(nomeDoArquivo);
                                printf("\n");
		//		arq1 = fopen(nomeDoArquivo, "r");
                                arq1 = fopen("/home/aluno/Desktop/teste.txt", "r");

                                if(arq1)
				{
					indice = 0; // começa a ler o primeiro evento...
					do
					{
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].titulo,auxiliar+2);
							printf("Título do evento número %d= %s", indice, eventos[indice].titulo);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].dataDeInicio,auxiliar+2);
							printf("Data de início do evento número %d= %s", indice, eventos[indice].dataDeInicio);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].horarioDeInicio,auxiliar+2);
							printf("Hora de Incício %d= %s", indice, eventos[indice].horarioDeInicio);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].dataDeTermino,auxiliar+2);
							printf("Data de Termino do evento %d= %s", indice, eventos[indice].dataDeTermino);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].horarioDeTermino,auxiliar+2);
							printf("Horário de termino %d= %s", indice, eventos[indice].horarioDeTermino);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].dataDeCriacao,auxiliar+2);
							printf("Data de criação %d= %s", indice, eventos[indice].dataDeCriacao);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].horarioDeCriacao,auxiliar+2);
							printf("Hora de Criação %d= %s", indice, eventos[indice].horarioDeCriacao);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].descricao,auxiliar+2);
							printf("Descrição do evento %d= %s", indice, eventos[indice].descricao);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].local,auxiliar+2);
							printf("Local do evento %d= %s", indice, eventos[indice].local);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].estado,auxiliar+2);
							printf("Estado %d= %s", indice, eventos[indice].estado);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].categoria,auxiliar+2);
							printf("Categoria do evento %d= %s", indice, eventos[indice].categoria);
						}
						if (fgets(linha, sizeof(linha), arq1))
						{
                                                        auxiliar = strchr(linha,':');
							strcpy(eventos[indice].recorrencia,auxiliar+2);
							printf("Recorrência %d= %s", indice, eventos[indice].recorrencia);
						}
						// .. próximos itens de cada evento...
						indice = indice + 1; // vai para o próximo evento...
                                                printf("\n");
					} while (! feof(arq1));
					fclose(arq1);
				}
				else
				{
					printf("ATENÇÃO! Não é possível abrir o arquivo %s para leitura.\n", nomeDoArquivo);
				}
				printf("\nDeseja mudar o seu conteúdo?\n");
				printf("1 - Sim\n");
				printf("2 - Não\n");
				opcao = lerNumero();
				switch(opcao)
				{
					case 1:
						arq1 = fopen("/home/aluno/Desktop/teste.txt", "w");
						if(arq1)
						{
							printf("Digite quantas frases quiser.\n");
							printf("Para terminar, digite uma linha");
							printf(" contendo apenas a expressão \"EOF\":\n");
							do
							{
								lerLinha(linha);
								if(strcmp(linha,"EOF") != 0) // as string são diferentes
								{
									fprintf(arq1, "%s\n", linha);
								}
							} while (strcmp(linha,"EOF"));
							fclose(arq1);
						}
						else
						{
							printf("ATENÇÃO! Não é possível abrir o arquivo %s para escrita.\n", nomeDoArquivo);
						}
						break;
					case 2:
						printf("Preservando o conteúdo original...\n");
						break;
					default:
						printf("Número inválido.\n");
				}
				break;

			// Opção 3: sair do programa.
			case 5:
				printf("Fim do programa. Adeus!\n");
				break;
			default:
				printf("Por favor, escolha um número entre 1 e 3.\n");
	// Essa estrutura de repetição (do..while) rodará enquanto a opção
	// for diferente de 3.
 			} // fim do switch(opcao)
 		} while (opcao != 5);
	}