Jump to content

Recommended Posts

Posted (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 by einstein
Posted (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 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

Posted

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.

Posted (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 by bsccara
  • Vote 1
Posted (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 by Flinger
  • Vote 1
Posted

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?

Posted

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);
Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.