您的位置:首页 > 其它

Hyper-V――snapshot虚拟机快照

2011-09-03 16:40 267 查看
输入确认:
假设有一个处理非负数的循环,用户可能犯一类错误是输入一个负数,我们可以用关系表达式来检测这类错误。
int n;
scanf (“%d”,&n);
while (n >= 0)
{
对n的处理过程
scanf (“%d”,&n);
}
另外一个潜在的易犯错误是用户可能输入错误类型值,检测这类错误的一种方式就是检查scanf ()的返回值。对上面代码的改进:
int n;
while (scanf (“%d”,&n) == 1 && n >= 0)
{
对n的处理;
}
从字面上来看,while循环的条件就是“当输入一个整数且整数为正”。
虽然这样可以处理不合法的输入但是不够友好,要输入错了,还要给用户一个尝试输入正确类型的值的机会,如果要这样作的话,首先要剔除那些有问题的输入,如果scanf ()没有成功读取输入,就会将其留在输入的队列中。这时。输入实际上是字符流这一事实就有用了,你可以使用getchar ()来一个一个字符的读取输入,这些方法可以用一个函数来表示:
int get-_int (void)
{
int input;
char ch;
while (scanf (“%d”,&input) != 1)
{
while((ch = getchar()) != ‘\n’)
putchar (ch);
printf (“is not an integer .\nPlease enter an”);
printf (“integer value ,such as 25,-178,or 3:”);
}
return input;
}
这个函数试图将一个int值读入变量input。如果没有成功。则该函数进入外层while循环的语句。然后内层while循环逐个字符地读取那些有问题的输入字符,注意该函数选择丢弃该行中余下的所有输入。你也可以选择只丢弃下一个字符。然后该函数提示用户重新尝试。外层循环继续运行直到用户成功地输入一整数从而使scanf()返回值1.
克服了用户输入整数的障碍后,程序可以检查这些值是否有效。
//8-7.c
#include <stdio.h>
int get_int (void);
bad_limits (int begin,int end,int low,int high);
double sum_squares(int a,int b);
int main (void)
{
const int MIN = -1000;//范围的下界限制
const int MAX = +1000;//范围的上界限制
int start ;
int stop;
double answer;
printf ("This program computes the sum of the squares or"
"integers in a range .\n The lower bound should not "
"be less than - 1000 and \n the upper bound should not"
"be more than + 1000 .\n Enter the limite (enter 0 for "
"both limite to quit ):\n lower limit:");
start = get_int ();
printf("upper limit:");
stop = get_int ();
while (start != 0 || stop != 0)
{
if (bad_limits (start ,stop ,MIN,MAX))
printf ("Please try again .\n");
else
{
answer = sum_squares (start,stop);
printf ("Then sum of the squares of the integers from");
printf ("from %d to %d is %g\n",start, stop ,answer);
}
printf ("Enter the limits (enter 0 for both limits to quit ):\n");
printf ("lower limit:");
start = get_int ();
printf ("upper limit:");
stop = get_int ();
}
printf ("Done.\n");
return 0;
}
int get_int (void)
{
int input;
char ch;
while (scanf ("%d",&input) != 1)
{
while ((ch = getchar ()) != '\n')
putchar (ch);
printf ("is not an integer.\nPlease enter an ");
printf ("integer value ,such as 25,-178,or 3:");
}
return input;
}
double sum_squares (int a,int b)
{
double total = 0;
int i;
for (i = a; i <= b;i++)
total += i*i;
return total;
} bad_limits (int begin,int end,int low ,int high)
{int not_good = 0;
if (begin > end)
{
printf ("%d isn't smaller than %d.\n",begin,end);
not_good = 1 ;
}
if (begin <low || end > high)
{
printf ("Values must be %d or greater.\n",low);
not_good = 1;
}
if (begin > high || end > high)
{
printf ("Values must be %d or lese.\n",high);
not_good = 1;
}
return not_good;
}
程序分析:
我们已经遵循了一种模块化方法,使用独立的函数(模块)来确认输入和管理显示,
main()函数管理流程,为其化函数指派任务。它使用get_int()来获取值,用while来处理这些值,用badlimits()函数来检查值的有效性,sum_sqarer()函数则进行实际的计算。
输入流和数值:
C输入的工作方式.它对输入是用字节流的处理方法来处理输入如:is 28 12.4 C对这一串字符的处理是。第一个字节是字母i的字符编码,第二个字节是字母s的字符编码,第三个字节是空格字符的编码,第四个字节是数字2的字符编码,等等。所以如果get_int()遇到这一行,则下面的代码将读取并丢弃整行,包括数字,因为这些数字只是该行中一字符而已:
while ((ch = getchar())!= ‘\n’)
putchar (ch);
虽然输入流由字符组成,但如果你指示了scanf ()函数,它就可以将这些字符转换成数值,如:输入42
如果你在scanf()中使用%c说明符,该函数将只读取字符4并将其存在一个char类型的变量中。如果使用%s说明符,该函数会读取两个字符,即字符4和字符2,并将其存储在一个字符串中,如果用%d说明符,则scanf()读取同样两个字符,但是随后会断续计算与它们相应的整数值为4*10+2,即42,然后将该数的二进制表示保存在一个int变量中。如果使用%f说明符,则scanf()函数读取这两个字符,计算他们对应的数值42,然后以内部浮点表示该值,并将结果保存在一个float变量中。
简而言之,输入由字符组成,但scanf ()可以将输入转换成整数或浮点值,使用像%d或%f这样的说明符能限制可接受的输入的字符类型,但getchar()和使用%c的scanf ()接受任务字符.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: