Estoy tratando de generar números del 1 al 5 usando for loop y mostrar su suma. Mi objetivo es tener una salida que se vea así:
1 + 2 + 3 + 4 + 5 = 15
Pero en cambio, obtengo la salida:
+ 1 + 2 + 3 + 4 + 5 = 15
#include <stdio.h> void main() { int a, sum = 0; for (a = 1; a <= 5; a++) { printf("+\t%d\t",a); sum = sum + a; } printf("=\t%d", sum); }Esto se encuentra con mucha frecuencia cuando se generan listas separadas por algún valor. El problema es que tiene 5 valores para generar, pero solo 4 separadores. Si no hace nada especial, generará 5 separadores, que es exactamente lo que está sucediendo en su ejemplo. Incluso si mueve el separador después de su valor, todavía tendrá uno de más.
La forma en que prefiero hacerlo es esta:
for (a = 1; a <= 5; ++a) { if (a > 1) printf("\t+\t"); printf("%d", a); sum += a; }La razón por la que prefiero este enfoque, en lugar de generar algún valor fuera del bucle, es que, a menudo, lo que se genera es más complicado, lo que posiblemente involucre cálculos adicionales o llamadas a funciones, y no me gusta duplicar ese código.
Entonces, solo saco un separador si sé que estoy a punto de sacar la otra cosa. Eso significa, generar un separador para cada iteración de ciclo excepto la primera.
También me gusta hacerlo en estilo prefijo porque, por lo general, la condición para el primer elemento de un ciclo es más simple que la condición para el último elemento. También es compatible con un enfoque diferente que involucra una bandera:
int first = 1; for (a = 1; a <= 5; ++a) { if (!first) printf("\t+\t"); first = 0; printf("%d", a); sum += a; }Hay muchas otras formas en las que verá que se produce este tipo de patrón. Y puede haber varias formas de optimizarlo que reducen la legibilidad. Pero este enfoque es simple y fácil de seguir.
Puede tomar un puntero de tipo char y asignarle una cadena vacía como separador para la primera iteración y, después de imprimir el primer número, asigne la cadena separadora, al puntero, que desea imprimir entre dos números en iteraciones posteriores.
Implementación:
#include <stdio.h> int main (void) { int a, sum = 0; char * str = ""; for (a = 1; a <= 5; a++) { printf("%s%d\t", str, a); sum = sum + a; str = "+\t"; } printf("=\t%d\n", sum); return 0; }Producción:
# ./a.out 1 + 2 + 3 + 4 + 5 = 15Adicional:
void como tipo de retorno de la función main() no cumple con los estándares. El tipo de retorno de la función main() debe ser int .