Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

pedrosimoes

Dúvida em strings.

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bruno1234

O exemplo do moger é mto claro.

O sizeof do array recebido como parametro devolve 4.

São os 4 bytes q o ponteiro ocupa.

Se o array tem 10 elementos, ou 50 elementos, o sizeof vai ser smp 4 pq é o tamanho q ponteiro ocupa.


Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.