Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.18 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement