Ir ao conteúdo
  • Cadastre-se

ngiovana

Membro Júnior
  • Posts

    10
  • Cadastrado em

  • Última visita

Reputação

10
  1. Estou fazendo um trabalho em que tenho que fazer uma struct, que no caso seria a ficha de cadastro de uma academia, e mostrar um menu com as opções de salvar no arquivo, consultar e excluir. Para a consulta, preciso fazer consulta por dois métodos. No caso, fiz por ID do usuário e CPF, porém, em ConsultarPorCPF() está dando um erro em if(ficha == NULL || ficha->cpf == cpf) e não sei porque. Segue o código: #include<stdio.h> #include<stdlib.h> #include <string.h> #define ARQUIVO "Ficha.dat" typedef struct { int id; float peso; float altura; char objetivo[70]; char nome[70]; char cpf[11]; char rg[7]; char telefone[11]; char email[70]; char endereco[70]; }Ficha; void menu(); int LerString(char *str, int tammax); int Cadastro(); int PedeDados(Ficha *ficha); int Gravar(Ficha *ficha); int ConsultarPorID(); int ConsultarPorCPF(); int MostraFicha(Ficha *ficha); int Excluir(); Ficha *LeProximaFicha(FILE *file); int main() { menu(); return 0; } void menu() { int escolha; int opcao; do { printf("\n-----------------------------------------"); printf("\n\nMenu:\n\n"); printf("0. Sair\n"); printf("1. Novo Cadastro\n"); printf("2. Consulta por ID\n"); printf("3. Consultar por CPF\n"); printf ("4. Exclusão\n"); scanf("%d",&escolha); switch (escolha) { case 0: printf("Fim!\n"); break; case 1: Cadastro(); break; case 2: ConsultarPorID(); break; case 3: ConsultarPorCPF(); break; case 4: Excluir(); break; default: printf("Opção invalida. Tente novamente!\n"); break; } } while (escolha != 0); } int Cadastro() { Ficha *ficha = (Ficha *) malloc (sizeof (Ficha)); if(!PedeDados(ficha)) { free(ficha); return 0; } if(!Gravar(ficha)) { free(ficha); return 0; } free(ficha); return 1; } int PedeDados(Ficha *ficha) { if(ficha == NULL) { printf("\nFicha invalida para pedir dados!\n"); return 0; } else {ficha->id++;} printf("ID: "); fflush(stdin); scanf ("%d",ficha->id); printf("\nNome: "); fflush(stdin); LerString(ficha->nome, 70); printf("CPF: "); fflush(stdin); LerString(ficha->cpf, 11); printf("RG: "); fflush(stdin); LerString(ficha->rg, 7); printf("Telefone: "); fflush(stdin); LerString(ficha->telefone, 11); printf("Endereço: "); fflush(stdin); LerString(ficha->endereco, 70); printf("Email: "); fflush(stdin); LerString(ficha->email, 70); printf("Peso: "); fflush(stdin); scanf("%f", &ficha->peso); printf("Altura: "); fflush(stdin); scanf("%f", &ficha->altura); printf("Objetivo: "); fflush(stdin); LerString(ficha->objetivo, 70); return 1; } int LerString(char *str, int tammax) { int c, i=0; c = getchar(); while (i==0 || (c != '\n' && c != EOF)) { if(c == '\n' || c == EOF) { if(i >= 0) i--; } else if(i < tammax - 1) { str[i] = c; } c = getchar(); i++; } if(i >= tammax - 1) i = tammax - 1; str[i] = '\0'; fflush(stdin); return i; } int Gravar(Ficha *ficha) { FILE *file; file = fopen (ARQUIVO, "a"); if (file == NULL) { printf("\nErro ao abrir o arquivo!\n"); return 0; } if(ficha == NULL) { printf("\nFicha invalida!\n"); return 0; } if(fwrite (ficha, sizeof(Ficha), 1, file) == 0) printf("Erro ao gravar Ficha %d !\n", ficha->id); fclose (file); return 1; } int ConsultarPorID() { FILE *file; int id; Ficha *ficha = NULL; printf("\n\nInforme o ID: "); fflush(stdin); scanf("%d",&id); fflush(stdin); file = fopen (ARQUIVO, "rb"); if (file == NULL) { printf("\nErro ao abrir o arquivo!\n"); return 0; } while(1) { if(feof(file)) break; ficha = LeProximaFicha(file); if(ficha == NULL || ficha->id == id) break; free(ficha); } if(ficha != NULL) { printf("\nFicha encontrada no banco de dados!\n"); MostraFicha(ficha); free(ficha); } else { printf("\nFicha %d nao encontrada!\n", id); } fclose(file); return 1; } int ConsultarPorCPF() { FILE *file; char cpf; Ficha *ficha = NULL; printf("\n\nInforme o CPF: "); fflush(stdin); scanf("%s",&cpf); fflush(stdin); file = fopen (ARQUIVO, "rb"); if (file == NULL) { printf("\nErro ao abrir o arquivo!\n"); return 0; } while(1) { if(feof(file)) break; ficha = LeProximaFicha(file); if(ficha == NULL || ficha->cpf == cpf) break; free(ficha); } if(ficha != NULL) { printf("\nFicha encontrada no banco de dados!\n"); MostraFicha(ficha); free(ficha); } else { printf("\nFicha %d nao encontrada!\n", cpf); } fclose(file); return 1; } int MostraFicha(Ficha *ficha) { if(ficha == NULL) { printf("\nFicha invalida para mostrar!\n"); return 0; } printf("\nID: %d\n", ficha->id); printf("Nome: %s\n", ficha->nome); printf("CPF: %s\n", ficha->cpf); printf("RG: %s\n", ficha->rg); printf("Telefone: %s\n", ficha->telefone); printf("Endereço: %s\n", ficha->endereco); printf("Email: %s\n", ficha->email); printf("Peso: %.2f\n", ficha->peso); printf("Altura: %.2f\n", ficha->altura); printf("Objetivo: %s\n", ficha->objetivo); return 1; } Ficha *LeProximaFicha(FILE *file) { Ficha *ficha; if (file == NULL) { printf("\nArquivo invalido!\n"); return 0; } ficha = (Ficha *) malloc (sizeof (Ficha)); if(fread(ficha, sizeof(Ficha), 1, file) == 0) { printf("Erro ao ler Ficha!\n"); free(ficha); ficha = NULL; } return ficha; } Também falta a parte de exclusão de arquivo, que não consegui fazer.
  2. Obrigada, funcionou sim!! Só uma dúvida, porque é preciso criar o ponteiro *string2=string?
  3. Estou aprendendo ponteiros e tenho que fazer a seguinte questão: 5. Faça um programa utilizando a notação de ponteiros que exiba uma “string” em letras minúsculas. Observação: a função em C que converte uma string de maiúscula para minúscula é tolower( ), e ela pertence a biblioteca <ctype.h>. O código que fiz foi esse: #include <conio.h> #include <stdio.h> #include <ctype.h> #include <locale.h> void main ( ) { char *string[100];; int i,tam; setlocale(LC_ALL,"Portuguese"); printf ("Digite uma palavra em maíusculo: "); gets(string); printf("%s",string); printf ("\n---------------------------------------------------------\nString em minúsculo:\n"); tam=strlen(string); printf("tam:%d\n",tam); for (i=0;i<tam;i++){ string[i]=tolower(string[i]); } printf("%s",string); } porém, a última saída só mostra a primeira letra da palavra, como faço para mostrar a palavra inteira?
  4. Estava fazendo uns exercícios e fiquei com dúvida em um que pedia para verificar se um número é triangular. O código abaixo é a resposta do exercício, eu tinha feito a mesma coisa, exceto por ter usado chaves para o for. /* Programa que determina se um numero e' triangular */ #include <stdio.h> int main() { int i, n; printf("Digite o valor de n: "); scanf("%d",&n); /* for com comando vazio! */ for (i = 1; i*(i+1)*(i+2) < n; i++) ; if (i*(i+1)*(i+2) == n) printf("%d e' o produto %d*%d*%d\n", n, i, i+1, i+2); else printf("%d nao e' triangular\n", n); return 0; } É a primeira vez que vejo isso, e não consegui entender o motivo de dar errado se usar as chaves no for, nem quando se aplica o for com comando vazio.
  5. Obrigada, entendi!! Mas agora está dando um erro no meu código, não sei porque. Ele está assim: #include <stdio.h> #include <stdlib.h> void main (){ int a[100],b[100],u[200],i,escolha,escolha2,va,vb,cont=0,cont2=0,n,j,maior=0; int escolha3,contab=0,contba=0; do{ do{ printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n"); scanf ("%d",&escolha); if (escolha!=1 && escolha!=2){ printf ("Erro. Digite novamente!\n"); } }while (escolha!=1 && escolha!=2); do{ switch (escolha){ case 1: cont=0; va=0; for (i=0;i<100 && a[i-1]!=0;i++){ do{ printf ("Digite o valor para a posição %d, ou 0 para sair: ",i); scanf ("%i",&a[i]); if (a[i]==a[i-1]){ printf ("Número repetido. Digite novamente!\n"); } }while (a[i]==a[i-1]); va++; } cont++; break; case 2: cont2=0; vb=0; for (i=0;i<100 && b[i-1]!=0;i++){ do{ printf ("Digite o valor para a posição %d, ou 0 para sair: ",i); scanf ("%i",&b[i]); if (b[i]==b[i-1]){ printf ("Número repetido. Digite novamente!\n"); } }while (b[i]==b[i-1]); vb++; } cont2++; break; } printf ("Caso queira reescrever os valores do conjunto, digite 3. Caso contrário, digite 0.\n"); scanf ("%d",&n); if (n==3){ printf ("Digite 1 para reescrever o conjunto 1, ou 2 para reescrever o conjunto 2.\n"); scanf ("%d",&escolha); } }while (n==3); }while (cont!=1 || cont2!=1); if (va>vb){ maior=va; } if (vb>=va){ maior=vb; } printf ("O conjunto A é: \n"); if (a[0]==0){ printf ("Vazio."); } else{ for (i=0;i<va-1;i++){ printf ("%i ",a[i]); } } if (b[0]==0){ printf("Vazio."); } else{ printf ("\nO conjunto B é: \n"); for (i=0;i<vb-1;i++){ printf ("%i ",b[i]); } } printf ("\nUnião entre os conjuntos:\n"); for (i=0;i<va-1;i++){ for (j=0;j<vb-1;j++){ if (a[i]!=b[j]){ printf ("%i %i ",a[i],b[j]); } else{ printf("%i",a[i]); } } } printf ("\nIntersecção entre A e B:\n"); for (i=0;i<va-1;i++){ for (j=0;j<vb-1;j++){ if (a[i]==b[j]){ printf ("%i ",a[i]); } } } printf ("\nDiferença entre os vetores:\n"); do{ printf ("Digite 1 para A - B, ou digite 2 para B - A:\n"); scanf ("%d",&escolha2); if (escolha2!=1 && escolha2!=2){ printf ("Erro. Digite novamente!"); } }while (escolha2!=1 && escolha2!=2); switch (escolha2){ case 1: printf("A - B = \n"); for (i=0;i<maior-1;i++){ printf ("%i ",a[i]-b[i]); } break; case 2: printf ("B - A = \n"); for (i=0;i<maior-1;i++){ printf ("%i ",b[i]-a[i]); } break; } printf ("\nUm conjunto contido no outro: \n"); do{ printf ("Digite 1 para verificar se A está contido em B, ou 2 para verificar se B está contido em A: \n"); scanf ("%d",&escolha3); if (escolha3!=1 && escolha3!=2){ printf ("Erro. Digite Novamente!\n"); } }while (escolha3!=1 && escolha3!=2); switch (escolha3){ case 1: for (i=0;i<va-1;i++){ for (j=0;j<vb-1;j++){ if (a[i]==b[j]){ contab++; } } } if (contab==va-1){ printf ("A está contido em B.\n"); } else{ printf ("A não está contido em B.\n"); } break; case 2: for (i=0;i<vb-1;i++){ for (j=0;j<va-1;j++){ if (b[i]==a[j]){ contba++; } } } if (contba==vb-1){ printf ("B está contido em A.\n"); } else{ printf ("B não está contido em A.\n"); } break; } } Pode desconsiderar a parte da união, que ainda vou tentar ajeitar, e a parte para verificar se um conjunto está contido no outro também não consegui testar. O erro é que depois que escrevi a última parte (para verificar se um conjunto está contido no outro), o início não funciona mais, e não dá pra inserir os valores do conjunto B. Não sei se o erro é do dev ou algo do final realmente interfere no início. quando o código está assim ele funciona: #include <stdio.h> #include <stdlib.h> void main (){ int a[100],b[100],u[200],i,escolha,escolha2,va,vb,cont=0,cont2=0,n,j,maior=0; do{ do{ printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n"); scanf ("%d",&escolha); if (escolha!=1 && escolha!=2){ printf ("Erro. Digite novamente!\n"); } }while (escolha!=1 && escolha!=2); do{ switch (escolha){ case 1: cont=0; va=0; for (i=0;i<100 && a[i-1]!=0;i++){ do{ printf ("Digite o valor para a posição %d, ou 0 para sair: ",i); scanf ("%i",&a[i]); if (a[i]==a[i-1]){ printf ("Número repetido. Digite novamente!\n"); } }while (a[i]==a[i-1]); va++; } cont++; break; case 2: cont2=0; vb=0; for (i=0;i<100 && b[i-1]!=0;i++){ do{ printf ("Digite o valor para a posição %d, ou 0 para sair: ",i); scanf ("%i",&b[i]); if (b[i]==b[i-1]){ printf ("Número repetido. Digite novamente!\n"); } }while (b[i]==b[i-1]); vb++; } cont2++; break; } printf ("Caso queira reescrever os valores do conjunto, digite 3. Caso contrário, digite 0.\n"); scanf ("%d",&n); if (n==3){ printf ("Digite 1 para reescrever o conjunto 1, ou 2 para reescrever o conjunto 2.\n"); scanf ("%d",&escolha); } }while (n==3); }while (cont!=1 || cont2!=1); if (va>vb){ maior=va; } if (vb>=va){ maior=vb; } printf ("O conjunto A é: \n"); if (a[0]==0){ printf ("Vazio."); } else{ for (i=0;i<va-1;i++){ printf ("%i ",a[i]); } } if (b[0]==0){ printf("Vazio."); } else{ printf ("\nO conjunto B é: \n"); for (i=0;i<vb-1;i++){ printf ("%i ",b[i]); } } printf ("\nUnião entre os conjuntos:\n"); for (i=0;i<va-1;i++){ for (j=0;j<vb-1;j++){ if (a[i]!=b[j]){ printf ("%i %i ",a[i],b[j]); } else{ printf("%i",a[i]); } } } printf ("\nIntersecção entre A e B:\n"); for (i=0;i<va-1;i++){ for (j=0;j<vb-1;j++){ if (a[i]==b[j]){ printf ("%i ",a[i]); } } } printf ("\nDiferença entre os vetores:\n"); do{ printf ("Digite 1 para A - B, ou digite 2 para B - A:\n"); scanf ("%d",&escolha2); if (escolha2!=1 && escolha2!=2){ printf ("Erro. Digite novamente!"); } }while (escolha2!=1 && escolha2!=2); switch (escolha2){ case 1: printf("A - B = \n"); for (i=0;i<maior-1;i++){ printf ("%i ",a[i]-b[i]); } break; case 2: printf ("B - A = \n"); for (i=0;i<maior-1;i++){ printf ("%i ",b[i]-a[i]); } break; } printf ("\nUm conjunto contido no outro: \n"); }
  6. Não estudei funções ainda, mas consegui resolver colocando um do while. Além disso dei a opção de remover os valores do conjunto (como pedido no exercício) e também mostrei os conjuntos na tela, mas preciso ainda fazer a união dos conjuntos a e b, formando um terceiro vetor, a intersecção e verificar se um conjunto está contido no outro. Meu código está assim: void main (){ int a[100],b[100],u[200],m[100],i,escolha,va,vb,cont=0,cont2=0,n; do{ do{ printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n"); scanf ("%d",&escolha); if (escolha!=1 && escolha!=2){ printf ("Erro. Digite novamente!\n"); } }while (escolha!=1 && escolha!=2); do{ switch (escolha){ case 1: cont=0; va=0; for (i=0;i<100 && a[i-1]!=0;i++){ do{ printf ("Digite o valor para a posição %d, ou 0 para sair: ",i); scanf ("%i",&a[i]); if (a[i]==a[i-1]){ printf ("Número repetido. Digite novamente!\n"); } }while (a[i]==a[i-1]); va++; } cont++; break; case 2: cont2=0; vb=0; for (i=0;i<100 && b[i-1]!=0;i++){ do{ printf ("Digite o valor para a posição %d, ou 0 para sair: ",i); scanf ("%i",&b[i]); if (b[i]==b[i-1]){ printf ("Número repetido. Digite novamente!\n"); } }while (b[i]==b[i-1]); vb++; } cont2++; break; } printf ("Caso queira reescrever os valores do conjunto, digite 3. Caso contrário, digite 0.\n"); scanf ("%d",&n); if (n==3){ printf ("Digite 1 para reescrever o conjunto 1, ou 2 para reescrever o conjunto 2.\n"); scanf ("%d",&escolha); } }while (n==3); }while (cont!=1 || cont2!=1); printf ("O conjunto A é: \n"); if (a[0]==0){ printf ("Vazio."); } else{ for (i=0;i<va-1;i++){ printf ("%i ",a[i]); } } if (b[0]==0){ printf("Vazio."); } else{ printf ("\nO conjunto B é: \n"); for (i=0;i<vb-1;i++){ printf ("%i ",b[i]); } } } Queria só uma luz da lógica pra fazer essas operações que faltam...
  7. Preciso de ajuda num exercício. Ele pede que o usuário insira valores em dois vetores do tipo inteiro, podendo escolher qual inserir primeiro, que tenha um critério de parada (no caso, 0), e que verifique se o valor já foi inserido, para evitar a repetição de valores. O que fiz até agora foi isto: #include <stdio.h> #include <stdlib.h> void main (){ int a[100],b[100],i,escolha,cont=0; do{ printf ("Escolha o conjunto que deseja inserir os valores. Digite:\n1- Conjunto A\n2- Conjunto B\n"); scanf ("%d",&escolha); if (escolha!=1 && escolha!=2){ printf ("Erro. Digite novamente!\n"); } }while (escolha!=1 && escolha!=2); switch (escolha){ case 1: for (i=0;i<100 && a[i-1]!=0;i++){ printf ("Digite o valor para a posição %d, ou 0 para sair: ",i); scanf ("%i",&a[i]); } } } Não consigo fazer a parte em que ele verifica se o número já foi digitado e pede para digitar novamente. Dá pra fazer isso já na parte que está lendo os números ou somente no final, tendo que digitar o conjunto inteiro novamente? Eu tinha tentado colocando um outro for, com uma variável j = i -1 e verificando se a==a[j], mas não deu certo.
  8. Obrigada, agora ficou muito mais simples! #include <stdio.h> #include <stdlib.h> void main (){ float maiorAltura=0,menorAltura=3,alturaMulheres=0,h; int nh=0,nm=0,i=1,caso; for (i=1;i<=5;i++){ printf ("Digite sua altura: \n"); scanf ("%f",&h); if (h>maiorAltura){ maiorAltura = h; } if (h<menorAltura){ menorAltura = h; } do{ printf ("Escolha uma opção: \n1- Masculino\n2- Feminino\n"); scanf ("%d",&caso); if (caso != 1 && caso != 2){ printf ("Erro! Digite novamente.\n"); } }while (caso != 1 && caso != 2); switch (caso){ case 1: nh++; break; case 2: alturaMulheres = alturaMulheres + h; nm++; break; } } printf ("A maior altura do grupo é: %f\n",maiorAltura); printf ("A menor altura do grupo é: %f\n",menorAltura); printf ("A média da altura das mulheres é: %f\n",alturaMulheres/nm); printf ("O número de homens é: %d",nh); }
  9. Estou aprendendo a programar em C e esse exercício me confundiu muito: Tem-se um conjunto de dados contendo a altura e o sexo (masculino, feminino) de 50 pessoas. Faça um algoritmo que calcule e escreva: • A maior e a menor altura do grupo; • A média de altura das mulheres; • O número de homens. Acho que compliquei muito pra fazer o código, e além disso, no caso da pessoa digitar errado na hora de escolher o sexo ele contabiliza do mesmo jeito (se digitar errado 3 vezes ela só pode registrar a informação de 47 pessoas). #include <stdio.h> #include <stdlib.h> void main (){ float ah,am,maiah=0,maiam=0,menah=3,menam=3,mdam=0; int nh=0,nm=0,i=1,caso; for (i=1;i<=50;i++){ printf ("Escolha uma opção: \n1- Masculino\n2- Feminino\n"); scanf ("%d",&caso); switch (caso){ case 1: printf ("Digite sua altura: "); scanf ("%f",&ah); if (ah>maiah){ maiah = ah; } if (ah<menah){ menah = ah; } nh++; break; case 2: printf ("Digite sua altura: "); scanf ("%f",&am); mdam = mdam + am; if (am>maiam){ maiam = am; } if (am<menam){ menam = am; } nm++; break; default: printf ("Erro! Tente novamente."); } } if (maiah>maiam){ printf ("A maior altura do grupo é: %f e é de um homem.\n",maiah); } if (maiah<maiam){ printf ("A maior altura do grupo é: %f e é de uma mulher.\n",maiam); } if (maiah==maiam) { printf ("A maior altura do grupo é: %f, uma mulher e um homem medem esta mesma altura.\n",maiah); } if (menah<menam){ printf ("A menor altura do grupo é : %f e é de um homem.\n",menah); } if (menah>menam){ printf ("A menor altura do grupo é: %f e é de uma mulher.\n", menam); } if (menah==menam) { printf ("A menor altura do grupo é: %f, uma mulher e um homem medem esta mesma altura.\n",menam); } printf ("A média da altura das mulheres é de %f\n",mdam/nm); printf ("O número de homens é de %d",nh); }

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