einstein Posted May 20, 2012 at 06:39 PM Report #457004 Posted May 20, 2012 at 06:39 PM (edited) Pretendo fazer um programa que faça a multiplicação de matrizes neste caso concreto pretendo implementar a multiplicação através de uma função , só que isto nao esta a funcionar correctamente. Esta multiplicação em c nao é possivel fazer? Que alterações seriam necessárias fazer para as dimensoes poderem ser arbitrárias? void mult(float res[5], float M[5][4], float v[4]){ int i=0; for(i=0;i<5;i++){ res[i]=(M[i] * v[i]); } } int main(){ float a[4]; float M[5][4]; int i=0; int n=0; float r[5]; printf("Introduza 10 caracteres\n"); for(i=0;i<4;i++){ printf("Valor %d\n", i+1); scanf("%f", &a[i]); } for(n=0; n<5; n++){ for(i=0;i<4;i++){ printf("Posicao da matiz linha %d coluna %d",n+1, i+1); scanf("%f", &(M[n][i])); } } mult(r, M, a); exit(0); } Duvida 2 Para fazer um programa que recebe uma string de um tamanho que nao sei e transformar as letras minusculas em maisculas o que é que eu preciso de corrigir? void converte_Mai(char linha[] ){ int i=0; int n=0; n=strlen( linha); for(i=0;i<n;i++){ if(linha[i]>'a' && linha[i]<'z'){ linha[i]= (linha[i]-'a')+'A'; } } int main(){ char a[]; printf("Digite uma string\n"); fgets(a, , stdin); exit(0); } Edited May 20, 2012 at 06:52 PM by einstein
KTachyon Posted May 20, 2012 at 07:09 PM Report #457007 Posted May 20, 2012 at 07:09 PM (edited) Tens que realizar todos os cálculos sobre cada um dos elementos da matriz para achares o valor de cada casa. Não podes enviar uma linha, porque esse conceito nem sequer existe em C. Eu diria que a segunda dúvida tem a sua resposta nesta linha: fgets(a, , stdin); E faltam-te chavetas no código também... Edited May 20, 2012 at 07:11 PM by KTachyon “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare
deathseeker25 Posted May 20, 2012 at 08:31 PM Report #457018 Posted May 20, 2012 at 08:31 PM Duvida 2 Para fazer um programa que recebe uma string de um tamanho que nao sei e transformar as letras minusculas em maisculas o que é que eu preciso de corrigir? void converte_Mai(char linha[] ){ int i=0; int n=0; n=strlen( linha); for(i=0;i<n;i++){ if(linha[i]>'a' && linha[i]<'z'){ linha[i]= (linha[i]-'a')+'A'; } } int main(){ char a[]; printf("Digite uma string\n"); fgets(a, , stdin); exit(0); } Ha primeira vista, vejo aqui alguns problemas que te aconselho a resolver antes de pensares exactamente na resoluçao do teu problema: Primeiro: for(i=0;i<n;i++){ if(linha[i]>'a' && linha[i]<'z'){ linha[i]= (linha[i]-'a')+'A'; } Quando fazes um if, deves fazer um else (que e a situação oposta a qual queres executar). Nem que o else seja um printf com um erro, deves sempre faze-lo para controlares melhor a execução do teu código. Para alem disso, ha uma função da biblioteca <ctype.h> que e a função toupper(int c) (http://linux.die.net/man/3/toupper) que te converte os teus caracteres minúsculos em caracteres maiúsculos. Aconselho a que a uses, facilita todo o código e evita que "reinventes a roda". Segundo: printf("Digite uma string\n"); fgets(a, , stdin); Eu ate te ia sugerir que usasses um scanf, mas como queres ler uma string inteira e o scanf tem sérios problemas com whitespaces, usa um while com a função getchar(), ou simplesmente um read (http://linux.die.net/man/2/read), que talvez ate seja a melhor das hipóteses.
bsccara Posted May 20, 2012 at 08:42 PM Report #457022 Posted May 20, 2012 at 08:42 PM (edited) Que alterações seriam necessárias fazer para as dimensoes poderem ser arbitrárias? Cria uma estrutura para conter um ponteiro para a matriz alocada dinamicamente e as dimensões da mesma. Tipo : struct matriz { int linhas; int colunas; float * matriz; } Cria uma função para alocar e inicializar uma estrutura destas, copiando as dimensões para os campos da estrutura e alocando memória para a matriz com 'malloc(linhas * colunas * sizeof(float))'. Cria uma função para gravar um valor num elemento da matriz contida na estrutura passada por ponteiro. Altera a tua função de multiplicação para receber ponteiros para estruturas destas e usa os campos das mesmas para saberes as dimensões delas. Usa as dimensões para controlar os limites dos ciclos. Conforme o pretendido cria uma função para retornar o valor dum elemento duma matriz ou para imprimir o conteúdo todo da matriz. Cria uma função para destruir uma estrutura destas e a matriz nela contida. Edited May 20, 2012 at 08:43 PM by bsccara 1 Report
Flinger Posted May 21, 2012 at 08:35 AM Report #457081 Posted May 21, 2012 at 08:35 AM (edited) void mult(float res[5], float M[5][4], float v[4]){ int i=0; for(i=0;i<5;i++){ res[i]=(M[i] * v[i]); } } M é uma matriz, não um vector. Logo M não é um float mas sim um float[] por isso o resultado não vai sair o que tu queres. Edited May 21, 2012 at 08:38 AM by Flinger 1 Report
einstein Posted May 22, 2012 at 07:20 PM Author Report #457458 Posted May 22, 2012 at 07:20 PM Obrigado a todos pelas respostas. Já consegui fazer a multiplicação de matrizes, agora se as dimensões forem arbitrárias é que não percebi muito bem. Neste caso tenho uma estrutura que tem um ponteiro para a posição que eu quero. Como eu faço a matriz propriamente dita? Em relação à minha segunda questão aquele espaço em branco do fgets está de propósito pois não sabia o que colocar ali, pois eu nao sei o tamanho da string. Sera que posso colocar 1024 ? Em relação a usar funções da biblioteca <ctype.h> , não o queria fazer pois ainda não vi muito bem todas as bibliotecas existentes. Em relação ao getchar, o que este faz propriamente, é que eu nunca percebi muito bem :S. Eu pensava que ele esperava até o utilizador carregar no enter?
bsccara Posted May 22, 2012 at 08:23 PM Report #457468 Posted May 22, 2012 at 08:23 PM Em relação à minha segunda questão aquele espaço em branco do fgets está de propósito pois não sabia o que colocar ali, pois eu nao sei o tamanho da string. Sera que posso colocar 1024 ? Podes se meteres também na declaração da variável 'a'; a declaração 'char a[];' não é válida. Terias de escrevê-la como 'char a[1024];'. Obrigado a todos pelas respostas. Já consegui fazer a multiplicação de matrizes, agora se as dimensões forem arbitrárias é que não percebi muito bem. Neste caso tenho uma estrutura que tem um ponteiro para a posição que eu quero. Como eu faço a matriz propriamente dita? O ponteiro não seria para a posição que queres mas para o inicio do bloco de memória que contém a matriz. Fazes a matriz como te indiquei anteriormente e acedes aos elementos assim : valor = *(estrutura->matriz + (linha * estrutura->colunas) + coluna);
einstein Posted May 22, 2012 at 09:04 PM Author Report #457476 Posted May 22, 2012 at 09:04 PM Podes se meteres também na declaração da variável 'a'; a declaração 'char a[];' não é válida. Terias de escrevê-la como 'char a[1024];'. O ponteiro não seria para a posição que queres mas para o inicio do bloco de memória que contém a matriz. Fazes a matriz como te indiquei anteriormente e acedes aos elementos assim : valor = *(estrutura->matriz + (linha * estrutura->colunas) + coluna); Ah. Ok, estava a fazer confusão.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now