Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

1. Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

José
sistemasjose

(usa Linux Mint)

Enviado em 22/06/2018 - 22:11h

Boa noite a todos!
Preciso elaborar um programa que contenha em um menu do seguinte formato :

//Nome do programa:
SISTEMA DE AGENDA DE TELEFONES

1 – CADASTRAR
2 – PESQUISAR
3 – ALTERAR
4 ­ EXCLUIR
5 – CLASSIFICAR
6 – LISTAR
7 ­ SAIR

ESCOLHA UMA OPÇÃO : [  ]

É necessário construir rotinas que desempenham cada uma das funções do menu acima. Os dados da
agenda deverão ser : nome, telefone e celular.

Agradeço desde já pela possível ajuda! abraço a todos!


  


2. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

Paulo Jr
Pebis

(usa Debian)

Enviado em 22/06/2018 - 22:16h

Mas qual a ajuda que você precisa?


3. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/06/2018 - 11:54h

Se você quiser aprender, arregace as mangas e comece a trabalhar.

Se não quiser aprender, deve haver milhares de versões de programas assim na Internet.


4. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 23/06/2018 - 12:16h

não entendo isso, os kras são voluntários nos cursos e insistem em burlar o mesmo.
Oras, se não quer fazer programas/Scripts, parte pra outro curso ... corte & costura, culinária ... sei lá.

------------------------------------------| Linux User #621728 |-----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



5. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 24/06/2018 - 09:00h

José,

Onde você irá armazenar os contatos da sua agenda?
Usará um banco de dados?
Uma escolha simples seria o SQLite 3.

Abaixo uma idéia de um programa com o menu principal, que chama as funções necessárias.
#include <stdio.h>

// Menu principal
int exibirMenu() {
char *texto;
int opcao=0;

texto = "\n----- SISTEMA AGENDA DE TELEFONES -----\n\n" \
"1. Cadastrar um contato\n" \
"2. Pesquisar um contato\n" \
"3. Alterar um contato\n" \
"4. Excluir um contato\n" \
"5. Classificar\n" \
"6. Listar os contatos\n" \
"7. Sair\n\n" \
"Opção: ";

printf("%s", texto);

scanf("%d", &opcao);

while ( opcao < 1 && opcao > 7) {
printf("\nOpção inválida!\n\nOpção: ");
scanf("%d", &opcao);
}

return opcao;
}

// Função para incluir um contato
int cadastrarContato() {
printf("\nCadastrando um contato...\nCriar código!\n");
return 1;
}

// Função principal do sistema
int main() {
int opcao = 0;

while (opcao != 7) {
opcao = exibirMenu();

switch (opcao) {
case 1:
if (cadastrarContato()) {
printf("\nContato incluído com sucesso!\n");
} else {
printf("\nFalha ao incluir um Contato.\n");
}
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
}
}

return 0;
}

Abraço,
Diego M. Rodrigues


6. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/06/2018 - 00:41h

diegomrodrigues escreveu:

Onde você irá armazenar os contatos da sua agenda?
Usará um banco de dados?
Uma escolha simples seria o SQLite 3.


Não sei como anda a complexidade dos exercícios escolares de hoje em dia. Mas se for, como parece ser, um exercício introdutório, eu acho muito pouco provável que ele precise de armazenamento em banco de dados.

Abaixo uma idéia de um programa com o menu principal, que chama as funções necessárias.


A ideia da comunidade é mais tirar dúvidas e estimular o uso de boas práticas de programação, não a de entregar coisas prontas. Tudo bem que seu código não chegou a implementar uma solução completa para tudo o que pede o enunciado, mas apresentou uma solução a um dos itens que foram pedidos ali. Então, por favor, tome cuidado.

Como você trouxe um trecho funcional, permita-me fazer alguns comentários ao que vai no seu código.

#include <stdio.h>

