梦龙_C语言作业3

一、单选题

若有定义: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;请分别给出下面表达式的计算结果。

  1. y=x+=5*3 (1)
  2. 1<=x<=20 (2)
  3. x=y,y=x (3)
  4. x<y||y<x (4)
  5. !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,因为这就只有一个语句
21<=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

猜你喜欢

转载自blog.csdn.net/l2754283833/article/details/114878202