Как не печатать — (символ минус) после последнего вывода?

#c

#c

Вопрос:

Я пытаюсь решить проблему, цель состоит в том, чтобы напечатать, что последний шаг может быть достигнут, входные данные — N в виде тестовых наборов, а A — в виде целых чисел тестовых наборов. Например: N = 10 A = 1 2 1 1 2 3 4 1 2 3 <- 10 целые числа

Итак, это то, что я сделал.

 #include <stdio.h>
    
int main()
{
    int N,i,j;
    scanf("%d",amp;N);
     
    int A[N 1];
    
    for(int i=0;i<N;i  )
    {
        scanf("%d",amp;A[i]);
    }
    A[N] = 1;
    
    for(int i=0;i<N;i  )
    {
        if(A[i] > A[i 1])
        {
            printf("%d-",A[i]);
        }
        else if(A[i] == A[i 1])
        {
            printf("%d-",A[i]);
        }
    }
    printf("n");

    return 0;
}
  

Ожидаемый результат :
2-1-4-3

но результат, который я получаю: 2-1-4-3-

Как мне исключить символ минуса после последнего вывода? Заранее спасибо.

Ответ №1:

Лично я предпочитаю печатать символ разделителя раньше. Простая причина в том, что обычно это происходит в циклах, которые начинаются с нуля, поэтому я могу выполнить нулевой тест следующим образом:

 for(int i = 0; i < N; i  )
{
    if (i > 0)
        putc('-', stdout);
    printf("%d", A[i]);
}
  

НО в вашем случае ваш цикл не всегда будет печатать значение. Так что вам действительно нужно быть умнее. Есть много способов добиться этого, но для простоты, почему бы просто не использовать флаг:

 int has_output = 0;
for(int i = 0; i < N; i  )
{
    if(A[i] >= A[i 1])
    {
        if (has_output)
            putc('-', stdout);
        else
            has_output = 1;
 
        printf("%d", A[i]);
    }
}
  

Обратите внимание, что предпочтение по-прежнему отдается своевременной печати разделителя. Другими словами, только тогда, когда вы определяете, что вам нужно что-то напечатать.

Становится немного более сумасшедшим:

 const char* fmt[2] = { "%d", "-%d" };
int has_output = 0;
for(int i = 0; i < N; i  )
{
    if(A[i] >= A[i 1])
    {
        printf(fmt[has_output], A[i]);
        has_output = 1;
    }
}
  

Ответ №2:

 #include<stdio.h>
int main()
{
    int N,i,j;
    scanf("%d",amp;N); 
    int A[N 1];
    for(int i=0;i<N;i  )
    {
        scanf("%d",amp;A[i]);
    }
    A[N] = 1;
    int flag = 0; //added a new variable here
    for(int i=0;i<N;i  )
    {
        if(A[i] >= A[i 1])
        {   
            if(flag == 0){ //check if its printing for the first time 
                printf("%d",A[i]); // then print without dash
                flag = 1;          //change the flag so that this block never executes again
            }else{
                printf("-%d",A[i] ); //else print a dash and then the number
            }
        }
    }
    printf("n");
    return 0;
}
  

Ответ №3:

Поскольку "-" разделитель используется только после первого напечатанного значения, рассмотрите возможность изменения разделителя.

 const char *separator = "";
for(int i=0;i<N;i  ) {
    if(A[i] >= A[i 1]) {
      printf("%s%d", separator, A[i]);
      separator = "-";
    }
}
printf("n");