Ir para o conteúdo
Rui Ribeiro

esta certo?

Mensagens Recomendadas

Rui Ribeiro

os meus colegas resolveram o seguinte exercicio, que dizem estar correcto, eu acho que nao está. podem ver?

Ler os 30 elementos de um Vector A. Construír um Vector B do mesmo tipo,

observando a seguinte lei de formação: “Todo o elemento de B deve ser o cubo

do elemento de A correspondente”. Incluír uma rotina de pesquisa sequencial,

para pesquisar um valor a ser determinado pelo utilizador, de entre os

elementos do Vector B.

#include<stdio.h>;
int a,A[30],B[30],i = 0;
int main()
{
for (i = 0; i < 30; i++)
{
	B[i] = (A[i] * A[i] * A[i]);
}
     printf("Digite o valor que deseja");
     scanf("%d", & a);
     while(B[i] != a)
     {
            B[i++];
     }
     printf("O valor requesitado esta na posicao %d",a);
     system("pause");
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Diutsu

então testa.

Teoricamente está bem, mas não funciona.

Estão a reutilizar o i, sendo que o i após o for tem o valor 30.

B[30] -> SEGFAULT

por isso deviam reinicializar i a 0 antes do while.

E fazer B[i++]; faz tanto como i++.

e portanto o while podia ficar um for(i=0; B[ i ]!=a; i++);


XX SINFO - Semana Informática

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Nao esta correcto.

Falta a parte de "ler os 30 elementos de um Vector A" (nota que da maneira em que apresentaste, ha leituras a elementos de A nao inicializados o que é invalido).

Falta "inserir uma rotina..." e

a parte de pesquisa nao contempla a nocao de que o elemento pedido pelo utilizador possa nao existir.

Nota: a funcao system() tem o prototipo no header <stdlib.h> que nao foi incluido

Nota2: tenta evitar ao maximo variaveis globais


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Como o Diutsu disse o "i" não é inicializado.

No entanto ele se esqueceu que o ciclo de procura não deve ultrapassar o número de elementos do array.

Isto quer dizer, a instrução de paragem do ciclo de pesquisa não pode ser somente

B[ i ]!=a

mas deve contemplar o valor de "i"

i < 30

resultando em

for(i=0; B[ i ]!=a && i < 30; i++)

podes é fazer uma verificação final se o ciclo não encontrou o valor a pesquisar


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Para além do que foi dito, continuo a ver as mesmas más práticas que tenho visto noutros tópicos:

1. As variáveis estão declaradas fora do main (globais)

2. O main não faz return.

int main() {
    int a, A[30], B[30], i = 0;
    // restante código
    return 0; // ou, ainda mais correcto, return EXIT_SUCCESS; com a inclusão do stdlib.h
}


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

2. O main não faz return.

Desde que foi publicado o Standard mais recente (em 1999) que a ausencia de return na funcao main equivale a um return 0; imediatamente antes do chaveta final.

Se o teu compilador se queixa da ausencia do return na funcao main, tambem se deve queixar de comentarios comecados por "//" e que continuam ate ao fim da linha (1); tambem se deve queixar de declaracao de variaveis misturadas com outras expressoes (2); tambem se deve queixar de virgulas "penduradas" nos enums (3); e tambem se deve queixar de declaracoes dentro do for (4) ;)

// comentario (1) invalido em C89

int a = 42, b;
b = a * a;
int c = a + b; /* (2) erro em C89: declaracao de c depois duma expressao */

enum ErrosSistema { ALLOK, ERROMEMORIA, ERRODISCO, }; /* (3) ultima virgula ilegal em C89 */

for (int i = 0; i < 100; i++) /* whatever */; /* (4) declaracao de i ilegal em C89 */


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Hmm... nem por isso:

int main() {
    // comentario
}

$ gcc -Wall testc89.c 
testc89.c: In function ‘main’:
testc89.c:3: warning: control reaches end of non-void function

A questão da utilização ou não do return no final do main é uma coisa discutida, mas é sempre boa prática colocar os returns nas funções que retornam alguma coisa, independentemente de o compilador fazer isso por ti ou não.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Desde que foi publicado o Standard mais recente (em 1999) que a ausencia de return na funcao main equivale a um return 0; imediatamente antes do chaveta final.

Hmm... nem por isso:

int main() {
    // comentario
}

$ gcc -Wall testc89.c 
testc89.c: In function ‘main’:
testc89.c:3: warning: control reaches end of non-void function

1 fala sobre o C99 tu dizes q é mentira para C89, isso n serve de refutação ao afirmado, se queres refutar mostra um exemplo para o C99 e não para o C89. De qq modo:

A questão da utilização ou não do return no final do main é uma coisa discutida, mas é sempre boa prática colocar os returns nas funções que retornam alguma coisa, independentemente de o compilador fazer isso por ti ou não.

Concordo.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

1 fala sobre o C99 tu dizes q é mentira para C89, isso n serve de refutação ao afirmado, se queres refutar mostra um exemplo para o C99 e não para o C89. De qq modo:Concordo.

Não está lá nada que mostre que é C89... excepto o nome do ficheiro que não é indicador de nada. Só estava a refutar o facto de os compiladores que se queixam da falta do return no main terem todas aquelas limitações. Como podes ver o compilador avisou relativamente à falta de return, mas não fez nada em relação ao comentário. Podia fazer o mesmo para as restantes afirmações, mas achei que não valia a pena.

Até porque:

$ gcc -Wall -std=c89 testc89.c 
testc89.c: In function ‘main’:
testc89.c:2: error: expected expression before ‘/’ token
testc89.c:3: warning: control reaches end of non-void function


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O gcc, sem a opcao -std=, porta-se como se se tivesse usado a opcao -std=gnu89. Com esta opcao, o compilador gcc aceita uma linguagem que nao e exactamente C (nem C89 nem C99).

Com as opcoes -std=c89 (por enquanto o mesmo que -ansi), e -pedantic o gcc comporta-se como um compilador de C89.

Com as opcoes -std=c99 e -pedantic o gcc comporta-se quase como um compilador de C99.

http://gcc.gnu.org/c99status.html

Como podes ver o compilador avisou relativamente à falta de return, mas não fez nada em relação ao comentário.

Experimenta "gcc -std=c89 -pedantic"

Nota que a minha resposta nao falava de nenhum compilador especifico. Apenas me limitei a enunciar algumas diferencas entre a linguagem definida em 1989 e 1999. Se os compiladores seguem as normas ou nao e outra questao.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

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.