Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从包含整数的单行计算包数_C_While Loop_Scanf - Fatal编程技术网

C 从包含整数的单行计算包数

C 从包含整数的单行计算包数,c,while-loop,scanf,C,While Loop,Scanf,我试图以字符串的形式读入一个数字列表,并计算应该有多少个包。每个包装最多有50个。例如,“25-1”的输出应该是2,但我得到1 你能看一下我的密码吗 int main(void) { int input = 0; int diff = 50; int output = 0; printf("Input: \n"); do { scanf("%d", &input); if (input < diff) { diff -= input

我试图以字符串的形式读入一个数字列表,并计算应该有多少个包。每个包装最多有50个。例如,
“25-1”
的输出应该是2,但我得到1

你能看一下我的密码吗

int main(void) {
  int input = 0;
  int diff = 50;
  int output = 0;

  printf("Input: \n");
  do {
    scanf("%d", &input);
    if (input < diff) {
      diff -= input;

    } else if (diff == input) {
      diff = 50;
      output++;
    } else {
      diff = 50 - input;
      output++;
    }

  } while (input != -1);

  printf("Output: %d", output);

  return 0;
}
int main(无效){
int输入=0;
int-diff=50;
int输出=0;
printf(“输入:\n”);
做{
scanf(“%d”,输入(&I));
如果(输入<差异){
diff-=输入;
}else if(diff==输入){
差异=50;
输出++;
}否则{
差异=50-输入;
输出++;
}
}while(输入!=-1);
printf(“输出:%d”,输出);
返回0;
}

正如我在注释中所提到的,您在循环开始时读入一次
输入
,并将其与循环结束时的
-1
进行比较,因此
-1
将得到与其他所有
输入
值相同的处理

显而易见的选择是在两个不同的位置读取,一个在循环之前,一个在循环结束时,这样您将直接在循环条件之前获得一个新的
输入值:

printf("Input: \n");
scanf("%d", &input);
while(input != -1) {
    // Processing
    scanf("%d", &input);
} 
请注意,我还将循环切换为
,而
循环,而不是
do。。。当
循环时,如果提供的输入仅包含
-1
,则
执行。。。而
仍会对其进行处理,导致输出错误


您也没有考虑到在循环结束时包可能不完整,这可以通过检查循环结束后是否有未计数的包来解决:

printf("Input: \n");
scanf("%d", &input);
while(input != -1) {
    // Processing
    scanf("%d", &input);
} 
if(diff != 50) {
    output++;
}
确保不要将“-1”用作已处理数据的一部分

还要看看你的算法

也许是这样的:

#include <stdio.h>

int main(void) {
  int input = 0;
  int load = 50;
  int output = 0;

  printf("Input: \n");
  while (1) {
    if (scanf("%d", &input) != 1 || input > 50)
    {
        // Illegal input
        exit(1);
    }
    if (input == - 1)
    {
        // Done
        break;
    }

    if (load + input > 50)
    {
        ++output;  // Take new package
        load = 0;  // make it empty
    }

    load += input; // Put into package
  };

  printf("Output: %d", output);

  return 0;
}
#包括
内部主(空){
int输入=0;
内载=50;
int输出=0;
printf(“输入:\n”);
而(1){
如果(scanf(“%d”,&input)!=1 | | input>50)
{
//非法输入
出口(1);
}
如果(输入==-1)
{
//完成
打破
}
如果(加载+输入>50)
{
++output;//获取新包
load=0;//将其设为空
}
load+=input;//放入包中
};
printf(“输出:%d”,输出);
返回0;
}

在循环开始时读取输入,并在循环结束时将其与-1进行比较,因此-1的处理与其他值相同input@jsonkiller您没有考虑包的边界。如果你的输入是“26-1”,那么你需要3个包,因为一个包只能容纳50个,所以在输入26后,没有地方容纳下一个包。你的(固定的)算法仍然会说2。答案中提到的应用更改了吗?输入什么?不要删除这样的代码,这样会使您的问题及其答案无效