0

我有一个包含一堆数字的输入文件,例如:

3 7 10 21 8 4 9 2

我已经编写了一些代码来记录最高和最低值:

#include<stdio.h>
   main(){
    int low;
    int high;
    int current;
    char c;
    scanf("%i", &low);
    scanf("%i", &high);
    while((c=getchar())!= '\n'){
     scanf("%i", &current);
     if(current < low){
       low = current;}
     else if(current > high){
       high = current;}
   }
  printf("High: %i   Low: %i \n",high,low);
  }

现在我希望能够删除最高和最低并打印出其他数字。我的问题是,尝试使用哨兵值解决这个问题是否明智?制作一个循环的打印语句,如果命中哨兵值,它什么也不打印?

4

2 回答 2

1

处理列表两次。首先寻找低/高。下次,如果不是低/高,则打印。

用作\n指示输入结束的信号是一个问题,一个安静地消耗\n的空白也是一个问题。scanf("%i"...最好用fgets()

检查结果是个好主意sscanf()

第一个两个数字可能不是低/高顺序。

用于"%n"跟踪进度buffer

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>

int main() {
  int low = INT_MAX;
  int high = INT_MIN;
  int current;
  char buffer[1000];

  fgets(buffer, sizeof buffer, stdin);
  char *p = buffer;
  int n;
  while (sscanf(p, "%i%n", &current, &n) == 1) {
    if (current < low) {
      low = current;
    }
    if (current > high) {
      high = current;
    }
    p += n;
  }
  p = buffer;
  while (sscanf(p, "%i%n", &current, &n) == 1) {
    if ((current != low) && (current != high)) {
      printf("Other: %i\n", current);
    }
    p += n;
  }
printf("High: %i   Low: %i\n", high, low);
return 0;
}
于 2014-03-17T20:17:25.803 回答
0

尝试这个,

#include<stdio.h>
   main(){
    int low;
    int high;
    int current;
    char c;
    scanf("%i", &low);
    scanf("%i", &high);

    int val;
     do {

      printf("Enter a number:");
     scanf("%d", &current);

     if(current < low){

       val=low;
       low=current;
       current=val;
       }
     else if(current > high){

       val=high;
       high=current;
       current=val;
       }

       printf("%i\n",current); //prints the value if it is in between

   }while((c=getch())!='\n');

  printf("High: %i   Low: %i \n",high,low);//can remove if it this is not required
}
于 2014-03-17T18:19:44.567 回答