1.共用体union
以下程序的输出结果为( )。
void main()
{
union {
int n[2];
int x;
} S;
S.x = 10;
S.n[0] = 20;
S.n[1] = 30;
printf("%d\n", S.x );
}
A. 0
B. 10
C. 20 [正确答案]
D. 30
答案解析:
本题考察共用体中成员如何共用存储空间。
注意:
(1)VS中共用体成员共用内存符合小端存储模式,也就是从低地址开始共用内存
(2)分析图中,可以知道共用体的 n[0] 和 x 共用成员。
代码执行流程:
(1)代码从主函数开始运行,使用关键字union声明类型的同时定义共用体变量S。
(2)共用体变量S里面的成员如何共用内存?首先,共用体变量S内存大小算出来是8字节,成员n的数组每个元素有各自的内存空间,n[0]占用较低地址的存储单元,n[1]占用较高地址的存储单元(下标越大,地址编号值越大),其他成员从低地址占用内存空间,x是整型成员,x从地址开始占用4字节大小的内存空间。所以成员x和n[0]共用内存空间。
(3)10 赋值给变量S的x成员,20赋值给变量S的n[0],所以最后输出S.x中的值是20。
所以正确答案选择C选项。
2.传参列表用到结构体
利用函数输出,但存储的信息多,构造结构体类型,使其传结构体变量
用结构体存储矩形相关信息,使用函数求矩形的周长和面积。
验证案例:
输入 :
1.3 5.6
输出:
周长13.80
面积7.28
struct rectanlge {
float legth;
float width;
};
void PrintCS(struct rectanlge r1) { //参数列表中有多个(4个)参数会影响执行效率,这里用结构体变量提高效率
printf("周长是%.2f", 2 * (r1.legth + r1.width));
printf("面积为%.2f", r1.width * r1.legth);
}
int main() {
struct rectanlge r;
scanf("%f %f", &r.legth, &r.width);
PrintCS(r);
}
3.利用结构体的嵌套提高效率
1).键盘输入一个点和一个圆,判断点和圆的位置关系。(点由x,y坐标确定;圆由圆心和半径确定)
验证案例1:
输入 :
(点的坐标)1.2 4.5
(圆心和半径)3.4 6.7 3
输出:
点在圆外
验证案例2:
输入 :
(点的坐标)2.3 3.4
(圆心和半径)3 3.6 6
输出:
点在圆内
思路:构造一个类型存储XY坐标,另外构造一个结构体来存储圆的数据,圆心是坐标,这里用到结构体的嵌套。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdio.h>
typedef struct oxy {
float y;
float x;//保存x,y 坐标值
}OXY;
typedef struct round {
OXY circle;
float radius;//保存圆心的坐标值与半径
}RO;
int main() {
RO r1;//定义“整个圆”变量
OXY r;//定义“整体坐标”变量r
printf("输入圆的坐标原点以及半径:");//提示信息
scanf("%f %f %f", &r1.circle.x, &r1.circle.y, &r1.radius);
printf("输入x,y坐标:");
scanf("%f %f", &r.x, &r.y);
float length = (r.x - r1.circle.x) * (r.x - r1.circle.x) + (r.y - r1.circle.y) * (r.y - r1.circle.y);//length表示距离的平方和
if (length <= r1.radius * r1.radius) {
printf("点在圆上");
}
else {
printf("点在圆外");
}
}
2)
编写程序,实现以下功能:
猜拳小游戏:石头剪刀布
游戏规则:石头克制剪刀,剪刀克制布,布克制石头。
编写玩游戏函数,实现玩家和电脑对战。
电脑随机出拳(运用随机函数srand()、rand()和time(NULL)产生随机数,需要包含头文件stdlib.h和time.h);
玩家输入“石头/剪刀/布”进行出拳(需要定义石头剪刀布的枚举类型来记录);
玩家和电脑可以循环多次猜拳,判断猜拳的结果,如果玩家赢了则输出“玩家赢了”,如果玩家输了则输出“玩家输了”,如果是平局则输出“平局”。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
enum game{stone,siss,paper};//石头、剪刀、布 0、1、2
int main()
{
enum game player;//玩家
enum game computer;//电脑
//播下随机的种子
srand((unsigned int)time(NULL));
//不断的玩游戏
while (1)
{
printf("***************游戏开始***************\n");
printf("\n0表示石头,1表示剪刀,2表示布\n");
//玩家猜拳
scanf("%d", &player);
//电脑随机出拳
computer = ( game)(rand() % 3);//随机数除三的余数结果就是0,1,2。\( ̄︶ ̄*\))
//结果判断
switch (player)
{
case stone:
printf("玩家出石头\n");
switch (computer)
{
case stone:
printf("电脑出石头\n");
printf("平局\n\n\n\n");
break;
case siss:
printf("电脑出剪刀\n");
printf("玩家赢了\n\n\n\n");
break;
case paper:
printf("电脑出布\n");
printf("玩家输了\n\n\n\n");
break;
}
break;
case siss:
printf("玩家出剪刀\n");
switch (computer)
{
case stone:
printf("电脑出石头\n");
printf("玩家输了\n\n\n\n");
break;
case siss:
printf("电脑出剪刀\n");
printf("平局\n\n\n\n");
break;
case paper:
printf("电脑出布\n");
printf("玩家赢了\n\n\n\n");
break;
}
break;
case paper:
printf("玩家出布\n");
switch (computer)
{
case stone:
printf("电脑出石头\n");
printf("玩家赢了\n\n\n\n");
break;
case siss:
printf("电脑出剪刀\n");
printf("玩家输了n\n\n\n");
break;
case paper:
printf("电脑出布\n");
printf("平局\n\n\n\n");
break;
}
break;
}
}
return 0;
}