// Menu principal
int exibirMenu() {


Ao dar nomes a suas funções, faça com que ela reflita da melhor maneira possível o que a função faz. O corpo da função, que vai abaixo, de fato exibe um menu, mas mais muito mais do que apenas exibir. Na verdade, ela tenta também tratar a resposta do usuário ao menu exibido. Assim sendo, o nome poderia contemplar também essas funções que vão além da exibição.

Outro aspecto, que se aplica particularmente a esta função, e que, em parte, pode ser tomada mais como gosto pessoal do que uma regra geral, é que possivelmente não valeria a pena criar uma função pequena, como é esta, se tal função for chamada apenas uma vez, num único ponto do programa, mas poderia ser preferível levar seu conteúdo diretamente para o local onde se faria a chamada (a não ser que você implemente a mudança no laço de repetição que eu vou comentar mais abaixo).

[quote]
   char *texto;
int opcao=0;

texto = "\n----- SISTEMA AGENDA DE TELEFONES -----\n\n" \
"1. Cadastrar um contato\n" \
"2. Pesquisar um contato\n" \
"3. Alterar um contato\n" \
"4. Excluir um contato\n" \
"5. Classificar\n" \
"6. Listar os contatos\n" \
"7. Sair\n\n" \
"Opção: ";


Esses sinais de continuação de linhas (barra invertida como último caráter de cada linha) não são necessários. Melhor os evitar.


printf("%s", texto);


Para que colocar o texto numa variável e depois o imprimir indiretamente com printf()? Seria mais simples fazer simplesmente algo como o seguinte.

printf(
"--- MENU ---\n"
"1. opt 1\n"
"2. opt 2\n"
"... etc ..."
);



scanf("%d", &opcao);

while ( opcao < 1 && opcao > 7) {
printf("\nOpção inválida!\n\nOpção: ");
scanf("%d", &opcao);
}


É ótimo validar os dados digitados. Contudo, você só está tratando um conjunto muito reduzido de casos inválidos, deixando de fora a maioria das possibilidades, e justamente as que têm consequências mais sérias.

No código acima, você se prepara para o caso de o usuário digitar um número inválido. Contudo, o que aconteceria com seu código se o usuário digitasse não um número, mas algo formado por caracteres não-numéricos? E se acontecesse um erro sobre a entrada (fim de arquivo, ou se a conexão cair)?

Se você quer validar dados, sobretudo os que são lidos com scanf(), você deve começar testando o próprio valor de retorno de scanf(), e possivelmente usando como argumento da função uma string de formatação que ajude a detectar a presença de dados problemáticos na entrada.

Veja um exemplo de verificação mais cautelosa.

do {
unsigned char c;
int n_conversions;
printf("Digite o nº da opção desejada: ");
scanf(" %d%c", &opcao, &c);
if(n_conversions==2 && isspace(c)){
if(opcao>=1 && opcao<=7)
break; // Leitura bem sucedida. Sai do loop.
// Caso contrário, o número está fora da faixa. Deixa seguir o loop.
}
else if(feof(stdin) || ferror(stdin)){
fprintf(stderr, "Erro de leitura. Abortando programa.\n");
exit(1);
}
else{
// Caso contrário, dados recebidos contêm caracteres espúrios. Elimina-os, antes de tentar de novo.
int ch;
do {
ch=getchar();
if(ch==EOF){
fprintf(stderr, "Erro de leitura. Abortando programa.\n");
exit(1);
}
} while(ch!='\n');
}
fprintf(stderr, "Dados inválidos na entrada. Tente novamente.\n\n");
} while(true);



return opcao;
}

// Função para incluir um contato
int cadastrarContato() {
printf("\nCadastrando um contato...\nCriar código!\n");
return 1;
}

// Função principal do sistema
int main() {
int opcao = 0;

while (opcao != 7) {


Esse teste de opcao, que foi inicialmente definida com um valor que de outro modo seria inválido, é muito pouco elegante.

O comando de controle de fluxo while é para casos de laços de repetição que podem ser executados zero ou mais vezes. Se você tem um laço de repetição que tem de executar pelo menos uma vez, geralmente é preferível usar a construção dowhile.

Contudo, como você optou por colocar o desenho do menu e a digitação da opção numa função à parte, você poderia, sim, usar while sem ter de recorrer a um valor fictício.

while((opcao=imprimeeprocessamenu())!=7){
/* ... */
}


                opcao = exibirMenu();

switch (opcao) {
case 1:
if (cadastrarContato()) {
printf("\nContato incluído com sucesso!\n");
} else {
printf("\nFalha ao incluir um Contato.\n");
}
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
}
}

return 0;
}



7. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 25/06/2018 - 08:29h

