Jump to content
Sign in to follow this  
pedrosimoes

Dúvida em strings.

Recommended Posts

pedrosimoes

É o seguinte segue-se o código de um programa em c, da parte da matéria de strings. Queria a vossa opinião em termos de estrutura e dicas para melhorar.

#include <stdio.h>

void leitura (int x[],int n )//procedimento para leitura dos componentes.
{
int i;
for(i=0;i<n;i++)
{
	printf("\nIntroduza o valor para o componente %d:",i+1);
	scanf("%d",&x[i]);
}
}
void escreve (int x[], int n)//procedimento para escrita dos componentes.
{
int i;
puts("\n");
for(i=0;i<n;i++)
{
	printf("x[%d]=%d",i+1,x[i]);
	puts("\n");
}
}
int maior (int x[], int n)//Funçao para determinar a maior componente do vector.
{
int i, m;
m=0;
for(i=1;i<n;i++)
{
	if(x[i]>x[m])
		m=i;
	return m;
}
}
int main ()
{
int n,x[20],max;
printf("Introduza o numero de componentes para o vector, sem exceder 20:");
scanf("%d",&n);
leitura (x,n);
printf("\nA maior componente do vector");
escreve (x,n);
max=maior (x,n);
printf("\nÉ x[%d]=%d\n\n",max+1,x[max]);
return 0;

}

Ao executar o prog tem um pequeno erro que ainda não consegui resolver, que é na função em que tenho de encontrar o componente maior. Dá-me sempre o valor do segundo elemento.

EDIT: Um aparte, supostamente declarar int x[] não dá um erro de compilaçao? Eu li no livro do Damas que escrever só por sim "int x[]" dá erro mas neste programa acima não encontrou qualquer erro.

Share this post


Link to post
Share on other sites
pedrosimoes

Mas supostamente não tenho de meter x[ i ] sendo o i o valor que o user mete para o numero de componentes?

Share this post


Link to post
Share on other sites
Localhost

Quando tu chamas a função leitura por exemplo com o argumento do array, não precisas de pôr o tamanho do array porque ao passares como argumento a função leitura "já vai saber" o tamanho.


here since 2009

Share this post


Link to post
Share on other sites
TheDark

Como é que a função leitura pode saber o número de posições do array que são para preencher?

Um aparte, supostamente declarar int x[] não dá um erro de compilaçao? Eu li no livro do Damas que escrever só por sim "int x[]" dá erro mas neste programa acima não encontrou qualquer erro.

Suponho que estás a falar dos parâmetros das funções. E não, quando essa sintaxe é utilizada na declaração de parâmetros, é válida. Se fosse na declaração de variáveis, sim, era inválida.


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

Como é que a função leitura pode saber o número de posições do array que são para preencher?

Suponho que estás a falar dos parâmetros das funções. E não, quando essa sintaxe é utilizada na declaração de parâmetros, é válida. Se fosse na declaração de variáveis, sim, era inválida.

Pode saber porque estamos a chama-la com o array como um dos parametros, daí não termos de declarar o tamanho do array.


here since 2009

Share this post


Link to post
Share on other sites
mogers

Creio que escrever

void escreve (int x[], int n)

é equivalente a

void escreve (int * x, int n) 

Apenas estás a indicar que tens um apontador para inteiros no primeiro parâmetro. Assim de repente, não vejo vantagens em declarar o parâmetro com o tamanho, para além da legibilidade do código.

Quando tu chamas a função leitura por exemplo com o argumento do array, não precisas de pôr o tamanho do array porque ao passares como argumento a função leitura "já vai saber" o tamanho.

Acho que isto está errado. Através deste código, penso que estas declarações dos parâmetros são equivalentes.

void f(int x[])   {    printf("f: %d\n",sizeof(x));    }
void g(int x[20]) {    printf("g: %d\n",sizeof(x));    }
void h(int * x)   {    printf("h: %d\n",sizeof(x));    }

int main() { 
    int x[20];
    printf("t: %d\n", sizeof(x));
    f(x);
    g(x);
    h(x);
    return 0;
}

output:

t: 80

f: 4

g: 4

h: 4


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Share this post


Link to post
Share on other sites
TheDark

Mas ele não está a preencher o array. O n não é o tamanho do array, é o número de valores que vão ser pedidos ao utilizador.


Desaparecido.

Share this post


Link to post
Share on other sites
pedrosimoes

Desde já obrigado a todos. Eu percebi que não há problema ao estar a declarar o parametro x[] sem por o numero de elementos mas quando chamo a função que contém este parâmetro tenho de meter um valor, sendo este uma variavel local da funçao que uso para chamar a array ou entao pode ser um nuemro, tal como pus no meu prog acima.

Outra questão eu não entendi muito bem a utilidade/diferença em usar apontadores, simplesmente por ainda não perceber bem a função deles.

Cumps

Share this post


Link to post
Share on other sites
Localhost

mogers, com esse exemplo ainda me deste mais razão. Tu se passares sem indice o parametro da função ao chamares essa mesma função ele passa o tamanho do array, daí não teres de declarar o tamanho do array.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Usar ponteiros ou apontadores neste caso é exactamente a mesma coisa no entanto o tempo de processamento é mais rápido. O ponteiro que o mogers deu como exemplo aponta para o primeiro elemento do array. O mesmo acontece com strings, tu num scanf não precisas de colocar o & porque já existe lá um ponteiro para o primeiro elemento da string (o nome de um array é um ponteiro para o seu primeiro elemento).

char s_teste[10];
scanf("%s", s_teste);


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Ups, my bad. Eu vi mal o output. Pensei que 80 estava na função f.

Pensei que passava o tamanho, desculpem


here since 2009

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

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