Jump to content
happyZeBra

Exercicio Vetores C

Recommended Posts

happyZeBra

Boas noites.

Neste exercício tenho de criar uma funçao que recebe dois vetores por argumento, um de caracteres e outro de inteiros. O objectivo é escrever no ecrã cada elemento do vetor de caracteres (um caracter), repetindo-o um nº de vezes igual ao valor inteiro guardado no elemento correspondente do vetor de inteiros.

Exemplo:

int VC[5] = {'a', 'b', 'c', 'd', 'e'};

int VI [5] = {1,2,3,4,5};

Output deveria ser:

a

bb

ccc

dddd

eeeee.

A minha tentativa de codigo (nao muito feliz) foi:

void func(char vc [], int vl [], int n){
int i;
for (i = 0; i <= n; i++){
while (i <= vl[i]){
printf("%c", vc[i]);
i++;
}

}
}

Se alguem me puder ajudar a compreender o que esta errado seria optimo :)

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

O enunciado pede uma função com dois argumentos: eu vejo 3 argumentos.

Não entendo o propósito do primeiro ciclo for e as voltas que o i está a dar.

Conselho: esquece esse código e recomeça. Tu não estás longe da solução, mas ao mesmo tempo estás longe porque introduziste um n e andas a dar voltas com o i entre dois ciclos.

O objectivo é repetir vl vezes o caracter vc, certo? Então não precisas de mais nada, apenas variáveis iteradoras para os ciclos.


Knowledge is free!

Share this post


Link to post
Share on other sites
happyZeBra

Sim ja tinha reparado, aquele "n" seria a dimensao de ambos os vetores!

Em relaçao ao "i", e verdade que ando ali as voltas e que esta deveras confuso o codigo, ate porque basta tirar o "i++;" e da me ciclo infinito :/

Vou tentar de novo :)

Share this post


Link to post
Share on other sites
thoga31

Não uses um terceiro argumento, determina isso dentro da própria função. Mais, podes ter o cuidado de determinar qual dos vectores é menor, pois se eles tiverem tamanhos diferentes vais ter erros.

#define COUNT_ELEMS(x) (sizeof(x) / sizeof(x[0]))

int min(int a, int b) {
  return (a<b) ? a : b;
}

void func(char vc[], int vl[]) {
  int elems = min(COUNT_ELEMS(vc), COUNT_ELEMS(vl));
  // código
}


Knowledge is free!

Share this post


Link to post
Share on other sites
HappyHippyHippo

Não uses um terceiro argumento, determina isso dentro da própria função. Mais, podes ter o cuidado de determinar qual dos vectores é menor, pois se eles tiverem tamanhos diferentes vais ter erros.

#define COUNT_ELEMS(x) (sizeof(x) / sizeof(x[0]))

int min(int a, int b) {
  return (a<b) ? a : b;
}

void func(char vc[], int vl[]) {
  int elems = min(COUNT_ELEMS(vc), COUNT_ELEMS(vl));
  // código
}

isso não é verdade ... a brincadeira de usar o sizeof de um array só funciona na função de declaração do array

#include <stdio.h>
#include <string.h>

void test(int S[]) {
   printf("test : %ld\n", sizeof(S)); // 4 em maquinas 32 bits, 8 em maquinas 64 bits
                                      // isto porque int S[] é um ponteiro e não um array
}

int main() {
   int S[] = {1, 2, 3};

   printf("main : %ld\n", sizeof(S)); // 12 em maquinas 32 bits, 12 em maquinas 64 bits
                                      // porque é sizeof(int) * 3 = 4 * 3 = 12
                                      // isto porque sim, S é um array

   test(S);

   return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thoga31

Eish, esqueci-me desse "pormenor"... :confused:

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
happyZeBra

Em relaçao ao tamanho, de inicio estou a assumir que ambos tem o mesmo tamanho.

em relaçao ao codigo nao estou a conseguir, eu estou a entender o erro(penso eu), que esta na maneira como estou a incrementar o "i", mas nao sei se e por ja estar cansado, nao la estou a chegar.

Share this post


Link to post
Share on other sites
thoga31

PARA i = 0 ATÉ tamanho(vl) INCREMENTA 1 FAZER:
  Repetir vl[i] vezes o caracter vc[i]
FIM-PARA

Recomendo usar outro for para o segundo ciclo.


Knowledge is free!

Share this post


Link to post
Share on other sites
happyZeBra

Bem, hoje de manha ja com cabeça fresca voltei a tentar e penso que acertei logo na primeira, realmente bloquiei numa coisa que seria simples.

void func(char vc [], int vl []){
int i,j;
for (i = 0; i < TAM; i++){
    for (j = 0; j < vl[i]; j++)
       printf("%c\t", vc[i]);
   }
}

o TAM é uma constante definida com valor 5.

o output saiu como deveria :) algo que deva mudar ou melhorar ?

Edited by thoga31
GeSHi

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

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