paulo1205 escreveu:
...
A ideia da comunidade é mais tirar dúvidas e estimular o uso de boas práticas de programação, não a de entregar coisas prontas. Tudo bem que seu código não chegou a implementar uma solução completa para tudo o que pede o enunciado, mas apresentou uma solução a um dos itens que foram pedidos ali. Então, por favor, tome cuidado.

Como você trouxe um trecho funcional, permita-me fazer alguns comentários ao que vai no seu código.
...


Paulo,
Obrigado pelos comentários do código.
Abraço,
Diego M. Rodrigues




8. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

José
sistemasjose

(usa Linux Mint)

Enviado em 26/06/2018 - 16:00h

Pebis escreveu:

Mas qual a ajuda que você precisa?


Obrigado por responder esse tópico!
Já comecei a desenvolver o código.
Se quiser posso postar para você dar uma olhada!
Preciso de ajuda no excluir e listar.
Abraço!



9. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

José
sistemasjose

(usa Linux Mint)

Enviado em 26/06/2018 - 16:03h

diegomrodrigues escreveu:

José,

Onde você irá armazenar os contatos da sua agenda?
Usará um banco de dados?
Uma escolha simples seria o SQLite 3.

Abaixo uma idéia de um programa com o menu principal, que chama as funções necessárias.
#include <stdio.h>

// Menu principal
int exibirMenu() {
char *texto;
int opcao=0;

texto = "\n----- SISTEMA AGENDA DE TELEFONES -----\n\n" \
"1. Cadastrar um contato\n" \
"2. Pesquisar um contato\n" \
"3. Alterar um contato\n" \
"4. Excluir um contato\n" \
"5. Classificar\n" \
"6. Listar os contatos\n" \
"7. Sair\n\n" \
"Opção: ";

printf("%s", texto);

scanf("%d", &opcao);

while ( opcao < 1 && opcao > 7) {
printf("\nOpção inválida!\n\nOpção: ");
scanf("%d", &opcao);
}

return opcao;
}

// Função para incluir um contato
int cadastrarContato() {
printf("\nCadastrando um contato...\nCriar código!\n");
return 1;
}

// Função principal do sistema
int main() {
int opcao = 0;

while (opcao != 7) {
opcao = exibirMenu();

switch (opcao) {
case 1:
if (cadastrarContato()) {
printf("\nContato incluído com sucesso!\n");
} else {
printf("\nFalha ao incluir um Contato.\n");
}
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
}
}

return 0;
}

Abraço,
Diego M. Rodrigues


Olá! Desde já agradeço a ajuda!
É um programa simples, não é necessário banco de dados.
Os contatos da Agenda irão ser salvos em um arquivos "clientes.dat"
Estou trabalho com arquivo.

Segue o código faltando apenas fazer o excluir e o listar para ficar completo.

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

typedef struct {
char nom[20];
char tel[14];
char cel[14];
int exc;
} tAgenda;

FILE *file;
tAgenda tmp;


tAgenda a;
int c;

int incluir(){
//char str[80];
file = fopen("clientes.dat", "a");
//solicitar dados do novo registro
printf("\nDigite o nome: ");
scanf("%s",&a.nom);
printf("\nDigite o fone: ");
scanf("%s",&a.tel);
printf("\nDigite o celular: ");
scanf("%s",&a.cel);
fwrite(a.nom,20,1,file);
fwrite(a.tel,14,1,file);
fwrite(a.cel,14,1,file);
fclose(file);
}

int pesquisar() {
int i=0;
char busca[30];
file = fopen("clientes.dat", "r");
printf("Buscar Clientes\n==================\n\n");
printf("Qual cliente esta Buscando?\n");
scanf("%s", &busca);

rewind(file);
fread(tmp.nom, 20, 1, file);
fread(tmp.tel, 14, 1, file);
fread(tmp.cel, 14, 1, file);
do{
if (strcmp(busca, tmp.nom) == 0) {
printf("\nCliente Encontrado!\n");
printf("NOME: %s | TEL: %S | CEL: %s\n", tmp.nom, tmp.tel, tmp.cel);
return ftell(file);
}
i++;
fread(tmp.nom, 20, 1, file);
fread(tmp.tel, 14, 1, file);
fread(tmp.cel, 14, 1, file);
}while(!feof(file));
printf("\nCliente Nao Encontrado!\n");
fclose(file);
return -1;
}


