如何解决将值与数组C中的值进行比较
我需要将输入电阻值与12个值的数组进行比较。如果输入电阻器值是阵列的一部分,则程序将继续运行而不打印任何内容。如果输入值与数组值不匹配,则必须打印“电阻器A不是标准值。输入电阻器值将在1到100之间浮动。当非标准值时,我无法让我的程序打印俗语输入以下代码,下面的代码是正确的,因此朝着正确方向的任何帮助将不胜感激,因为这是该程序唯一固定的部分。
void resistor (void) // Function to input resistor and capacitor values
{
int i; // variable used to initilize array
// Array of standard values for resistors
int stdv[12] = {10,12,15,18,22,27,33,39,47,56,68,82};
float ra,rb,c; // Float variables for two resistor values and capacitor
while(1) // While loop to gather resistor A value
{
printf("Enter a value for Resistor Ra (kOhms): "); // First Resistor Value
scanf("%f",&ra);
if(ra < 1 || ra > 100) // Will repeat loop until value between 1 and 100 is entered
printf("Invalid selection,choose again.\n");
else
if (ra < 10)
ra *= 10;
else
ra = ra;
for(i = 0; i<12; i++)
{
if (abs(ra - stdv[i]) < 0.1)
break;
else
{
printf("Resistor A is not a standard value");
break;
}
}
break; // breaks loop when valid data is entered
}
}
解决方法
此代码存在很多问题,使您难以理解。首先,缩进不一致并且具有误导性,这导致了一个大问题。此代码部分看起来像您希望执行一个大的“ else”块:
else
if (ra < 10)
ra *= 10;
else
ra = ra;
for(i = 0; i<12; i++)
{
if (abs(ra - stdv[i]) < 0.1)
break;
else
{
printf("Resistor A is not a standard value");
break;
}
}
...但是没有括号{}将这些内容括起来以使它们成为其他内容的一部分,因此您得到了这一点(格式更改为突出显示实际情况):
else if (ra < 10)
ra *= 10;
else
ra = ra;
for(i = 0; i<12; i++)
{
// rest of loop code here
}
换句话说,for循环每次都会发生,而不仅仅是ra处于您期望的1到100之间。
第二,您对使用if语句使用花括号不满意,这通常会导致上述问题。我建议即使对于单语句块也要始终使用大括号,以养成明确指出哪些代码行是条件的一部分的习惯。如果您稍后返回并在条件块中添加更多行,这也可以防止上述问题。
第三,对于数组大小,您有一个“幻数”,这不是一个好习惯。您可以将其替换为已定义的常量,这是C语言中的标准做法:
#define STDV_COUNT 12
....
int stdv[STDV_COUNT] = { 10,12,15,18,22,27,33,39,47,56,68,82 };
第四个问题是for循环测试ra值的逻辑没有达到您的预期。在if和else块中都有一个break语句,这意味着循环将始终在第一个条目上中断(即,它将永远不会循环)。即使没有这个问题,声明电阻值是非标准的else语句也不能在循环内,因为直到遍历整个数组,您才能断定它是非标准的,这意味着贯穿整个循环。当找到匹配项时,可以通过if部分的中断来尽早中断循环。但是您需要将确定是否找到匹配项的判断移到循环之后。所以它需要更像是:
for (i = 0; i < STDV_COUNT; i++)
{
if (abs(ra - stdv[i]) < 0.1)
{
break;
}
}
// loop exited early because match was found
if(i < STDV_COUNT)
{
break; // breaks loop when valid data is entered
}
// loop ran all the way to end without a match
else
{
printf ("Resistor A is not a standard value\n");
}
因此,在对逻辑,格式和样式进行了以上所有更改之后,更正后的代码将如下所示:
#include <stdio.h>
#include <stdlib.h>
#define STDV_COUNT 12
void resistor (void) // Function to input resistor and capacitor values
{
int i; // variable used to initilize array
// Array of standard values for resistors
int stdv[STDV_COUNT] = { 10,82 };
float ra,rb,c; // Float variables for two resistor values and capacitor
while (1) // While loop to gather resistor A value
{
printf ("Enter a value for Resistor Ra (kOhms): "); // First Resistor Value
scanf ("%f",&ra);
if (ra < 1 || ra > 100) // Will repeat loop until value between 1 and 100 is entered
{
printf ("Invalid selection,choose again.\n");
}
else
{
if (ra < 10)
{
ra *= 10;
}
for (i = 0; i < STDV_COUNT; i++)
{
if (abs(ra - stdv[i]) < 0.1)
{
break;
}
}
// loop exited early because match was found
if(i < STDV_COUNT)
{
break; // breaks loop when valid data is entered
}
// loop ran all the way to end without a match
else
{
printf ("Resistor A is not a standard value\n");
}
}
}
printf("Standard resistor value entered: %f\n",ra);
}
您将要研究的另一个问题是如何确保输入值有效。例如,如果用户在输入中键入“ abc”会怎样? (提示:您应该检查scanf()的返回值以了解您是否获得了有效的输入。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。