//
// 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");
}
}