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

suzy

[C] Ajuda: Passagem de argumentos

13 mensagens neste tópico

:wallbash:

Faça uma função que receba como argumentos um vector de valores inteiros e

a respectiva dimensão e converta todos os valores inferiores a cem no valor

cem. A função deve devolver o número de valores inteiros alterados na tabela

original.

int funcao(int vetor[],int dim)
{
dim=7;
int novo[dim],i,j,total=0;
printf(" coloque os valores \n";
scanf("%d",&vetor[i]);
   for(i=0,i<dim,i++)
   {
   vetor[i]=novo[j];
     if(vetor[i]<100)
      {
      novo[j]==100;
      total=total+1;
      }
     return total;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, tem alguns erros...

int funcao(int vetor[],int dim)
{
// A dimensao e' recebida pela funcao, nao podes altera-la.
// O vector tambem e' recebido pela funcao,  logo nao deves pedi-lo ao utilizador, mas sim usar o que foi passado a funcao.
int novo[dim],i,total=0; // Nao precisas de dois iteradores, ate porque um deles nem sequer estava a ser incrementado.
   for(i=0,i<dim,i++)
   {
   novo[i]=vetor[i]; // Se queres atribuir o valor a uma variavel, a variavel fica do lado esquerdo e o valor que lhe queres atribuir fica do lado direito.
     if(vetor[i]<100)
      {
      novo[i]=100; // Se queres atribuir o valor a uma variavel, usas = e nao ==.
      total=total+1;
      }
    } // Faltava uma chaveta a fechar o for antes do return.
    return total;
}

NOTA: Devias começar a ler as respostas aos teus posts, já criaste inúmeros e continuas a cometer os mesmos erros em todos eles.

NOTA 2: Podes editar os teus posts, não precisas de criar 2 a dizer o mesmo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:-[ sorry colcoquei outro post sem querer , sim tens razão!  :-[ ainda tou mto verde nisto  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal tou com um problema parecido, só que pretendia mandar como parametro para a função um vector de uma estrutura, por exemplo: mod.nome_componente, e queria enviar esse valor para a função:

do genero:

 int funcao (int vect[], x)
{
.
.
.
scanf ("%d",&mod[i].nome_componente) /*é introduzido o valor*/
função (mod[10].nome_componente , mod[i].nome_componente)

e a função receba o indice i do vector e utilize o valor do vector, como faço ao declarar a função?

A minha duvida é se no primeiro parametro estou a dizer que o vector e de 10 posiçõs ou tou a dizer para considerar o valor do indice 10...

outra duvida é se tenho que mandar o cumprimento do vector, ou posso enviar as casas do vector que pretendo ler, para o caso de não ter o vector inteiramente preenchido

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal tou com um problema parecido, só que pretendia mandar como parametro para a função um vector de uma estrutura, por exemplo: mod.nome_componente, e queria enviar esse valor para a função:

do genero:

scanf ("%d",&mod[i].nome_componente) /*é introduzido o valor*/
função (mod[i].nome_componente)

e a função receba o indice i do vector e utilize o valor do vector, como faço ao declarar a função?

Exactamente como Saco fez.

função(int array[])

PS: Não foste muito explícito, se não é disto tanta explicar melhor. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já alterei, A minha duvida é se no primeiro parametro estou a dizer que o vector é de 10 posiçõs ou tou a dizer para considerar o valor do indice 10...

outra duvida é se tenho que mandar o cumprimento do vector, ou posso enviar as casas do vector que pretendo ler, para o caso de não ter o vector inteiramente preenchido

 função (mod[10].nome_componente , mod[i].nome_componente)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê se isto ajuda:

main() {
char nome[20];
strcpy(nome,"nakuro");

funcao(nome);

}

funcao(char arg[20]) {

printf("O teu nome e %s", arg);
//Imprime: O teu nome e nakuro....

}

Este é o funcionamento da passagem de parâmetros. Penso que está bem explicito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim explicaste bem, obrigado, mas vou tentar explicar o meu problema por completo, talvez ate nem esteja a explicar bem a minha duvida :cheesygrin:

tenho a seguinte estrutura:

typedef struct compomod
{
long int cod_componente;
char nome_c[10];
int long stock;
}compmod;          /*estruturas para suportar um modelo sapato e os respectivos componentes do modelo que vãos ser listados e depois copiados para a
estrutura compmod, ou aqueles que o utilizador quer claro esta*/

typedef struct modelo
{
int long cod_modelo;
char nome_modelo[10];
struct compomod lis_comp[10];
}modb;
modb mod[10];

/*função para ordenar os dados no vector, ou seja se por exemplo no decorrer do programa um utilizador apagar um lugar no vector, em vez deste ficar
com um "buraco vazio" no meio do dados, esta função puxa para trás os dados*/
int ordenar (int inf, int sup)  /*parametros que a função vai receber*/
{
int i,j, temp;

while (sup>inf)
{
i=inf;
j=sup;
temp= mod[inf].cod_modelo;
/*dividir sequencia em duas*/
while (i<j)
{
   while (mod[j].cod_modelo>temp)
   {
     j=j-1;
   }
   mod[i]=mod[j];
   while ((i<j)&& (mod[i].cod_modelo<=temp))
   {
   i++;
   }
   mod[j]=mod[i];
}
mod[i].cod_modelo=temp;
/*ordena recursivamente*/
ordenar ( inf, i-1);
inf=i+1;
}
}



int pesquisar (int vect[],int x) /*função de psquisa binaria no vector para procurar numeros iguais*/
{
int a,b,c;
a=0;
b=x-1;
c=(a+b)/2;
while ((a<=c)&& ( vect[c]!=x))
{
 if (x< vect[c])
 {
   b=c-1;
 }
 else
 {
 a=c+1;
 }
 c=(a+b)/2;
}
if (a<=b)
{
  return c;
}
else
{
  return -1;
}
}


void adicionar () /*função para uma opção do menu que neste caso é adicionar modelos, o programa vai validar se existem posições vazios e depois
verifica se o numero que o utilizador introduzui já existe no vector*/
{
 int i,x,j;
 if (cont<10) /*usa um contador global para contar os modelos*/
 {
    printf ("insira o codigo do modelo\n");
    scanf ("%d",&mod[cont].cod_modelo);
    i=pesquisar(mod[10].cod_modelo,mod[cont].cod_modelo); /*este metodo de pesquisa para vr se já existe*/
    if (i!=-1)
    {
      printf ("Não pode inserir esse produto pois já existe um produto inserido com o mesmo codigo");
    }
    else
    {
      mod[cont].cod_modelo=x;
      printf ("introduza o nome do modelo\n");
      fflush (stdin);
      gets (mod[i].nome_modelo);
      printf ("introduza o codigo de componente que pretende adicionar");
      scanf ("%d", &mod[cont].lis_comp[contc].cod_componente);
      j=pesquisar (mod[cont].lis_comp[10].cod_componente, mod[cont].lis_comp[contc].cod_componente); /* se não existir nenhum cod de modelo
igual, então o programa vai fazer o mesmo (validar codigos,pesquisa, ordenar) na estrutura componentes

      cont++;
      ordenar(0, cont-1);
    }
  }
  else
  {
  printf ("nao existe espaço para adicionar mais modelos");
  }

A minha duvida é se posso enviar os parametros das varias estruturas para a mesma função, em vez de estar sempre a rescrever a função para cada

estrutura, e se como eu fiz ta correcto.

actualmente tenho um warning do genero:

109 e:\trabal~1\c\trabal~1\progra~1\estrut~1.c

"warning: passing arg 1 of `pesquisar' makes pointer from integer without a cast"

Ta um bocado confuso em sei :hmm:, de qualquer das amneiras j´ajudaram bastante, mas se me conseguissem desenrascar.. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes chamar a mesma função várias vezes se é isto que perguntaste. Quanto ao erro, assim não dá para ver onde dá o Warning. :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

no fundo se posso enviar vectores diferentes de estruturas diferentes como parâmetro para a função, ou seja primeiro mando a modelos e depois a componentes, separadamente, como são tipos de dados diferentes não causarão problemas?

ou seja numa parte ponho isto:

i=pesquisar(mod[10].cod_modelo,mod[cont].cod_modelo);

mais á frente no programa invoco a mesma função mas com os parametros:

j=pesquisar (mod[cont].lis_comp[10].cod_componente, mod[cont].lis_comp[contc].cod_componente);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso depende de como faças. Eu num trabalho do meu 1º ano usei 2 funções de ordenação. Uma ordenava  os valores de uma estrutura, outra da outra estrutura.

A minha função de ordenação foi a seguinte:

void ordena_alu(struct alunos aluno[], int inf, int sup)

{

struct alunos tmp[1];/*"tmp é um array de uma posição do tipo struct alunos que apenas vai ser usado nesta função*/

int i, j,cont;

while (sup>inf)

{

	i=inf;

	j=sup;



	/* copiar o conteudo do array aluno para o array tmp --> para fezer as comparacoes */

	tmp[0]=aluno[inf];



	/*dividir sequências em 2*/

	while (i<j)

	{

		while(aluno[j].numeroaluno>tmp[0].numeroaluno)

			j--;

		aluno[i]=aluno[j];

		while ((i<j) && (aluno[i].numeroaluno<=tmp[0].numeroaluno))

			i++;

		aluno[j]=aluno[i];

	}



	/* copiar o conteudo do array tmp  para o array aluno */

	aluno[i]=tmp[0];



	/*ordena recursivamente*/

	ordena_alu(aluno, inf,i-1);

	inf=i+1;

}

}

Ou seja, recebia mais um parâmetro que é a estrutura. Como já disse também fiz outra função para ordenar outra estrutura.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que a dúvida aqui é prende-se com a passagem dos argumentos.

Como quer num caso quer no outro o que tu fazes é enviar um vector de inteiros e procurar um inteiro lá dentro (corrige-me se estou enganado), podes invocar a função as vezes que quiseres, com os argumentos que quiseres, não há problema, MAS...

A tua função recebe um vector de inteiros e um inteiro e o que lhe estás a passar é um inteiro e outro inteiro.

Também não consegui perceber para que serve a tua função pesquisar, porque tu não tens um vector de inteiros nem numa estrutura nem na outra.

0

Partilhar esta mensagem


Link 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