Advertisement
Guest User

Untitled

a guest
Jun 24th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include "esparsas.h"
  6.  
  7. #define MAX_BUFFER_SIZE 1024 //a.k.a. arquivo de 1kb
  8. #define MAX_NUMBER_SIZE 8 //o numero de caracteres entre um ';' ou um '\n'
  9.  
  10. typedef struct Noh{
  11. int linha, coluna;
  12. double valor;
  13. struct Noh *direito, *abaixo;
  14. int dirNull; // Mexi
  15. } Noh;
  16.  
  17. //cria um noh com linha, coluna e valor especificados
  18. Noh* criaNoh(int linha, int coluna, double valor){
  19. Noh* novo = (Noh*) malloc(sizeof(Noh));
  20. novo -> direito = NULL;
  21. novo -> abaixo = NULL;
  22. novo -> linha = linha;
  23. novo -> coluna = coluna;
  24. novo -> valor = valor;
  25. novo->dirNull = 0; // Mexi
  26. return novo;
  27. }
  28.  
  29. Noh* cria(void){
  30. Noh* cabeca = (Noh*) malloc(sizeof(Noh));
  31. cabeca -> valor = -1;
  32. cabeca -> linha = -1;
  33. cabeca -> coluna = -1;
  34. return cabeca;
  35. }
  36.  
  37. void ler(Noh* esparsa, FILE* matriz){
  38.  
  39. //ambos partem do mesmo ponto inicial
  40. Noh* linhaAtual = esparsa;
  41. Noh* colunaAtual = esparsa;
  42. Noh* anterior = NULL;
  43.  
  44. char buffer[MAX_BUFFER_SIZE] = {0}; //buffer de todo o arquivo
  45. char auxBuffer[MAX_NUMBER_SIZE] = {0}; //buffer do numero (definido pelos caracteres separadores)
  46. int i = 0, k = 0, l = 0, size = 0, nLinhas = 0, nColunas = 0, aux = 0;
  47. double value;
  48. bool first = true;
  49.  
  50. //calcula valores de linha e coluna, valida o tamanho da matriz e passa todos os dados do arquivo para um buffer
  51. while (!feof(matriz)){
  52. buffer[i] = fgetc(matriz);
  53.  
  54. switch(buffer[i]){
  55. case 59:
  56. aux++;
  57. break;
  58.  
  59. case 10:
  60. case EOF:
  61. aux++;
  62. nLinhas++;
  63. if(aux != nColunas && first == false){
  64. printf("Tamanho da matriz invalido!");
  65. return;
  66. }
  67. nColunas = aux;
  68. aux = 0;
  69. first = false;
  70. break;
  71. }
  72. i++;
  73. size++;
  74. }
  75.  
  76. //ao inves de -1 para linha e coluna no noh principal, ele ira armazenar o tamanho da matriz
  77. esparsa -> linha = nLinhas;
  78. esparsa -> coluna = nColunas;
  79.  
  80. fclose(matriz);
  81.  
  82. //cria todas as 'cabecas' para linhas e colunas baseado no tamanho adquirido anteriormente
  83. Noh* atual = esparsa;
  84. for(i = 0; i < nLinhas+1; i++){
  85. Noh* novaLinha = criaNoh(i, -1, -1);
  86. atual -> abaixo = novaLinha;
  87. atual = atual -> abaixo;
  88. } atual = esparsa;
  89. for(i = 0; i < nColunas+1; i++){
  90. Noh* novaLinha = criaNoh(-1, i, -1);
  91. atual -> direito = novaLinha;
  92. atual = atual -> direito;
  93. }
  94. free (atual);
  95.  
  96. //logica para o posicionamento dos valores no TAD
  97. linhaAtual = linhaAtual -> abaixo;
  98. colunaAtual = colunaAtual -> direito;
  99. for(i = 0; i < nLinhas; i++){
  100. anterior = linhaAtual;
  101.  
  102. for(int j = 0; j < nColunas; j++) {
  103. do{ //coloca no buffer auxiliar todos os caracteres que compoem o numero
  104. auxBuffer[l] = buffer[k];
  105. k++; l++;
  106. } while(buffer[k-1] != 59 && buffer[k-1] != 10 && buffer[k-1] && EOF);
  107.  
  108. value = strtod(auxBuffer, NULL);
  109. l = 0; auxBuffer[0] = '\0';
  110.  
  111. if(value != 0.0) { //ele funciona, porem alocando os zeros, tentando acertar a logica dos zeros
  112. Noh* novoValor = criaNoh(i, j, value); //cria um noh com os valores de linha e coluna dos dois FOR
  113.  
  114. anterior -> direito = novoValor;
  115. if (colunaAtual != 0) {
  116. colunaAtual -> abaixo = anterior; //o noh gerado eh apontado pela cabeca da linha atual e da coluna atual
  117. }
  118. //anterior = anterior -> direito;
  119. if (anterior->direito != 0)
  120. anterior = anterior->direito;
  121.  
  122. //colunaAtual = colunaAtual -> direito; //anda pelas cabecas das colunas
  123. if (colunaAtual->direito != 0)
  124. colunaAtual = colunaAtual->direito;
  125. } else {
  126. if (anterior->valor == -1) {
  127. linhaAtual->dirNull++;
  128. } else {
  129. anterior->dirNull++;
  130. }
  131. anterior->direito = 0;
  132. if (colunaAtual->direito != 0)
  133. colunaAtual = colunaAtual->direito;
  134. else
  135. colunaAtual = 0;
  136. }
  137. }
  138. colunaAtual = linhaAtual->direito;
  139. linhaAtual = linhaAtual->abaixo;
  140. }
  141. }
  142.  
  143. void inverter(Noh* I, const Noh* A){
  144. //code
  145. }
  146.  
  147. //uma funcao para testar os ponteiros das linhas e outro das colunas (ambas sucesso)
  148.  
  149. /*void imprimir(const Noh* esparsa){
  150. Noh* linhaAtual = esparsa;
  151. Noh* colunaAtual = esparsa;
  152.  
  153. for(int i = 0; i < esparsa -> linha; i++){
  154. linhaAtual = linhaAtual -> abaixo;
  155. colunaAtual = linhaAtual -> direito;
  156. for(int j = 0; j < esparsa -> coluna; j++){
  157. //printf("%.1lf\t", colunaAtual -> valor);
  158. printf("[%d][%d] = %.1lf\n", linhaAtual -> linha, colunaAtual -> coluna, colunaAtual -> valor);
  159. colunaAtual = colunaAtual -> direito;
  160. }
  161. //puts("");
  162. }
  163. } */
  164.  
  165. void imprimir(const Noh* esparsa){
  166. Noh* colunaAtual = esparsa->abaixo;
  167. Noh* linhaAtual = colunaAtual;
  168.  
  169. for(int i = 0; i < esparsa -> linha; i++){
  170. colunaAtual = linhaAtual;
  171. for(int j = 0; j < esparsa -> coluna; j++){
  172. if (colunaAtual->direito != 0) {
  173. if (colunaAtual->valor == -1) {
  174. for (int g = 0; g < colunaAtual->dirNull; g++)
  175. printf("0\t");
  176. }
  177. printf("%.1lf\t", colunaAtual->direito->valor);
  178. for (int i = 0; i < colunaAtual->direito->dirNull; i++)
  179. printf("0\t");
  180. colunaAtual = colunaAtual->direito;
  181. }
  182. }
  183. linhaAtual = linhaAtual -> abaixo;
  184. puts("");
  185. }
  186. }
  187.  
  188. void transpor(Noh* T, const Noh* A){
  189. //code
  190. }
  191.  
  192. void somar(Noh* S, const Noh* A, const Noh* B){
  193. //code
  194. }
  195.  
  196. void multiplicar(Noh* M, const Noh* A, const Noh* B){
  197. //code
  198. }
  199.  
  200.  
  201. // função responsável pela verificação da esparsa (vazia)
  202. /*bool underflow(const Noh* A) {
  203.  
  204. if (A->direito == 0 || A->abaixo == 0) {
  205. return true;
  206. } else {
  207. return false;
  208. }
  209.  
  210. }*/
  211.  
  212. double getValueFromCoordinates(const Noh* A, int x, int y){
  213.  
  214.  
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement