c语言结构体练习,C-6 结构体练习题

//

//  main.m

//  CH6_结构体

//

//  Created by JR_Rafael on 15/11/25.

//  Copyright ©

2015年 lanou3g. All rights reserved.

//

#import

#import "HomeworkFunction.h"

int main(int argc, const

char * argv[]) {

#pragma mark - 作业1

#if 0

{

//    1.

(**)定义一个结构体变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),要求写一个函数

days,实现上面的计算。由主函数将年月日传递给 days

函数,计算后将日子传递回主函数输出。

myDay date = {0};

printf("请输入年月日(yy-mm-dd) :

");

scanf("%d-%d-%d",

&date.year, &date.month,

&date.day);

int dayNumber = days(date);

if (dayNumber != 0)

{

printf("%d年%d月%d日是%d年的第%d天\n",

date.year, date.month, date.day, date.year, dayNumber);

} else {

printf("输入错误");

}

}

#endif

#pragma mark - 作业2

#if 0

{

//

2. (***)某班有 5 个学生,三门课。分别编写 3

个函数实现以下要求:

// (1) 求各门课的平均分;

// (2)

找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩;

// (3) 找出三门课平均成绩在 85-90

分的学生,并输出其学号和姓名

Student stu[] = {

{"ZhangHaiXu", 47, 76,

64, 98.2, 0},

{"WangXingLiao", 13, 81,

67, 89.5, 0},

{"LiuYongXin", 16, 69.5,

79, 99, 0},

{"ZhangZhengHong", 51, 88,

59.4, 59.1, 0},

{"LiXiaoDan", 36, 91.4,

76, 89.2, 0}

};

//

各门课平均分

int count =

sizeof(stu) /

sizeof(stu[0]);

averageNumber ave = averageSorce(stu,

count);

printf("语文平均分%.1f,

数学平均分%.1f,

英语平均分%.1f\n", ave.averageChinese,

ave.averageMaths, ave.averageEnglish);

// 两门课不及格,输出学号以及不及格课程的成绩

failStudent(stu, count);

//

三门课平均成绩在 85-90

分的学生,并输出其学号和姓名

wellStudent(stu, count);

}

#endif

#pragma mark - 作业3

#if 0

{

//   3.

(***)模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用

A、B、C、D

表示,当选某候选人时直接输入其编号(编号由计算机随机产生),若输入的不是

A、B、C、D

则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数

Candidate candiate[] = {

{'A', 0},

{'B', 0},

{'C', 0},

{'D', 0}

};

int count =

sizeof(candiate) /

sizeof(candiate[0]);

elect(candiate, count);

}

#endif

#pragma mark - 作业4

#if 0

{

//    4. (***)创建一个

Point 结构体,包含 x,y 两个变量。

并写以下函数:

// 函数

1,判断两个点是否在一条水平线上。

// 函数

2,判断两个点是否在一条垂直线上。

//    函数

3,判断两个点是否相等

myPoint point[2] = {

{3, 5},

{4, 7}

};

isInLevel(point);

isVertically(point);

isEqual(point);

}

#endif

#pragma mark - 作业5

#if 0

{

//    5. (***)创建一个

Size 结构体,包含 width,height

两个变量。 并写以下函数:

//    函数

1,判断两个 size 是否等宽。

//    函数

2,判断两个 size 是否在等高。

//    函数

3,判断两个 size 是否相等。

mySize size[2] = {

{8, 8},

{6, 7}

};

isWidthEqual(size);

isHeightEqual(size);

isSizeEqual(size);

}

#endif

#pragma mark - 作业6

#if 0

{

//    6. (***)创建一个

Rect 结构体,包含 origin,size

两个变量。其中 origin 是

//    Point 类型的,size

是 Size 类型的。 并写以下函数:

//    函数

1,判断两个 Rect 是否相交。

//    函数

2,判断两个 Rect 是否包含某个

Point。

//    函数

3,判断一个 Rect 是否在另外一个 Rect

中。

myRect rect[2] = {

{{3, 3}, {8,

12}},

{{10, 14}, {2,

2}}

};

isRectIntersectant(rect);

isRectContainPoint(rect);

isRectContainRect(rect);

}

#endif

return

0;

}

//

//  HomeworkFunction.h

//  CH6_结构体

//

//  Created by JR_Rafael on 15/11/25.

//  Copyright ©

2015年 lanou3g. All rights reserved.

//

#import

// 结构体声明

// 年月日结构体

typedef struct daysOfYear {

int year;

int

month;

int day;

} myDay;

// 学生信息结构体

typedefstruct student {

char

name[20];

int

number;

float

maths;

float

chinese;

float

english;

float

average;

} Student;

// 平均成绩

typedefstruct average {

float

averageMaths;

float

averageChinese;

float

averageEnglish;

} averageNumber;

// 候选人

typedef struct candidate {

char

name;

int

pollNumber;

} Candidate;

//定义结构体变量包括:横坐标,纵坐标

typedefstruct point {

int x;

int y;

} myPoint;

//定义结构体变量包括:宽度,高度

typedefstruct size

{

int

width;

int

height;

} mySize;

