一、单选题
若有定义:int x,y; char a,b,c; 并有以下输入数据(此处↙代表回车键,□代表空格):
1□2↙
A□B□C↙
则能给x赋1,给y赋2,给a赋’A’,给b赋’B’,给c赋’C’的正确程序段是 . . ( D )
.
A、scanf(“x=%dy=%d”,&x,&y);a=getchar();b=getchar();c=getchar();
B、scanf("%d%d",&x,&y);a=getchar();b=getchar();c=getchar();
C、scanf("%d%d%c%c%c",&x,&y,&a,&b,&c);
D、scanf("%d%d%c%c%c%c%c%c",&x,&y,&a,&a,&b,&b,&c,&c);
不想看解析可以直接选D。
测试代码
/*
时间:2021-3-16
作者:童话
环境:Win 10 、 Visual Studio 2019
*/
#define _CRT_SECURE_NO_WARNINGS //高版本VS解决scanf等函数编译报错的宏定义,需写在stdio.h之前,低版本可忽略
#include <stdio.h>
int main(void)
{
//定义变量
int x, y;
char a, b, c;
//测试输入(将需测试选项前的注释删除,不需要要的加上注释即可)
scanf("x=%dy=%d",&x,&y);a=getchar();b=getchar();c=getchar();
// scanf("%d%d",&x,&y);a=getchar();b=getchar();c=getchar();
//
// scanf("%d%d%c%c%c",&x,&y,&a,&b,&c);
//
// scanf("%d%d%c%c%c%c%c%c",&x,&y,&a,&a,&b,&b,&c,&c);
//显示输入结果
printf("\n\n*******\nFinish!\n");
printf("x=%d\ty=%d\n", x, y);
//这里用十进制数的形式查看char变量的输入结果,便于查看
printf("a=%d\tb=%d\tc=%d\n", a, b, c);
return 0;
}
选项A
输入结果:
错误原因在于,在程序里的输入函数scanf的字符串为:
"x=%dy=%d"
这就要求我们在输入的时候,输入的数据也要与之匹配。
更改输入方式后会发现结果任然异常。
可以看到A的值是10,10对应的ASCII码字符是“回车”。
可以这么理解,输入“x=1y=2”之后的摁下的回车,当作了字符被语句
a=getchar();
赋值给了char变量a,后面的字母A和第一个空格依次被后面的语句处理,即得到上图的输出结果。
选项B
输入结果:
与选项A相比只是scanf函数的变化,需要输入的数据变化而已,其他的问题同上。
选项C
这个的问题差不多,%d是匹配十进制数,%c是匹配字符的(包括字母、回车、空格等不可见的字符)
当你在控制台输入如上数据时,数字和数字之间的空格不会赋值给char型的变量。
当%d匹配完了之后,剩下的输入操作产生的字符将依次赋值给后面匹配的变量。
所以a的值仍然是输入的回车。
选项D
前面的都错了,故选D。
scanf("%d%d%c%c%c%c%c%c",&x,&y,&a,&a,&b,&b,&c,&c);
可以看到这里的格式匹配符很多哈,前面两个%d对应x、y,这个好理解
后面的char变量均赋值两次的原因是,输入完“1 2”之后有一个“回车”,
这个回车是规定的,回车之后的“A”才是我们需要的数据。
所以可以先把这个回车的值赋给一个变量,再把后面需要的值赋给a。
剩下的同理。
参考链接:C语言 scanf函数
二、填空题
3.2 假设有数据定义:int x=5,y=18;请分别给出下面表达式的计算结果。
- y=x+=5*3 (1)
- 1<=x<=20 (2)
- x=y,y=x (3)
- x<y||y<x (4)
- !x==!y (5)
测试代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x = 5, y = 18;
int result = 0;
result = (y = x += 5 * 3);
printf("------- 1):\nx = %d\ny = %d\n表达式:%d\n", x, y, result);
x = 5, y = 18;
result = (1 <= x <= 20);
printf("\n------- 2):\nx = %d\ny = %d\n表达式:%d\n", x, y, result);
x = 5, y = 18;
result = (x = y, y = x);
printf("\n------- 3):\nx = %d\ny = %d\n表达式:%d\n", x, y, result);
x = 5, y = 18;
result = (x < y || y < x);
printf("\n------- 4):\nx = %d\ny = %d\n表达式:%d\n", x, y, result);
x = 5, y = 18;
result = (!x == !y);
printf("\n------- 5):\nx = %d\ny = %d\n表达式:%d\n", x, y, result);
return 0;
}
输出结果
分析
1)
y=x+=5*3
3 2 1
数字表示运算顺序
y=x+=15
y=(x=x+15)
y=(x=5+15)
y=(x=20)
y=20
表达式的结果也是20,因为这就只有一个语句
2)
1<=x<=20
x的值是5
所以它大于1并小于20,即所谓的“真”,一般用1表示真
没有赋值语句,x,y的值不改变
表达式的值为1
3)
x=y,y=x
1 2
逗号表达式
x=18,y=x
x=18,y=18
表达式的值为最后一个语句的值,即y=18的值(18)
4)
x<y||y<x
1 3 2
比较运算和逻辑或
5<18||18<5
1 || 0
1
表达式的值为1
5)
!x==!y
1 3 2
逻辑非 和 判等运算
!5 == !18
0 == 0
1
表达式的值为1
参考链接:ASCII码
三、简答题
第1题
请编程求s=1-1/2+1/4-1/6+···+(-1)^n/2n的值,其中正整数变量n通过键盘输入值。(结果是双精度实数,不要有任何提示文字,结果不要回车。)
参考代码
/*
时间:2021-3-16
作者:童话
环境:Win 10 、 Visual Studio 2019
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h> //包含pow()函数的头文件
int main(void)
{
double s = 1; //初始化为1,为了是n=0时有输出(虽然没意义而且题目说了时正整数但我偏要)
int i; //循环变量
int n; //用户输入变量
scanf("%d", &n);
if(n>=1) //判断是不是大于1,即正数
for (i = 1; i <= n; i++)
s += pow(-1, i) / (2 * (double)i);//强制转换的原因见下图
printf("%f", s);
return 0;
}
参考链接:C语言 pow函数
第2题
3-2 下面有一个程序用于统计键盘输入的字符串中的空格的个数,请将它改编一下,变成统计字符串中的字母的个数的程序。
#include <stdio.h>
void main()
{
char ch;
int n=0;
for(;(ch=getchar())!='\n';)
if(ch==' ') n++;
printf("%d",n);
}
参考代码
#include <stdio.h>
void main()
{
char ch;
int n = 0;
for (; (ch = getchar()) != '\n';)
if (('a' <= ch && ch <= 'z' ) || ( 'A' <= ch && ch <= 'Z')) n++;
printf("%d", n);
}
四、程序题
第1题
请编程打印1~10的平方值和立方值,打印结果格式如下:(结果中的中文标题与下方的数字必须左边对齐,每行最后都会换行)
原数 平方 立方
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
参考代码
/*
时间:2021-3-16
作者:童话
环境:Win 10 、 Visual Studio 2019
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
int i;
printf("原数\t平方\t立方\n");
for (i = 1; i <= 10; i++)
printf("%d\t%d\t%d\n", i, i*i, i*i*i);
return 0;
}
提示:用“\t”对齐
第2题
已知三角形的三边长度分别是a,b,c,请编程计算该三角形的面积。(a,b,c必须保证两两之和大于另一个,采用双精度实数运算,不要有任何提示文字,结果不要回车。说明:使用海伦公式求面积)
参考链接:海伦公式
参考代码
/*
时间:2021-3-16
作者:童话
环境:Win 10 、 Visual Studio 2019
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
double a, b, c; //三角形三边
double s; //三角形的面积
double p; //三角形的周长
scanf("%lf%lf%lf", &a, &b, &c);
//判断三边能否构成三角形,如果不能结束程序
if (a + b <= c || a + c <= b || b + c <= a)
return 1;//返回非0的值表程序异常结束
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
printf("%f", s);
return 0;
}
参考链接:C语言 求根函数sqrt