Por favor, posso obter uma dica sobre onde concentrar sobre a formatação? [fechadas]
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)
)?
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.