// 矩形

typedefstruct rect

{

myPoint

point;

mySize

size;

} myRect;

// 函数声明

// 1

int days(myDay Date);

// 2

// 各门课平均分

averageNumber averageSorce(Student

stu[], int count);

// 两门课不及格,输出学号以及不及格课程的成绩

void failStudent(Student stu[],

int count);

// 三门课平均成绩在 85-90

分的学生,并输出其学号和姓名

void wellStudent(Student have[],

int count);

// 3

// 选举

void elect(Candidate candidate[],

int count);

// 4

// 是否在一条水平线上

void isInLevel(myPoint point[]);

// 是否在一条垂直线上

void isVertically(myPoint

point[]);

// 是否是一个点

void isEqual(myPoint point[]);

//5

// 是否等宽

void isWidthEqual(mySize size[]);

// 是否等高

void isHeightEqual(mySize size[]);

// 是否相等

void isSizeEqual(mySize size[]);

//6

// 判断两个矩形是否相交

void isRectIntersectant(myRect

rect[]);

// 判断point在矩形内

void isRectContainPoint(myRect

rect[]);

// 判断是否包含

void isRectContainRect(myRect

rect[]);

//

//  HomeworkFunction.m

//  CH6_结构体

//

//  Created by JR_Rafael on 15/11/25.

//  Copyright ©

2015年 lanou3g. All rights reserved.

//

#import "HomeworkFunction.h"

// 函数实现

int days (myDay Date) {

// 首先创建一个数组

int

daysOfMonth[12] = {31, 28,

31, 30, 31, 30,

31, 31, 30, 31,

30, 31};

//

判断闰年

BOOL cond1 =

0 == Date.year % 400;

BOOL cond2 =

0 == (Date.year % 4)

&& !(Date.year %

100);

int sumDays =

0;

if (cond2

&& cond1) {

daysOfMonth[1] =

29;

}

if

(Date.month >= 1

&& Date.month

<= 12

&& Date.day

> 0 &&

Date.day <=

daysOfMonth[Date.month - 1]) {

for (int i =

0; i < Date.month; i++)

{

sumDays +=

daysOfMonth[i];

}

sumDays += Date.day;

return sumDays;

} else {

return 0;

}

}

// 各门课平均分

averageNumber averageSorce(Student

stu[], int count) {

averageNumber

ave = {0};

for

(int i = 0; i < count;

i++) {

ave.averageMaths +=

stu[i].maths;

ave.averageEnglish +=

stu[i].english;

ave.averageChinese +=

stu[i].chinese;

}

ave.averageMaths /= count;

ave.averageEnglish /= count;

ave.averageChinese /= count;

return

ave;

}

// 不及格

void failStudent(Student stu[],

int count) {

for

(int i = 0; i < count;

i++) {

// 定义变量计数用来计不及格科数

int flag = 0;

//

如果成绩小于60,flag自增,即不及格科数加一

stu[i].maths <

60 ? flag++ : flag;

stu[i].chinese <

60 ? flag++ : flag;

stu[i].english <

60 ? flag++ : flag;

if (flag >=

2) {

// 判断满足不及格科数条件的学生并打印出

printf("\n%s有%d门不及格分别是:

\n", stu[i].name, flag);

if (stu[i].maths <

60) {

printf("maths = %.1f\n",

stu[i].maths);

}

if (stu[i].chinese <

60) {

printf("chinese = %.1f\n",

stu[i].chinese);

}

if (stu[i].english <

60) {

printf("English = %.1f\n",

stu[i].english);

}

}

}

}

// 80-90平均分

void wellStudent(Student stu[],

int count) {

for

(int i = 0; i < count;

i++) {

// 求平均数

stu[i].average =

(stu[i].maths + stu[i].chinese +

stu[i].english) / 3;

// 判断

if (stu[i].average

>= 85

&& stu[i].average

<= 90) {

printf("\n%s的平均分为%.2f,

他的学号是:%d\n", stu[i].name,

stu[i].average, stu[i].number);

}

}

}

// 选举

void elect(Candidate c[],

int count) {

printf("请输入参选人数 :

");

int n =

0;

scanf("%d", &n);

for

(int i = 0; i < n; i++)

{

//n个人投票,循环n次

char choice =

arc4random() % (69 - 65 +

1) + 65;

//

四个人参选4种情况,switch...case

switch (choice) {

case 'A':

c[0].pollNumber++;

break;

case 'B':

c[1].pollNumber++;

break;

case 'C':

c[2].pollNumber++;

break;

case 'D':

c[3].pollNumber++;

break;

default:

break;

}

}

// 从高到底排序, 冒泡排序

for

(int i = 0; i < count -

1; i++) {

for (int j =

0; j < count - i - 1; j++)

{

if (c[j].pollNumber < c[j

+ 1].pollNumber) {

Candidate temp =

c[j];

c[j] = c[j +

1];

c[j + 1] =

temp;

}

}

}

for

(int i = 0; i < count;

i++) {

printf("%c的得票为:

%d\n", c[i].name,

c[i].pollNumber);

}

}

// 实现判断是否在同一水平线上功能的函数

void isInLevel(myPoint point[]) {

// 在同一水平线上条件是纵坐标相等即y相等

if

(point[0].y ==

point[1].y) {

printf("点(%d,

%d)和点(%d,

%d)在同一水平线\n",

point[0].x,

point[0].y,

point[1].x,

point[1].y);

} else {

printf("点(%d,

%d)和点(%d,

%d)不在同一水平线\n",

point[0].x,

point[0].y,

point[1].x,

point[1].y);

}

}

