Por favor, posso obter uma dica sobre onde concentrar sobre a formatação? [fechadas]

StackOverflow https://stackoverflow.com/questions/698973

  •  22-08-2019
  •  | 
  •  

Pergunta

O programa é suposto para calcular o número de argumentos, iterar sobre a lista de argumentos, para cada argumento converter o argumento para um inteiro e copiá-lo para uma matriz, iterar sobre os elementos do array, adicionando o valor de cada um a uma variável (isto calcula a soma dos elementos), e imprima a soma. Não haverá mais de 15 argumentos. Até agora eu tenho:

int sumofA (int sizeofA, int x, int y){  
  int i = sizeofA;  
   if (i <= 15){  
      int z = x + y;  
      return z;  
   }  
}  

int main (int argc, char*argv[]){    
   int sizeofA = argc - 1;  
   int i = 1;  
   while (i <= sizeofA){  
      int x = GetInt (argc, argv, i);  
      i = i + 1;  
      int y = GetInt (argc, argv, i);     
      printf ("%d\n", sumofA (sizeofA, x, y));
   }  
   return 0;  
}  

Ok, agora (quando administrado três diferentes ./a argumentos) imprime a soma do primeiro argumento e o segundo argumento ... em seguida, o segundo eo terceiro ... e, em seguida, o valor do terceiro argumento. Por quê?

Aqui está o código para GetInt (eu tenho que usar isso):

int GetInt (int argc, char * argv[], int i) {  
   if (i < 0 || i >= argc) return 0;  
   return atoi(argv[i]);  
}  

Eu preciso passar e atribuir a cada argumento para um inteiro (ex. int z = GetInt (argc, argv, i + 2))?

Foi útil?

Solução

Há um par deste errado acontecendo aqui:

  • i não está definido em sumofA, então comparar com ele deu um comportamento indefinido.
  • Se i> = 15, então é claro que sumofA irá retornar.
  • Você retornar dentro do loop; Certamente isso não é o que você quer.
  • Não
  • Seu código é realmente armazenar qualquer coisa na matriz A.

Por favor, compilar o código com todos aviso-bandeiras em (gcc: -Wall -Werror -pedantic)., E certifique-se há não avisos quando seus compila o código

Note que a variável tamanho é desnecessária:. Uso while (i

Editar: Agora que você adicionou o código de GetInt , substitua

GetInt (argc, argv, i);

com

atoi(argv[i]);

Não há nenhum uso para GetInt , para que você possa removê-lo completamente.

Finalmente: na sua pergunta você menciona armazenar os números em uma matriz e, em seguida, soma-los. Você deseja para fazer isso, ou necessidade para fazer isso (devido a alguma tarefa?) Porque não é necessário: basta adicionar o resultado de todas as chamadas para atoi . O array A é, então, supérflua.

Editar 2: Vejo que fixa o código em alguns lugares. Seu código atualmente (23:31 CEST) adiciona o primeiro argumento para cada um dos argumentos separadamente e os imprime. Você não é completamente lá ainda. Boa sorte!

Outras dicas

Seu problema é aqui:

 int x = GetInt (argc, argv, 1);
 int y = GetInt (argc, argv, i);

Como você ir através do laço pela primeira vez, o que é i, eo que ele imprimir? E sobre a segunda vez que você passar pelo loop?

Para começar, você está retornando 0 depois da primeira iteração do seu loop.

Desde que você quer formatar ajuda ...

Primeiro, C tem mais operadores de atribuição do que apenas =, e estes são grandes para coisas como x = x + 1. A maioria das linguagens, C incluídos, fornecer um operador +=, que se parece com isso: x += 1. Que faz a mesma coisa como x = x + 1, e é mais agradável. açúcar Syntaxtic, mas o açúcar é saborosa.

Enquanto estamos no assunto, C e muitas outras linguagens fornecem um caso especial para += 1 - o operador ++ a partir do qual C ++ recebe o seu nome. Então, realmente, x = x + 1 pode ser reescrita como x++ com o exatamente o mesmo efeito . Note, no entanto, que há uma grande diferença entre x++ e ++x, mas isso não importa atualmente. Por enquanto, use a que você quer, e certifique-se de colocá-lo em sua própria linha por si só até que você aprenda a diferença entre x++ e ++x.

Se você achar que você tem uma variável que você está usando uma vez, não usá-lo. Em vez disso:

int sizeofA = argc - 1;
...
while (i <= sizeofA){
  ...
  printf ("%d\n", sumofA (sizeofA, x, y));
}

Tente isto:

...
while (i <= argc - 1){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

Or (provavelmente melhor):

...
while (i < argc){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

Em terceiro lugar fora, você não deve ser cegamente passá-la a sua lista de argumentos inteiros, apenas o argumento de que deseja converter no momento atual, mas isso é outra questão, e eu suponho que você não pode mudar GetInt(). Esta parece ser uma batalha para outro dia.

(Quarta off, por que isso é uma questão Wiki da Comunidade?)

Em quinto lugar, acho que sua lógica é off - se você começar a 1, eu não acho que você quer parar de 1 antes do fim da lista. Mas esta é uma simples off-por-um erro e você pode corrigir isso mais tarde, quando você tem certeza de que isso é, de fato, o erro.

Por último, sugiro que você definir uma variável, int answer, e, em vez de printf()ing todas os elementos da lista, basta percorrer a lista, adicione o valor numérico de cada um para answer, um então, no final, imprimir answer. Mas talvez eu esteja faltando o ponto da atribuição. Alternativamente, cada vez que você percorrer a loop, imprimir answer, para que possa ver o valor crescer corretamente cada vez. Acho que este é mais perto do que você realmente quer fazer na atribuição, mas não posso ter tempo para verificar, porque eu tenho uma classe para ir.

A primeira vez através seu loop x e y são ambos atribuído o mesmo valor (desde i = 1), a sua soma é impresso para fora, e, em seguida, o retorno da função que termina o seu programa. Então você só vai estar recebendo o primeiro valor adicionado a si mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top