绝对零基础的C语言科班作业④顺序结构(标准输入和输出)

一.标准输入和输出

任务描述

老师出了一道算术题,你能做出来吗?

输入格式:

一行带有?的算式,形如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所示。

(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;
}

执行程序输出:

程序分析:

以上程序示例比较全面地展示了基本数据类型的格式输出,请读者朋友们一定熟悉这些格式控制方法的含义和使用。

相关知识 标准格式化输入函数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默认用空格补齐(和上一题对比)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GR鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值