一.标准输入和输出
任务描述
老师出了一道算术题,你能做出来吗?
输入格式:
一行带有?的算式,形如a=@,b=@,axb=?。其中@代表整数,x可能是+、-、*、/ 之一。题目保证除法时除数不为0。
输出格式:
输出正确的算式,在?处输出正确的值,具体请参照输入输出样例。
输入样例:
a=5,b=8,a*b=?
输出样例:
5*8=40
相关知识
1.输入流、输出流通过scanf()、getchar()等函数输入数据时,如果是在Dev-C++中执行,需要用户从键盘上输入的一串字符;如果是在网络上的PTA平台或者其它在线编程评测平台(OJ)执行,程序从输入样例或测试数据中读取数据。无论是用户从键盘上读取数据,还是从测试数据中读取数据,被读取的数据都可以被看成是一个字符流(字节流),数据输入函数就是从输入流中依次读取数据的。通过printf()函数输出数据时,输入的内容同样可以看作是字符流或字节流,字符流输出的目的地,或者是显示器、打印机、文件,它们也可以称为输出流。可以说,程序从输入流读取数据,向输出流输出数据。
①(代码)算术题
#include<stdio.h>
int main()
{
int a, b, r;
char op;
scanf("a=%d,b=%d,a%cb=?", &a, &b, &op);
(op == '+') ? (r = a + b) : (1);
(op == '-') ? (r = a - b) : (1);
(op == '*') ? (r = a * b) : (1);
(op == '/') ? (r = a / b) : (1);
printf("%d%c%d=%d", a, op, b, r);
return 0;
}
代码分析
1.语句scanf("a=%d,b=%d,a%cb=?",&a,&b,&op);的功能是实现格式化输入数据,输入数据的格式是由格式控制字符串"a=%d,b=%d,a%cb=?"决定的,格式控制字符串中的普通字符要原样读入,具体的读取数据过程(从左到右)分解如下:
(1)首先原样读入普通字符 a= ;
(2)然后读取一个整数赋值给变量a ;
(3)然后再原样读取普通字符 ,b= ;
(4)然后读取一个整数赋值给变量b ;
(5)然后再原样读取普通字符 ,a ;
(6)然后读取一个字符赋值给变量op ;
(7)然后再原样读取普通字符 b=? 。2.正确读入数据以后,通过4个条件表达式语句实现计算算式的结果,赋值给r。3.语句printf("%d%c%d=%d",a,op,b,r);的功能是输出结果,"%d%c%d=%d"是输出格式字符串,其中的普通字符=要原样输出,%d表示输出整数,%c表示输出一个字符。
相关知识 标准格式化输出函数printf()
1.printf()函数
printf()函数向标准输出设备(显示器)中按规定格式输出信息。调用printf()函数的一般形式为:
printf(格式控制字符串,输出值参数列表);
(1)格式控制字符串:包括普通字符和格式说明符。
(2)格式控制字符串中的普通字符要按原样输出。
(3)格式说明符以%开头,后跟一个或几个规定字符,用来代表一个输出的数据,并规定了该数据的输出格式。例如在语句:printf("a=%d,b=%d",a,b);中,字符串"a=%d,b=%d"是格式控制字符串。a,b是输出值参数列表。在格式控制字符串"a=%d,b=%d"中,a=、,b=是普通字符,而%d就是格式说明符。
(4)输出值参数列表是一系列用逗号分开的表达式,表达式的个数和顺序与前面的格式说明符要一一对应。例如,有整型变量a和b,它们的值分别是3和8,则执行以下语句:
printf("a=%d,b=%d",a,b); 输出结果是:a=3,b=8。
2.格式说明符
不同类型的数据在输出时应该使用不同的格式说明符。常用的格式说明符及其含义如表4-1所示。
![](https://img-blog.csdnimg.cn/img_convert/5dfd1c7bcc1e6b2ebb3c9b9829999a96.png)
(1)"%"和字母之间可加一个整数表示输出场宽,即输出数据所占据的最大宽度(字符个数)。例如:%3d 表示输出数据占3个字符位,不够3位右对齐,左补空格。%8s 表示输出数据占8个字符位,不够8个字符右对齐,左补空格。(2)"%M.Nf"中,整数M表示输出最大场宽,整数N表示小数位数。例如:%9.2f 表示输出宽度为9个字符位的实数数,保留2位小数,不够9位右对齐,左补空格。(3)如果数据的实际值超过所给的场宽,将按其实际长度输出。(4)"%04d"表示在输出一个小于4位的整数时,将在前面补0使其总宽度为4位。(5)"%6.9s"表示输出字符串的最大宽度是9,最小宽度是6。即输出所占的宽度不小于6且不大于9。若字符个数小于6则左补空格补至6个字符,若字符个数大于9,则第9个字符以后的内容将不被显示。(6)负号可以控制输出的数据是左对齐。例如:%-7d 表示输出整数占7位场宽,不足左对齐,右补空格%-10s 表示输出字符串占10位场宽,不足左对齐,右补空格
示例代码分析 请分析以下代码的执行结果
#include<stdio.h>
int main()
{
int a = 1234, i; char c;
float f = 3.141592653589;
double x = 0.12345678987654321;
i = 12; c = '\x41';
printf("\n01.a=%d.", a);
printf("\n02.a=%6d.", a);
printf("\n03.a=%06d.", a);
printf("\n04.a=%2d.", a);
printf("\n05.a=%-6d.", a);
printf("\n06.f=%f.", f);
printf("\n07.f=%6.4f.", f);
printf("\n08.x=%lf.", x);
printf("\n09.x=%18.16lf.", x);
printf("\n10.c=%c.", c);
printf("\n11.c=%x.", c);
printf("\n12.%s.", "ABCDEFGHIJK");
printf("\n13.%4s.", "ABCDEFGHIJK");
printf("\n14.%14s.", "ABCDEFGHIJK");
printf("\n15.%-14s.", "ABCDEFGHIJK");
printf("\n16.%4.6s.", "ABCDEFGHIJK");
}
执行程序,输出:
01.a=1234.
02.a= 1234.
03.a=001234.
04.a=1234.
05.a=1234 .
06.f=3.141593.
07.f=3.1416.
08.x=0.123457.
09.x=0.1234567898765432.
10.c=A.
11.c=41.
12.ABCDEFGHIJK.
13.ABCDEFGHIJK.
14. ABCDEFGHIJK.
15.ABCDEFGHIJK .
16.ABCDEF.
示例代码分析 请分析以下代码的执行结果
int main()
{
int a = 1234;
printf("\n01.a=%d.a=%#d", a,a);
printf("\n02.a=%o.a=%#o", a,a);
printf("\n03.a=%x.a=%#x", a,a);
printf("\n05.a=%-8X.a=%#8X", a,a);
printf("\n06.a=%08X.a=%#08X", a,a);
return 0;
}
执行程序输出:
01.a=1234.a=1234
02.a=2322.a=02322
03.a=4d2.a=0x4d2
05.a=4D2 .a= 0X4D2
06.a=000004D2.a=0X0004D2
示例代码分析 请分析以下代码的执行结果
#include<stdio.h>
int main()
{
printf("+--------------------------------------------------+\n");
printf("|%16s|%12s|%20s|\n","姓名","学号","邮箱");
printf("|%16s+%12s+%20s|\n","----------------","------------","--------------------");
printf("|%16s|%12s|%20s|\n","李忠达","2015120666","1610649511@qq.com");
printf("|%16s+%12s+%20s|\n","----------------","------------","--------------------");
printf("|%16s|%12s|%20s|\n","伞洪涛","2017120088","1143708748@qq.com");
printf("|%16s+%12s+%20s|\n","----------------","------------","--------------------");
printf("|%16s|%12s|%20s|\n","王冠翔","2017145678","394276890@qq.com");
printf("|%16s+%12s+%20s|\n","----------------","------------","--------------------");
printf("|%16s|%12s|%20s|\n","王宇翔","2016146789","247399615@qq.com");
printf("+--------------------------------------------------+\n");
return 0;
}
执行程序输出:
![](https://img-blog.csdnimg.cn/img_convert/a48a6839e7f9721355d19bcaf3d7128e.png)
程序分析:
以上程序示例比较全面地展示了基本数据类型的格式输出,请读者朋友们一定熟悉这些格式控制方法的含义和使用。
相关知识 标准格式化输入函数scanf()
scanf()函数从标准输入设备(键盘)上读取用户输入的数据,并将输入的数据赋值给相应的变量。调用格式输入函数scanf()的一般形式为:scanf(格式控制字符串,变量地址列表)
(1)格式控制字符串是用来规定以何种形式从输入设备上接收数据。
格式控制字符串中包含以下三种字符:
①格式说明符:这里的格式说明符与printf()函数中的格式说明符基本相同,一个格式说明符代表一个输入的数据。
②空白字符:空白字符会使scanf()函数在读取数据时略去输入数据中的一个或多个空白字符。空白字符包括空格、回车和制表符(Tab键)。
③普通字符:普通字符在输入数据时要原样输入。
(2)变量地址列表是用逗号分隔的变量地址,与格式控制字符串中的格式说明符一一对应。取变量地址的运算符为&,变量a的地址用&a表示,在此处一定不要忘记变量前面应该加上取地址运算符&。
(3)从前向后依次读取用户所输入的数据,如果读到了非法的数据,函数会结束,程序会往下运行并不报错。但从遇到非法数据的变量开始,它或它以后的变量将得不到用户所输入的值,通常它们的值是随机的。
(4)格式说明中也可以规定场宽,用来表示接收数据的最大位数。例如%4d表示最多只读4位整数。
②(代码)算术题升级版
任务描述
老师拿出来一道运算符空缺的算式A?B=C,让你补充完整。
输入格式:
一行带有?的算式,形如a?b=c。a,b,c都是整数,并且b不是0。在整个输入中仅整数前可能有空格,整数后无空格。
输出格式:
输出正确的算式或者错误算式的信息。请严格按“+-*/”的顺序判断,只要符合某种运算,就输出?=X以及正确的算式,如果四种运算都不成立,输出?=?及算式原样,具体格式请认真参照输入输出样例。
请特别注意:为了便于阅读,输出结果中适当加入了空格,如果有负数要加括号。
输入样例:
-23? 5= -4
输出样例:
? = '/' , (-23) / 5 = (-4)
#include<stdio.h>
int main()
{
int a, b, c, r;
char op;
scanf("%d%c%d=%d", &a, &op, &b, &c); //读入算式
(c == a + b) ? (op = '+') : //根据算式确定运算符是什么
(c == a - b) ? (op = '-') :
(c == a * b) ? (op = '*') :
(c == a / b) ? (op = '/') : (op = '?');
printf("? = \'%c\' , ", op); //输出运算符
a >= 0 ? printf("%d", a) : printf("(%d)", a); //输出a
printf(" %c ", op); //输出运算符
b >= 0 ? printf("%d", b) : printf("(%d)", b); //输出b
printf(" = "); //输出=
c >= 0 ? printf("%d", c) : printf("(%d)", c); //输出c
return 0;
}
二. 顺序结构综合训练
①(代码)日期强迫症
任务描述
文档中填写日期时不同的人有不同的书写习惯,很多人习惯用小数点或其它字符作为分隔符,例如“2002.01.07”、“2002/1/7”、“02:01:7”都表示2002年1月7日。赵中瑞同学患有强烈的日期格式强迫症,当他看到一个日期时,一定会改写成形如“2002-01-07”的形式。下面请你写个程序,自动把读入的其它格式的日期改写成用“-”分隔的日期形式。
输入格式:
输入在一行中按照“yyyy.mm.dd”或“yy.mm.dd”的格式给出年、月、日。题目保证给出的日期是1900年元旦至今的合法的日期。其中年可能为4位或2位,当年为2位数字时,默认为20世纪。例如:“76/2/23”表示“1976年2月23日”。其中月份和日期可能为2位或1位数字。
输出格式:
在一行中按照“yyyy-mm-dd”的格式输出日期,其中年份为4位,月份和日期为2位,不够2位时用0补齐。
输入样例1:
2002.1.7
输出样例1:
2002-01-07
输入样例2:
97/07/1
输出样例2:
1997-07-01
#include<stdio.h>
int main()
{
int year, month, day; //定义年月日
char g, r;
scanf("%d%c%d%c%d", &year, &g, &month, &r, &day);
if (year < 100)
{
printf("19%d-", year);
}
else
{
printf("%d-", year);
}
printf("%02d-%02d", month, day); //输出两位,不够时用零补充
return 0;
}
②(代码)打印成绩单
任务描述
小白弟弟的成绩单曾经是他的骄傲,这次他考的也很好,他想打印一份格式工整的成绩单给妈妈,你编程实现一下吧。
输入格式:
一行中有四个成绩数据(实型数),分别代表C语言(C language)、高等数学(Higher Mathematics)、 线性代数(Linear Algebra)和大学英语(College English)的成绩,数据之间以一个空格分隔。
输出格式:
严格按样例格式输出成绩表。其中表格线由字符+、-和|构成,第2列成绩总宽度为10个字符,每个成绩与后面的竖线之间有2个空格,所有成绩的小数点对齐。
输入样例:
100 99.5 98 90.25
输出样例:
+------------------+----------+
|COURSE |GRADE |
+------------------+----------+
|C Language | 100.00 |
+------------------+----------+
|Higher Mathematics| 99.50 |
+------------------+----------+
|Linear Algebra | 98.00 |
+------------------+----------+
|College English | 90.25 |
+------------------+----------+
#include<stdio.h>
int main()
{
double a,b,c,d;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
printf("+------------------+----------+\n");
printf("|COURSE |GRADE |\n");
printf("+------------------+----------+\n");
printf("|C Language |%8.2f |\n",a);
printf("+------------------+----------+\n");
printf("|Higher Mathematics|%8.2f |\n",b);
printf("+------------------+----------+\n");
printf("|Linear Algebra |%8.2f |\n",c);
printf("+------------------+----------+\n");
printf("|College English |%8.2f |\n",d);
printf("+------------------+----------+");
return 0;
}
%.2f表示输出小数点后两位,8表示输出8个长度的数字,前面没有0默认用空格补齐(和上一题对比)