Ir ao conteúdo
  • Cadastre-se

problemas com exercício simples em C....


Sibelly

Posts recomendados

E aí galera... estou com dificuldades nesse exercício...

Um vetor é paralelo a outro vetor caso exista um número real k, onde:


k ∗ a[i] = b[i], para todo i inteiro

Exemplo:

A = [1, 2, 3] é paralelo ao vetor B = [2, 4, 6], pois se k = 2, então temos:

2∗1=2

2∗2=4

2∗3=6

logo A e B são paralelos. Dados n pares de vetores de tamanho 5 cada, verificar se os vetores são paralelos ou não.

Entrada: A primeira linha contém um inteiro m equivalente a quantidades de pares e de vetores de tamanho 5, seguido dos pares de vetores, cada par numa linha.


2
1 2 3 4 5 2 4 6 8 10
1 1 1 1 1 2 2 2 2 3

Saída: A saída consiste em imprimir 1 caso o par de vetores seja paralelo e 0, caso contrário.


1
0

Aí está o que consegui fazer... mas... a saída não está correta... e no enunciado não diz até quanto o k precisa ser testado...

Agradeço desde já!



/* Define se um vetor é paralelo ao outro de acordo com a definição:
k ∗ a[i] = b[i], para todo i inteiro
Caso seja devolve valor 1, caso contrário devolve valor 0. */

# include <stdio.h>
# define MAX 5
# define TRUE 1
# define FALSE 0

int main (void){
int m, a[MAX], b[MAX], i, j, k, achou;

printf ("Informe a quantidade de pares de vetores: ");
scanf("%d", &m);

while(m > 0){
printf ("Informe o par de vetores: ");
for (i = 0; i < MAX; i++)
scanf ("%d", &a[i]);
for (i = 0; i < MAX; i++)
scanf ("%d", &b[i]);

achou = TRUE;
k = 1;
for (i = 0; i < MAX; i++){
if (k * a[i] != b[i]){
achou = FALSE;
k++;
}
else {
achou = TRUE;
}
}
if (achou){
printf ("%d\n", TRUE);
}
else
printf ("%d\n", FALSE);

m--;
}
return 0;
}

Link para o comentário
Compartilhar em outros sites

Ok então vamos lá.

/* Define se um vetor é paralelo ao outro de acordo com a definição: 
k ∗ a[i] = b[i], para todo i inteiro
Caso seja devolve valor 1, caso contrário devolve valor 0. */

# include <stdio.h>
# define MAX 5
# define TRUE 1
# define FALSE 0

int main (void){
int m, a[MAX], b[MAX], i, j, k, achou;

printf ("Informe a quantidade de pares de vetores: ");
scanf("%d", &m);

while(m > 0){
printf ("Informe o par de vetores: ");
for (i = 0; i < MAX; i++)
scanf ("%d", &a[i]);
for (i = 0; i < MAX; i++)
scanf ("%d", &b[i]);

achou = TRUE;/* não há motivo para atribuir TRUE agora, pois ele é dependente do procedimento que você criou abaixo, ou seja essa
linha é dispensável*/

k = 1;/* Pelo que eu pude entender k é uma variavel que recebe valor digitado pelo usuário,
então você não pode atribuir um valor assim para ele*/

for (i = 0; i < MAX; i++){
if (k * a[i] != b[i]){
achou = FALSE;
k++;/* O valor de k tem que ser constante, então não há motivos para que você o encremente*/
}

else {
achou = TRUE;
}

}
if (achou){
printf ("%d\n", TRUE);
}
else
printf ("%d\n", FALSE);

m--;
}
return 0;
}

Eu vi somente aqueles erros que indiquei no código, creio que foi erro de interpretação da sua parte :D, então mais atenção no enunciado e observe que tem gabarito para facilitar sua vida!

Link para o comentário
Compartilhar em outros sites


if (k * a[i] != b[i]){
achou = FALSE;
k++;
}

Esse condicional está errado, revise e veja que não há sentido em tal condição. Eu faria algo assim:


int k = 1, multiplo, i = 1;
if (b[0] > a[0]) {
while (k * a[0] < b[0]) {
if (k * a[0] == b[0]){
achou = TRUE;
for (i = 1; i < MAX; i++) {
if (multiplo * a[i] == b[i]) {
achou = TRUE;
}
else {
achou = FALSE;
}
}
break;
}
k++;
}
else {
achou = FALSE;
}
else {
while (k * b[0] < a[0]) {
if (k * b[0] == a[0]){
achou = TRUE;
for (i = 1; i < MAX; i++) {
if (multiplo * b[i] == a[i]) {
achou = TRUE;
}
else {
achou = FALSE;
}
}
break;
}
k++;
}
else {
achou = FALSE;
}
}

Não compilei nem nada, não sei se tá certo, mas a lógica é a seguinte: Você tem que comparar os números até um valor limite (ele não deve ser maior que o outro número comparado quando multiplicado com k). Primeiro o meu algoritmo faz a verificação com as primeiras coordenadas (se elas não passarem no teste, cai no else e o programa logo diz que a sentença não é verdadeira. Caso as primeiras coordenadas passarem no teste, aí ele faz o teste com as outras coordenadas e verifica se todos são multiplos com o mesmo valor que foi obtido da primeira coordenada.

Link para o comentário
Compartilhar em outros sites

Trin00, ele tem apenas que verificar se b = a * k mais nada, ou seja se for diferente é porque não são paralelos.


int a[5], b[5], k, m, i, Verifica = 1;//Neste caso Verifica recebe 1 porque consideramos ele inicialmente como verdadeiro
printf("Entre com o m\n");
scanf("%d", &m);

while (m>0){//Vai fazer o programa rodar m vezes
printf("Entre com o k\n");
scanf("%d",&k);

printf("Entre com os valores dos vetores\n");
for(i = 0; i < 5; i++)
scanf("%d", &a[i]);//preenche o vetor a
for(i = 0; i < 5; i++)
scanf("%d", &b[i]);//preenche o vetor b
i = 0;
while(i < 5){
if(k * a[i] != b[i]){//caso o função que você nos passou tenha valor falso ele faz verifica receber 0 e quebra o laço
Verifica = 0;
Break;
}
}

printf("%d\n",Verifica);//imprime o valor de Verifica como seu professor solicitou
Verifica = 1;// Faz Verificar ser verdadiro de novo
m--;
}

Dá uma compilada, mas tenta entender direitinho o que foi feito, espero ter ajudado.

Link para o comentário
Compartilhar em outros sites

é... realmente PVFigueiredo não tinha interpretado dessa maneira... pois na entrada ele não diz que devemos fornecer um numero k para multiplicarmos...

Mas ao fazer as modificações que você comentou deu certinho.... obrigada!

Agora Trin00.... você não inicializou a variavel multiplo com nada...



int k = 1, multiplo, i = 1;
if (b[0] > a[0]) {
while (k * a[0] < b[0]) {
if (k * a[0] == b[0]){
achou = TRUE;
for (i = 1; i < MAX; i++) {
if (multiplo * a[i] == b[i]) { nessa linha ele esta multiplicando por quanto no caso??
achou = TRUE;
}

Pelo o que eu acho que entendi.... o multiplo deve receber o valor de k certo?

Eu me perdi com os colchetes... implementei o código assim... mas só me retorna 0...

Estou tentando entender ainda... obrigada pela paciência....



/* Define se um vetor é paralelo ao outro de acordo com a definição:
k ∗ a[i] = b[i], para todo i inteiro
Caso seja devolve valor 1, caso contrário devolve valor 0. */

# include <stdio.h>
# define MAX 5
# define TRUE 1
# define FALSE 0

int main (void){
int m, a[MAX], b[MAX], i, k, achou, multiplo;

printf ("Informe a quantidade de pares de vetores: ");
scanf("%d", &m);

while(m > 0){
printf ("Informe o par de vetores: ");
for (i = 0; i < MAX; i++)
scanf ("%d", &a[i]);
for (i = 0; i < MAX; i++)
scanf ("%d", &b[i]);


k = 1;
multiplo = k;
if (b[0] > a[0]) {
while (k * a[0] < b[0]) {
if (k * a[0] == b[0]){
achou = TRUE;
for (i = 1; i < MAX; i++) {
if (multiplo * a[i] == b[i]) {
achou = TRUE;
}
else {
achou = FALSE;
}
}// fim do for
break;
}//fim do if
else{
k++;
achou = FALSE;
}// fim do else

}// fim do while
}// fim do if
else {
while (k * b[0] < a[0]) {
if (k * b[0] == a[0]){
achou = TRUE;
for (i = 1; i < MAX; i++) {
if (multiplo * b[i] == a[i]) {
achou = TRUE;
}
else {
achou = FALSE;
}
}// fim do for
break;
}// fim do if

else {
k++;
achou = FALSE;
}// fim do else
}// fim do while

} // fim do else


if (achou)
printf ("%d\n", TRUE);

else
printf ("%d\n", FALSE);

m--;
}// fim do while
return 0;
}// fim da main

Link para o comentário
Compartilhar em outros sites

Trin00, ele tem apenas que verificar se b = a * k mais nada, ou seja se for diferente é porque não são paralelos.


int a[5], b[5], k, m, i, Verifica = 1;//Neste caso Verifica recebe 1 porque consideramos ele inicialmente como verdadeiro
printf("Entre com o m\n");
scanf("%d", &m);

while (m>0){//Vai fazer o programa rodar m vezes
printf("Entre com o k\n");
scanf("%d",&k);

printf("Entre com os valores dos vetores\n");
for(i = 0; i < 5; i++)
scanf("%d", &a[i]);//preenche o vetor a
for(i = 0; i < 5; i++)
scanf("%d", &b[i]);//preenche o vetor b
i = 0;
while(i < 5){
if(k * a[i] != b[i]){//caso o função que você nos passou tenha valor falso ele faz verifica receber 0 e quebra o laço
Verifica = 0;
Break;
}
}

printf("%d\n",Verifica);//imprime o valor de Verifica como seu professor solicitou
Verifica = 1;// Faz Verificar ser verdadiro de novo
m--;
}

Dá uma compilada, mas tenta entender direitinho o que foi feito, espero ter ajudado.

Desculpe-me, realmente você está certo. Eu só dei uma olhada no código e tentei corrigir, esqueci de ler o enunciado do problema adequadamente.

[]'s.

Link para o comentário
Compartilhar em outros sites

Valeu galera pela ajuda!

O pensamento do Trin00 estava correto... pois se analisar o enunciado ele não pede para fornecer o K.... você precisa descobri-lo e testá-lo... ai está o código que um amigo meu implementou....



/* Define se um vetor é paralelo ao outro de acordo com a definição:
k ∗ a[i] = b[i], para todo i inteiro
Caso seja devolve valor 1, caso contrário devolve valor 0. */

# include <stdio.h>
# define MAX 5
# define TRUE 1
# define FALSE 0

int main (void){
int n, a[MAX], b[MAX], i, k, achou;

printf ("Informe a quantidade de pares de vetores: ");
scanf("%d", &n);

while(n > 0){
printf ("Informe o par de vetores: ");
for (i = 0; i < MAX; i++)
scanf ("%d", &a[i]);
for (i = 0; i < MAX; i++)
scanf ("%d", &b[i]);

k = b[0] / a[0]; Aqui descobrimos o valor de K....

for (i = 1; i < n; i++){
if (k * a[i] == b[i]){ e aqui testamos ele para as outras posições do vetor....
achou = TRUE;
}
else{
achou = FALSE;
i = n; Aqui o laço é interrompido caso não passe no teste....
}
}

if (achou){
printf ("%d\n", TRUE);
}
else
printf ("%d\n", FALSE);

n--;
}
return 0;
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...