int alterar() {
printf("Alterar Cliente\n==================\n\n");
tAgenda agenda[50];
int i=0;
char busca[30];
int achou = 0;
printf("Qual cliente esta Buscando?\n");
scanf("%s", &busca);
file=fopen("clientes.dat","a+");
if(!file){printf("ERRO AO ABRIR ARQUIVO!");
}
rewind(file);
fread(agenda[i].nom,20,1,file);
fread(agenda[i].tel,14,1,file);
fread(agenda[i].cel,14,1,file);
do{
if (strcmp(busca, agenda[i].nom) == 0){
achou = 1;
printf("\nDigite o Nome do Novo Cliente:\n");
scanf("%s", &agenda[i].nom);
printf("Digite o telefone:\n");
scanf("%s", &agenda[i].tel);
printf("Digite o celular:\n");
scanf("%s", &agenda[i].cel);
}
i++;
fread(agenda[i].nom,20,1,file);
fread(agenda[i].tel,14,1,file);
fread(agenda[i].cel,14,1,file);
}while(!feof(file));
fclose(file);
if (achou == 1){
file = fopen("clientes.dat", "w");
for(i=0;i<50;i++){
if (strcmp(agenda[i].nom,"")!=0){
fwrite(agenda[i].nom, 20, 1, file);
fwrite(agenda[i].tel, 14, 1, file);
fwrite(agenda[i].cel, 14, 1, file);
}
else
break;
}
fclose(file);
}
else
printf("\nCliente Nao Encontrado!\n");
}


int excluir() {
}

int classificar() {
}



int listar(){
int i=0;
file = fopen("clientes.dat", "r");
rewind(file);
fread(tmp.nom, 20, 1, file);
fread(tmp.tel, 14, 1, file);
fread(tmp.cel, 14, 1, file);
do{
printf("NOME: %s | TEL: %s | CEL: %s\n", tmp.nom, tmp.tel, tmp.cel);
i++;
fread(tmp.nom, 20, 1, file);
fread(tmp.tel, 14, 1, file);
fread(tmp.cel, 14, 1, file);
}while(!feof(file));
fclose(file);

}






int main()
{

int opc;
do{
printf("============================<< SISTEMA DE CADASTRO DE CLIENTES >>============================\n");
printf("1 - Incluir\n");
printf("2 - Alterar\n");
printf("3 - Excluir\n");
printf("4 - Ordenar\n");
printf("5 - Listar\n");
printf("6 - Pesquisar\n");
printf("7 - Sair\n");
printf("DIGITE UMA OPCAO: ");
scanf("%d",&opc);
printf("=======================================================================\n");
if(opc==1) incluir();
if(opc==2) alterar();
if(opc==3) excluir();
if(opc==4) classificar();
if(opc==5) listar();
if(opc==6)pesquisar();
}while(opc!=7);
return 0;
}



10. Re: Preciso desenvolver um script em c e estou com dificuldade, alguém pode me ajudar?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/06/2018 - 16:32h

Já que você tem uma estrutura para representar o registro (incluindo um campo exc, que creio que deve ser usado para marcar registros excluídos), e faz todas as manipulações usando fwrite() e fread(), parece-me que você deveria realizar tais operações com registro inteiro (um dado do tipo tAgenda), em lugar de campo a campo.

Por exemplo, sua função de inclusão poderia ser reescrita da seguinte maneira (não corrijo todos os aspectos que acho que poderiam ser melhorados, mas apenas a escrita no arquivo, o retorno da função, os argumentos que ela (não) recebe, e uma verificação muito primária — e insuficiente — de dados inválidos na entrada).
// Função incluir retorna 0 se inclusão falhar, 1 se for bem sucedida.
int incluir(void){
tAgenda reg;
//solicitar dados do novo registro
printf("Digite o nome: ");
if(scanf(" %19[^\n]%*1[\n]", reg.nom)!=1)
return 0;
printf("Digite o fone: ");
if(scanf(" %13[^\n]%*1[\n]", reg.tel)!=1)
return 0;
printf("Digite o celular: ");
if(scanf(" %13[^\n]%*1[\n]", reg.cel)!=1)
return 0;
reg.exc=0; // Registro não está excluído.
file = fopen("clientes.dat", "a");
if(!file)
return 0;
int escrito=fwrite(®, sizeof reg, 1, file);
return fclose(file)==0 && escrito;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts