Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

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
pedrosimoes

Neste caso sim, porque na main eu tenho x[20], automaticamente tem 20 elementos. Estou certo?

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

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
Sign in to follow this  

×

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.