Ir ao conteúdo
  • Cadastre-se

Lucas.Rocha_21

Membro Júnior
  • Posts

    17
  • Cadastrado em

  • Última visita

  1. Estava vendo as funções responsáveis pela leitura e gravação de strings via arquivo texto e me deparei com a função fgets, que recebe como parâmetro um vetor de carácter, a quantidade de strings que serão lidas e o ponteiro que aponta para o meu arquivo texto. Para tal é necessário que eu aloque em tempo de copilação um vetor com uma quantidade fixa de espaço para armazenar o conteúdo das linhas, como pode ver neste programa-teste que fiz: #include <stdio.h>#include <stdlib.h>#include <locale.h>int main(void){ FILE *arquivoTexto; char letra; int cont = 0; char temp2[100]; setlocale(LC_ALL, ""); //aceitar acentos arquivoTexto = fopen("teste.txt", "w"); if(!arquivoTexto) //ou arquivoTexto == NULL { printf("Arquivo nao pode ser gravado"); exit(1); } fputs("Isto é um teste para ver se este arquivo\n", arquivoTexto); fputs("texto conseguiu gravar os arquivos adequadamente:\n", arquivoTexto); fputs("Mesmo com quebra de linhas\te inclusive tabulações.\n", arquivoTexto); fputs("Encerro este texto para afirmar que consegui.", arquivoTexto); printf("O arquivo foi gravado corretamente.\nAbra-o para ver\n\n"); fclose(arquivoTexto); arquivoTexto = fopen("teste.txt", "r"); if(!arquivoTexto) //ou arquivoTexto == NULL { printf("Arquivo nao pode ser lido"); exit(1); } while(!feof(arquivoTexto)) { fgets(temp2, 100, arquivoTexto); printf("%s", temp2); } return 0;} Como vocês percebem, cada linha do meu texto não possui um número fixo de caracteres. Uma delas é maior que a outra. Logo preciso "desperdiçar memória" chutando um valor alto para armazenar as strings. Gostaria de saber se tenho como alocar dinamicamente este vetor temp2 para que ele armazene a linha, não importa o número de caracteres que ela tenha e como procederia para fazer isto. Ou esta função fgets só aceita vetores estáticos? trabalhando com arquivos 3.rar
  2. Vou te ajudar com a ideia do número 2. Você declara uma variável inteiro que receba o conteúdo do 1º elemento da matriz (ex: maior = vetor[0][0]) e então dentro de dois laços (i e j) compara com cada elemento da matriz. Se este elemento for maior que a variável maior, este elemento será o maior, a coluna será j e a linha será i (aquele laço dos dois for). Assim: maior = vetor[0][0]; for(i = 0; i < 2; i++){ for (j = 0; j < 2; j++){ if (vetor[i][j] > maior) { maior = vetor[i][j]; coluna = j + 1; linha = i + 1; } } } Me baseei num vetor 2x2. No caso de 5x7, só alterar para i < 5 e j < 7
  3. Miguel, Já que não conseguiu rodar o programa (você falou por MP), vou colocar aqui o código completo... #include <stdio.h>#include <stdlib.h>int* SomaElementosColuna(int rows, int cols, int **matriz);void ImprimeMatrizDinamica(int **matriz, int rows, int cols);void ImprimeVetorDinamica(int *vetor, int cols);int main(void){ int i, j, linhas, colunas; int **matrizDados; int *resultado; printf("Entre com o numero de linhas: "); scanf("%i", &linhas); printf("\nEntre com o numero de colunas: "); scanf("%i", &colunas); matrizDados = (int**)malloc(linhas * sizeof(int*)); if(!matrizDados){ printf("\nNao foi possivel alocar memoria\n"); exit(1); } for(i = 0; i < linhas; i++) { *(matrizDados + i) = (int*)malloc(colunas * sizeof(int)); if(!(matrizDados + i)){ printf("\nNao foi possivel alocar memoria\n"); exit(1); } } for(i = 0; i < linhas; i++) { for(j = 0; j < colunas; j++){ printf("\nEntre com a linha %i coluna %i :", i + 1, j + 1); scanf("%i", *(matrizDados + i) + j); } } ImprimeMatrizDinamica(matrizDados, linhas, colunas); resultado = SomaElementosColuna(linhas, colunas, matrizDados); ImprimeVetorDinamica(resultado, colunas); return 0;}void ImprimeMatrizDinamica(int **matriz, int rows, int cols){ int i, j; printf("\nMatriz inserida:\n"); for(i = 0; i < rows; i++) { for(j = 0; j < cols; j++){ printf(" %6i ", *(*(matriz + i) + j)); } printf("\n"); }}void ImprimeVetorDinamica(int *vetor, int cols){ int i; printf("\nResultado da soma das colunas:\n"); for(i = 0; i < cols; i++) { printf(" %6i ", *(vetor + i)); } printf("\n");}int* SomaElementosColuna(int rows, int cols, int **matriz){ int *soma; int i, j, m; soma = (int*) calloc(cols, sizeof(int)); for(j = 0; j < cols; j++){ for(i = 0; i < rows; i++){ *(soma + j) = *(soma + j) + *(*(matriz + i) + j); } } return soma;} Como falei acima, se não souber ponteiro e alocação dinâmica, vai dançar porque o programa é basicamente isto. Entre as linhas 15 e 18 peço para o usuário que insira a quantidade de linhas e colunas desejadas. Depois disto, na linha 19, é alocado um vetor de ponteiros em matrizDados, com um teste caso não consiga alocar. Se não conseguiu entender, é só olhar o desenho que pus no meu post acima. Na linha 26, para cada ponteiro, aloquei um vetor de inteiro com a quantidade de elementos da coluna. Ponteiro para ponteiros é essencial para que seja alocada uma matriz dinamicamente (com m linhas e n colunas). E isto em tempo de execução. Perceba que não aloquei nada antes do programa copilar, como seria o caso do vetor estático que escrevi acima. Entre as linhas 36 e 41, você insere os dados nesta matriz. Um detalhe interessante: *(*(matriz + i) + j) ==> retorna valor já que é o conteúdo do conteúdo da matriz[j]. *(matriz + i) + j => é equivalente a escrever &matriz[j]. retorna endereço. Da maneira que escrevi, não precisa do "&". Depois ele vai imprimir os dados da matriz que digitou E na linha 45 é onde a mágica acontece. Passo linhas e colunas como parâmetros de entrada da função porque preciso de uma condição de parada. E o ponteiro de ponteiro matriz onde está alocado a minha matriz (volte ao desenho se não entendeu). Já expliquei acima como este programa funciona. E no fim ele imprime o vetor resultado com a soma dos elementos das colunas. Reforçando, sem entender ponteiro e alocação dinâmica, tudo que escrevi parece grego. Copie e cole o código no seu programa de desenvolvimento em C e veja-o rodando. Talvez entenda mais fácil assim. Abraços.
  4. Olá, Miguel. Tudo beleza? Este problema é que você colocou é bastante desafiador porque exige de você um conhecimento de alocação dinâmica e também um pouco de "ponteiro de ponteiros" (o popular **matriz) haha. Só em ouvir este nome me dá calafrio. No programa principal - int main(void) - fará o seguinte: Primeiramente você vai requisitar ao usuário a quantidade de linhas e colunas da matriz de inteiros. Depois você vai alocar com a função malloc a quantidade de linhas (serão os ponteiros para onde será apontado as colunas) Depois você vai alocar cada inteiro num for até a quantidade de linhas um vetor com quantidade de colunas. Para melhor entendimento, eu fiz um desenho de ponteiros e matrizes alocada dinamicamente: Depois você vai inserir os dados na matriz alocada dinamicamente. Em seguida, nesta função da soma dos elementos da coluna, receberá como parâmetros de entradas o número de linhas, colunas e o ponteiro de ponteiro matriz. Dentro desta função vai alocar um vetor dinamicamente (vetor soma) com a quantidade de elementos de uma coluna, onde vai armazenar o resultado. Logo, o retorno dela é um vetor. Desta maneira a assinatura da função seria esta: int* SomaColunas(int linhas, int colunas, int **matriz) Um exemplo só. A partir disso você vai somar as colunas dentro de dois for, assim: int *soma; int i, j; soma = (int*) calloc(cols, sizeof(int)); for(j = 0; j < cols; j++){ for(i = 0; i < rows; i++){ *(soma + j) = *(soma + j) + *(*(matriz + i) + j); } } return soma; A malandragem aqui é ter invertido a ordem do i e j para que assim a matriz seja percorrida coluna por coluna (em vez de linha por linha). Aconselho você a alocar o vetor soma com calloc() porque com ela já vai atribuir 0 a todos os valores (enquanto malloc() deixa lixo). Espero que entenda a explicação. Tenho o programa aqui pronto rodando. Se mesmo assim não funcionar, disponibilizo o código completo. Qualquer coisa, procure sobre "ponteiros e matrizes" e "alocação dinâmica". Acho que vai te ajudar. ==================/====================== Agora que vi seu código... Está errado num fato simples. Não posso fazer isto: int vetor[10];i = 15;vetor[i] = 3; Isso é um erro fatal. Vetores estáticos tem seu espaço alocado antes do programa ser executado (tempo de copilação). Este valor NÂO pode ser alterado. Se eu fizer esta atribuição que fiz acima, nada me garante que no endereço de memória onde tá armazenado o vetor não seja código do próprio programa ou qualquer outra aplicação do sistema operacional. Por isto que para este problema, você precisa de conhecimento de ponteiros e alocação dinâmica porque AI sim, este será alocado e armazenado na memória do computador em tempo de execução.

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