// 实现判断是否在同一垂直线上功能的函数

void isVertically(myPoint point[])

{

// 在同一垂直线上条件是横坐标相等即x相等

if

(point[0].x ==

point[1].x) {

printf("点(%d,

%d)和点(%d,

%d)在同一垂直线\n",

point[0].x,

point[0].y,

point[1].x,

point[1].y);

} else {

printf("点(%d,

%d)和点(%d,

%d)不在同一垂直线\n",

point[0].x,

point[0].y,

point[1].x,

point[1].y);

}

}

// 实现判断两点是否相等功能的函数

void isEqual(myPoint point[]) {

//两点相等条件是横,纵坐标都相等

即 x相等且y相等

if

(point[0].x ==

point[1].x

&&

point[0].y ==

point[1].y) {

printf("点(%d,

%d)和点(%d,

%d)相等\n",

point[0].x,

point[0].y,

point[1].x,

point[1].y);

} else {

printf("点(%d,

%d)和点(%d,

%d)不相等\n",

point[0].x,

point[0].y,

point[1].x,

point[1].y);

}

}

// 实现判断宽度是否相等功能的函数

void isWidthEqual(mySize size[])

{

if

(size[0].width ==

size[1].width) {

printf("Size(%d,

%d)和Size(%d,

%d)的宽度相等\n",

size[0].width,

size[0].height,

size[1].width,

size[1].height);

} else {

printf("Size(%d,

%d)和Size(%d,

%d)的宽度不相等\n",

size[0].width,

size[0].height,

size[1].width,

size[1].height);

}

}

//实现判断高度是否相等功能的函数

void isHeightEqual(mySize size[])

{

if

(size[0].height ==

size[1].height) {

printf("Size(%d,

%d)和Size(%d,

%d)的高度相等\n",

size[0].width,

size[0].height,

size[1].width,

size[1].height);

} else {

printf("Size(%d,

%d)和Size(%d,

%d)的高度不相等\n",

size[0].width,

size[0].height,

size[1].width,

size[1].height);

}

}

// 实现判断大小是否相等功能的函数

void isSizeEqual(mySize size[])

{

if

(size[0].width *

size[0].height ==

size[1].width *

size[1].height) {

printf("Size(%d,

%d)和Size(%d,

%d)相等\n",

size[0].width,

size[0].height,

size[1].width,

size[1].height);

} else {

printf("Size(%d,

%d)和Size(%d,

%d)不相等\n",

size[0].width,

size[0].height,

size[1].width,

size[1].height);

}

}

// 判断两矩形是否相交

void isRectIntersectant(myRect rect[])

{

int minx =

rect[0].point.x

<

rect[1].point.x ?

rect[0].point.x :

rect[1].point.x;

int maxx =

rect[0].point.x

>

rect[1].point.x ?

rect[0].point.x :

rect[1].point.x;

int miny =

rect[0].point.y

<

rect[1].point.y ?

rect[0].point.y :

rect[1].point.y;

int maxy =

rect[0].point.y

>

rect[1].point.y ?

rect[0].point.y :

rect[1].point.y;

// 最小x所属的矩形的宽

int minw =

rect[0].point.x

<

rect[1].point.x ?

rect[0].size.width :

rect[1].size.width;

// 最小y所属的矩形的高

int minh =

rect[0].point.y

<

rect[1].point.y ?

rect[0].size.height :

rect[1].size.height;

if (minx +

minw >= maxx && miny

+ minh >= maxy) {

printf("相交\n");

} else {

printf("不相交\n");

}

}

// 判断point在矩形内

void isRectContainPoint(myRect

rect[])

{

myRect minx =

rect[0].point.x

<

rect[1].point.x ?

rect[0] : rect[1];

myRect maxx =

rect[0].point.x

>

rect[1].point.x ?

rect[0] : rect[1];

if

(minx.point.y <

maxx.point.y

&&

minx.point.x +

minx.size.width >

maxx.point.x

&&

minx.point.y +

minx.size.height >

maxx.point.y) {

printf("包含\n");

} else {

printf("不包含\n");

}

}

// 判断是否在内部

void isRectContainRect(myRect

rect[])

{

myRect minx =

rect[0].point.x

<

rect[1].point.x ?

rect[0] : rect[1];

myRect maxx =

rect[0].point.x

>

rect[1].point.x ?

rect[0] : rect[1];

if

(minx.point.y <=

maxx.point.y

&&

minx.point.x +

minx.size.width >=

maxx.point.x +

maxx.size.width

&&

minx.point.y +

minx.size.height >=

maxx.point.y +

maxx.size.height) {

printf("在\n");

} else {

printf("不在\n");

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值