C 变量和/或数组的问题
因此,我正在编写一个C代码,它将接受用户输入(以存款金额(如银行)和存款剩余时间的形式),并给出一个“利率”,或者更简单地说,只是一个十进制数字。我不知道为什么它不起作用。它应该将一个文件读入一个数组,然后根据该数组进行计算。当我说它不工作时,它会在表中读取,请求用户输入,但不管用户输入如何,它都会输出0。它唯一能做的另一件事是在用户输入“无”时退出。 代码如下:C 变量和/或数组的问题,c,arrays,variables,C,Arrays,Variables,因此,我正在编写一个C代码,它将接受用户输入(以存款金额(如银行)和存款剩余时间的形式),并给出一个“利率”,或者更简单地说,只是一个十进制数字。我不知道为什么它不起作用。它应该将一个文件读入一个数组,然后根据该数组进行计算。当我说它不工作时,它会在表中读取,请求用户输入,但不管用户输入如何,它都会输出0。它唯一能做的另一件事是在用户输入“无”时退出。 代码如下: #include <stdio.h> #include <stdlib.h> #include <st
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
FILE *unit2;
int main()
{
int month[14];
float num1[14];
float num2[14];
float num3[14];
float numin1, numin2, numin3;
char input[100];
int time;
float amount;
float output = 0;
int numin;
int i, j;
int nret;
unit2 = fopen("units2.txt", "r");
printf("Months\t\t\t Interest\n");
while(!(feof(unit2)))
{
i = 0;
nret = fscanf(unit2, "%d %f %f %f", &numin, &numin1, &numin2, &numin3);
if(nret == EOF)
break;
month[i] = numin;
num1[i] = numin1;
num2[i] = numin2;
num3[i] = numin3;
printf(" %d\t\t%1.2f %1.2f %1.2f %1.2f %1.2f %1.2f\n", numin, numin1, numin1, numin2, numin2, numin3, numin3);
i++;
}
printf("\nEnter your deposit amount, followed by the duration in months. Or, type 'none' to exit.\n");
gets(input);
sscanf(input, "%f %d", &amount, &time);
if(!strcmp(input, "none")){
printf("\nCome back later!\n");
exit(0);
}
if(time <= 0){
printf("Please enter a larger amount of months.\n");
}
if(time >= 120){
printf("Please enter a smaller amount of months\n");
}
if(amount <= 999){
printf("Please enter a larger deposit.\n");
}
j = 0;
while(time != month[j]){
j++;
}
if(amount >= 1000 && amount <= 9999){
output = num1[j];
}
else if(amount >= 10000 && amount <= 99999){
output = num2[j];
}
else if(amount >= 100000){
output = num3[j];
}
printf("Your interest rate will be %f.\n", output);
}
好的,我知道了。首先,i=0在循环中,导致它被重复(感谢rmartinjak)。另一部分是我有:
while(time < month[j]){
j++;
}
我从下面的行中删除了“=”:
if(amount >= 1000 && amount <= 9999){
如果(金额>=1000&&amount 1000&&amount<9999){
现在一切都好了。再次感谢大家的帮助!问题是,在每次循环读取文件时,您都将
i
设置为0
while(!(feof(unit2)))
{
i = 0; // <-- HERE
nret = fscanf(unit2, "%d %f %f %f", &numin, &numin1, &numin2, &numin3);
if(nret == EOF)
break;
month[i] = numin;
num1[i] = numin1;
num2[i] = numin2;
num3[i] = numin3;
printf(" %d\t\t%1.2f %1.2f %1.2f %1.2f %1.2f %1.2f\n", numin, numin1, numin1, numin2, numin2, numin3, numin3);
i++;
}
如果输入的月数不是
84
,则将j
增加到month
的范围之外。无论如何,如果有人输入的月数不在列表中,例如4
“不起作用”,则应检查month
的范围不是一个好的错误描述。好的,所以当我说它不工作时,它会在表中读取,请求用户输入,但它会输出0,用户输入不受控制。它唯一能做的其他部分是在用户输入“无”时退出。请阅读。注意scanf()
无法读取所有字段时,将返回一个小于4的数字。一个问题是,由于scanf()
字符串不能处理被空格包围的-
,因此您实际上没有读取数据。您应该检查是否(scanf(…)!=4)
以更好地覆盖错误情况。调试时,最基本的技术是打印您读取的数据,以确保您确实读取了您认为正在读取的数据。(循环中的i=0
也错误。)正在读取的文件没有连字号。它只是空格。我有这样的格式,因此格式保留在帖子中。啊,我在循环中没有看到。因此我修复了这个问题,但仍然存在问题。:\此外,程序应该考虑介于两者之间的数字。例如:我输入4,代码应该使用thr下的信息这是一个问题,不是唯一的问题。
if(amount >= 1000 && amount <= 9999){
if(amount > 1000 && amount < 9999){
while(!(feof(unit2)))
{
i = 0; // <-- HERE
nret = fscanf(unit2, "%d %f %f %f", &numin, &numin1, &numin2, &numin3);
if(nret == EOF)
break;
month[i] = numin;
num1[i] = numin1;
num2[i] = numin2;
num3[i] = numin3;
printf(" %d\t\t%1.2f %1.2f %1.2f %1.2f %1.2f %1.2f\n", numin, numin1, numin1, numin2, numin2, numin3, numin3);
i++;
}
while(time != month[j]){
j++;
}