SHARE
TWEET

Untitled

a guest Jun 26th, 2019 71 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. struct student{ //struct padrão de alunos
  7.     int matricula;
  8.     char nome[100];
  9.     double notas_de_prova[6];
  10.     double notas_de_listas[6];
  11.     double nota_de_trabalho;
  12.     double nota_final;
  13.     int numero_ausencias;
  14.     char situacao[50];
  15. } defaultStudent;
  16.  
  17. main(){
  18.     int choice;
  19.     while(1){ //lista de opções do programa
  20.         system("clear");
  21.         puts("      ("`-''-/").___..--''"`-._");
  22.         puts("       `6_ 6  )   `-.  (     ).`-.__.`)");
  23.         puts("       (_Y_.)'  ._   )  `._ `. ``-..-'");
  24.         puts("      ..`--'_..-_/  /--'_.' ,'");
  25.         puts("      (il),-''  (li),'  ((!.-'");
  26.         puts("||=============================||");
  27.         puts("||======Escolha uma opção======||");
  28.         puts("||=============================||");
  29.         puts("||1|| Cadastrar uma turma      || n||2|| Consultar um aluno       ||");
  30.         puts("||3|| Alterar dados de um aluno|| n||4|| Listar dados de uma turma||");
  31.         puts("||5|| Terminar a execução      ||");
  32.         puts("||=============================||");
  33.         scanf("%d", &choice);
  34.         if(choice == 1)
  35.             createData();
  36.          else if(choice == 2)
  37.              readData(1);
  38.          else if(choice == 3)
  39.             readData(0);
  40.          else if(choice == 4)
  41.              listData();
  42.         else if(choice == 5)
  43.             break; //sai do while
  44.         else //se for diferente das opções dadas
  45.             puts("Opção inexistente");    
  46.     }  
  47. }
  48. listData(){
  49.     system("clear");
  50.     FILE * dataBase;
  51.     char name[200];
  52.     int op = 0;
  53.     while(op!=5){
  54.         puts("nDigite o nome (ex: home/user/documents/nomeDoArquivo) de um arquivo de turma: ");
  55.         scanf("%s", name);//digita certo pfv
  56.         if(name[0]=='f' && name[1]=='i' && name[2]=='m'){ //se o usuário digitar "fim", voltamos para o menu principal
  57.             break;
  58.         }
  59.         op = 0;
  60.         char *FileName = name;
  61.         int contador = verificarTamanho(FileName);
  62.         dataBase = fopen( FileName, "rb");  
  63.         struct student estudantes[contador];
  64.         contador = 0;
  65.         while(feof(dataBase)==0){
  66.             fread( &defaultStudent, sizeof(defaultStudent), 1, dataBase);
  67.              estudantes[contador].matricula= defaultStudent.matricula;
  68.              strcpy(estudantes[contador].nome, defaultStudent.nome );
  69.              strcpy(estudantes[contador].situacao, defaultStudent.situacao );
  70.              estudantes[contador].nota_de_trabalho = defaultStudent.nota_de_trabalho;
  71.              estudantes[contador].nota_final = defaultStudent.nota_final;
  72.              estudantes[contador].numero_ausencias = defaultStudent.numero_ausencias;
  73.              for(int i = 0; i<6;i++){
  74.                 estudantes[contador].notas_de_prova[i] = defaultStudent.notas_de_prova[i];
  75.                 estudantes[contador].notas_de_listas[i] = defaultStudent.notas_de_listas[i];
  76.              }
  77.             contador++;
  78.         }
  79.         for(int i = 0; i<contador;i++){
  80.             printf("%sn", estudantes[i].nome);
  81.         }
  82.         int matricula, ausencias;
  83.         char nome[100], situacao[50];
  84.         double notasProva[6], notasListas[6], notaTrabalho, notaFinal;
  85.         while(op!=4 && op!=5){
  86.             system("clear");
  87.             puts("1 - listar alunos por ordem crescente de matrícula");
  88.             puts("2 - listar alunos por ordem alfabética");
  89.             puts("3 - listar alunos por ordem crescente de nota final");
  90.             puts("4 - terminar e voltar para processar nova turma");
  91.             puts("5 - terminar execução do módulo");
  92.             puts("===========================================");
  93.             scanf("%d", &op);
  94.             if(op == 1){
  95.                 puts("executando op 1");
  96.                 for(int i = 0; i<contador;i++){
  97.                     if(estudantes[i].matricula > estudantes[i+1].matricula){
  98.                         puts("realizando troca");
  99.                         //definindo valores de variáveis auxiliares
  100.                         matricula = estudantes[i].matricula;
  101.                         strcpy(nome, estudantes[i].nome);
  102.                         strcpy(situacao, estudantes[i].situacao );
  103.                         notaTrabalho= estudantes[i].nota_de_trabalho;
  104.                         notaFinal = estudantes[i].nota_final;
  105.                         ausencias = estudantes[i].numero_ausencias;
  106.                         for(int j = 0; j<6;j++){
  107.                             notasProva[j] = estudantes[i].notas_de_prova[j];
  108.                             notasListas[j] = estudantes[i].notas_de_listas[j];
  109.                         }
  110.                         //beleza, agr vamos fazer a inversão de ordem
  111.                         estudantes[i].matricula = estudantes[i+1].matricula;
  112.                         strcpy(estudantes[i].nome, estudantes[i+1].nome);
  113.                         strcpy(estudantes[i].situacao, estudantes[i+1].situacao );
  114.                         estudantes[i].nota_de_trabalho = estudantes[i+1].nota_de_trabalho;
  115.                         estudantes[i].nota_final = estudantes[i+1].nota_final;
  116.                         estudantes[i].numero_ausencias = estudantes[i+1].numero_ausencias;
  117.                         for(int j = 0; j<6;j++){
  118.                             estudantes[i].notas_de_prova[j] = estudantes[i+1].notas_de_prova[j];
  119.                             estudantes[i].notas_de_listas[j] = estudantes[i+1].notas_de_listas[j];
  120.                         }
  121.                         //agr o i+1 vai receber os valores das variáveis auxliares
  122.                         estudantes[i+1].matricula = matricula;
  123.                         strcpy(estudantes[i+1].nome, nome);
  124.                         strcpy(estudantes[i+1].situacao, situacao );
  125.                         estudantes[i+1].nota_de_trabalho = notaTrabalho;
  126.                         estudantes[i+1].nota_final = notaFinal;
  127.                         estudantes[i+1].numero_ausencias =  ausencias;
  128.                         for(int j = 0; j<6;j++){
  129.                             estudantes[i+1].notas_de_prova[j] = notasProva[j];
  130.                             estudantes[i+1].notas_de_listas[j] = notasListas[j];
  131.                         }
  132.                             i= -1;
  133.                     }
  134.                 }
  135.                 //finalmente vamos printar na tela
  136.                 for(int i = 0; i<contador;i++){
  137.                 puts("||======================================");
  138.                 puts("||======================================");
  139.                 printf( "||Matrícula: %d                       n", estudantes[i].matricula ); //preenchendo os dados na tela, todos bonitinhos
  140.                 printf( "||Nome: %s                            n", estudantes[i].nome );
  141.                 for(int j = 0; j<6;j++){
  142.                     printf( "||Nota da prova %d: %lf           n",i+1, estudantes[i].notas_de_prova[j]);      
  143.                 }
  144.                 for(int j = 0; j<6;j++){
  145.                     printf( "||Nota da lista %d: %lf           n",i+1, estudantes[i].notas_de_listas[j]);
  146.                 }
  147.                 printf( "||Nota do trabalho: %lf               n", estudantes[i].nota_de_trabalho);
  148.                 printf( "||Nota final: %lf                     n", estudantes[i].nota_final);
  149.                 printf( "||Noumero de ausências: %d            n", estudantes[i].numero_ausencias);
  150.                 printf( "||Situacao: %s                        n", estudantes[i].situacao);
  151.                 puts("||======================================");
  152.                 printf( "nn" );
  153.                 }
  154.             }
  155.  
  156.         }
  157.         printf("%d",contador);
  158.  
  159.     //fclose(dataBase);
  160.     }
  161. }
  162. verificarTamanho(char *FileName){
  163.     FILE * dataBase;
  164.     int contador = 0;
  165.     dataBase = fopen( FileName, "rb");
  166.         while(feof(dataBase)==0){
  167.             fread( &defaultStudent, sizeof(defaultStudent), 1, dataBase);
  168.             contador++;
  169.         }
  170.     fclose(dataBase);
  171.     return contador;
  172. }              
  173.  
  174. updateData(int matricula, char *FileName){
  175.     system("clear");
  176.     if(!(matricula == 0)){//se a matricula for 0, ele não faz nada
  177.         FILE * dataBase;
  178.         dataBase = fopen( FileName, "r+b");//abre o arquivo em modo aleatório para podermos sobrescrever um registro
  179.         while (fread( &defaultStudent, sizeof(defaultStudent), 1, dataBase)){//vamos ler o arquivo XD
  180.             if(defaultStudent.matricula == matricula){//se a matricula do arquivo for igual a digitada pelo usuário
  181.                 puts("||======================================");
  182.                 puts("||======================================");
  183.                 printf( "||Matrícula: %d                       n", defaultStudent.matricula ); //preenchendo os dados na tela, todos bonitinhos
  184.                 printf( "||Nome: %s                            n", defaultStudent.nome );
  185.                 for(int i = 0; i<6;i++){
  186.                     printf( "||Nota da prova %d: %lf           n",i+1, defaultStudent.notas_de_prova[i]);      
  187.                 }
  188.                 for(int i = 0; i<6;i++){
  189.                     printf( "||Nota da lista %d: %lf           n",i+1, defaultStudent.notas_de_listas[i]);
  190.                 }
  191.                 printf( "||Nota do trabalho: %lf               n", defaultStudent.nota_de_trabalho);
  192.                 printf( "||Nota final: %lf                     n", defaultStudent.nota_final);
  193.                 printf( "||Noumero de ausências: %d            n", defaultStudent.numero_ausencias);
  194.                 printf( "||Situacao: %s                        n", defaultStudent.situacao);
  195.                 puts("||======================================");
  196.                 printf( "nn" );
  197.                 puts("digite os novos dados do aluno:");
  198.  
  199.             }
  200.             archiveData();
  201.             fseek(dataBase, (-1)*sizeof(defaultStudent), SEEK_CUR);//volta o "leitor do arquivo para a posição do registro a ser alterado"
  202.             fwrite( &defaultStudent, sizeof(defaultStudent), 1, dataBase);//finalmente altera o registro
  203.         }
  204.     fclose(dataBase);
  205.     }      
  206.  
  207. }
  208. readData(int choice){
  209.     system("clear");//limpando terminal
  210.     FILE * dataBase;
  211.     char name[200];
  212.     int matricula;
  213.     while(1){ //é só para ja entrar aqui direto, e caso a matricula seja 0, sai na hr
  214.         puts("nDigite o nome (ex: home/user/documents/nomeDoArquivo) de um arquivo de turma: ");
  215.         scanf("%s", name);//digita certo pfv
  216.         if(name[0]=='f' && name[1]=='i' && name[2]=='m'){ //se o usuário digitar "fim", voltamos para o menu principal
  217.             break;
  218.         }
  219.         matricula = 1;
  220.         char *FileName = name;
  221.         dataBase = fopen( FileName, "rb");//abrindo apenas em modo de leitura READ BINARY
  222.         if(!(dataBase==NULL)){//só entra aqui se o arquivo não estiver vazio, se estiver ele pede para digitar de novo
  223.             while(matricula){//vai ficar nesse loop enquanto a matrícula não for 0
  224.                 puts("nDigite um número de matrícula: ");
  225.                 scanf("%d",&matricula);
  226.                 if(choice)//se a requisição veio do Main, entra no método abaixo
  227.                     lendoArquivo(matricula, FileName);//achei melhor uma função para isso, se não ficaria desorganizado        
  228.                 else
  229.                     updateData(matricula, FileName);
  230.             }
  231.  
  232.         }
  233.         fclose(dataBase);
  234.     }
  235.  
  236. }
  237. lendoArquivo(int matricula, char *FileName){
  238.     if(!(matricula == 0)){//se a matricula for 0, ele não faz nada
  239.         FILE * dataBase;
  240.         dataBase = fopen( FileName, "rb");
  241.         while (fread( &defaultStudent, sizeof(defaultStudent), 1, dataBase)){//vamos ler o arquivo XD
  242.             if(defaultStudent.matricula == matricula){//se a matricula do arquivo for igual a digitada pelo usuário
  243.                 puts("||======================================");
  244.                 puts("||======================================");
  245.                 printf( "||Matrícula: %d                       n", defaultStudent.matricula ); //preenchendo os dados na tela, todos bonitinhos
  246.                 puts("||--------------------------------------");
  247.                 printf( "||Nome: %s                            n", defaultStudent.nome );
  248.                 puts("||--------------------------------------");
  249.                 for(int i = 0; i<6;i++){
  250.                     printf( "||Nota da prova %d: %lf           n",i+1, defaultStudent.notas_de_prova[i]);
  251.                     puts("||--------------------------------------");
  252.  
  253.                 }
  254.                 for(int i = 0; i<6;i++){
  255.                     printf( "||Nota da lista %d: %lf           n",i+1, defaultStudent.notas_de_listas[i]);
  256.                     puts("||--------------------------------------");
  257.                 }
  258.                 printf( "||Nota do trabalho: %lf               n", defaultStudent.nota_de_trabalho);
  259.                 puts("||--------------------------------------");
  260.                 printf( "||Nota final: %lf                     n", defaultStudent.nota_final);
  261.                 puts("||--------------------------------------");
  262.                 printf( "||Noumero de ausências: %d            n", defaultStudent.numero_ausencias);
  263.                 puts("||--------------------------------------");
  264.                 printf( "||Situacao: %s                        n", defaultStudent.situacao);
  265.                 puts("||======================================");
  266.                 puts("||======================================");
  267.                 printf( "nn" );
  268.                 break;
  269.             }
  270.         }
  271.     fclose(dataBase);
  272.     }                      
  273. }
  274. createData(){
  275.     char name[100], directory[100];
  276.     system("clear"); //limpar o Terminal
  277.  
  278.     puts("Digite o nome do arquivo: ");
  279.     scanf("%s", name); //lendo nome do arquivo
  280.     puts("nDigite o caminho do arquivo: ");
  281.     scanf("%s", directory);//lendo diretório do arquivo
  282.  
  283.     //adicionando uma "/" no final do diretorio, para conseguirmos concatenar com o arquivo
  284.     char *Finaldirectory = strcat(directory,"/");
  285.     //salvando corretamente nome do diretório + nome do arquivo
  286.     const char *file = strcat(Finaldirectory,name);
  287.     //finalmente criando o arquivo
  288.     FILE * dataBase = fopen(file,"wb");//criando o arquivo. file = diretorio+/+nomeDoArquivo
  289.     //"wb" => w=> para criar um arquivo e sobrescrever caso ja exista, b => arquivo binário
  290.  
  291.     do{
  292.         puts("ndigite a matricula: ");
  293.         scanf("%d", &defaultStudent.matricula);
  294.         if(defaultStudent.matricula == 0)
  295.             break;
  296.         archiveData();//função para receber os valores do usuário
  297.         fwrite( &defaultStudent, sizeof(defaultStudent), 1, dataBase);
  298.          //salvando tudo no arquivo finalmente
  299.  
  300.     } while (defaultStudent.matricula!=0);
  301.     fclose(dataBase);
  302.     // puts("Conteúdo atual do arquivo");
  303.     //  dataBase = fopen( file, "rb");
  304.     //         fread( &defaultStudent, sizeof(defaultStudent), 1, dataBase);
  305.     //         printf( "Nome     : %sn", defaultStudent.nome );
  306.     //         printf( "situacao    : %sn", defaultStudent.situacao);
  307.     //         printf( "n" );
  308.  
  309. }
  310. archiveData(){
  311.  puts("digite o nome: ");
  312.         getchar();//o puts tem o /n por padrão, esse getchar serve para q o scanf nao confunda esse /n com entrada do teclado
  313.         scanf("%[^n]", defaultStudent.nome);//esse código [^n] serve para ler toda a linha que o usuário digitar
  314.         getchar();
  315.         //o laço abaixo serve para preenchermos o vetor de notas de prova
  316.         for(int i =0; i<6;i++){
  317.             printf("digite a nota de prova número %d: ", i+1);
  318.             scanf("%lf", &defaultStudent.notas_de_prova[i]);
  319.         }
  320.         //o laço abaixo serve para preenchermos o vetor de notas de listas
  321.         for(int i =0; i<6;i++){
  322.             printf("digite a nota de lista número %d: ", i+1);
  323.             scanf("%lf", &defaultStudent.notas_de_listas[i]);
  324.         }
  325.         puts("digite a nota do trabalho: ");
  326.         scanf("%lf", &defaultStudent.nota_de_trabalho);
  327.  
  328.         puts("digite o número de ausências: ");
  329.         scanf("%d", &defaultStudent.numero_ausencias);
  330.         //setando ponteiros para jogar os vetores em outra função
  331.         double *notasProvas = defaultStudent.notas_de_prova, *notasListas = defaultStudent.notas_de_listas;
  332.         defaultStudent.nota_final = finalMedia(notasProvas,notasListas, defaultStudent.nota_de_trabalho);
  333.  
  334.         //verificar situação
  335.         int situation = checkSituation( defaultStudent.nota_final, defaultStudent.numero_ausencias);
  336.         if(situation == 0)
  337.             strcpy(defaultStudent.situacao, "Reprovado por ausência e por nota");
  338.         else if(situation == 1)
  339.             strcpy(defaultStudent.situacao, "Reprovado por ausência");
  340.         else if(situation == 2)
  341.             strcpy(defaultStudent.situacao, "Reprovado por nota");
  342.         else if(situation == 3)
  343.             strcpy(defaultStudent.situacao, "Aprovado");
  344. }
  345. checkSituation(double notaFinal, int faltas){
  346.     int s;
  347.     if(notaFinal >= 6 && faltas < 0.25 * 128)
  348.         return 3;
  349.     else if(notaFinal <6 && faltas < 0.25*128)
  350.         return 2;
  351.     else if(notaFinal >=6 && faltas >= 0.25*128)
  352.         return 1;
  353.     else
  354.         return 0;
  355. }
  356.  
  357. finalMedia(double *notasProvas, double *notasListas, double notaTrabalho){
  358.     //calculando média das provas e listas
  359.     double mp = 0, ml = 0, mf;
  360.     for(int i = 0; i<6;i++){
  361.         mp += notasProvas[i];
  362.         ml += notasListas[i];
  363.     }
  364.     mp = mp/6;
  365.     ml = ml/6;
  366.     //calculando média final
  367.     mf = (mp * 0.8) + (ml * 0.1)+ (notaTrabalho * 0.1);
  368.  
  369.     return mf; //retornando a média final
  370. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top