1、定义一个结构体Object,包括用户id及name信息。实现让用户在控制台输入id和name,并打印显示出结果(知识点:结构体的定义,结构体数组访问成员变量的方法)
示例:
输入ID: 1235
输入名字: hello
result: ID: 1235, 名字: hello
#include
#include
struct Object
{
int id;
char name[32];
};
int main()
{
Object obj;
printf("please input ID:");
scanf_s("%d", &obj.id,sizeof(obj.id));//在使用scanf_s是要指定边界值
printf("please input Name:");
scanf_s("%s", &obj.name,sizeof(obj.name));
printf("result:ID: %d,name:%s \n", obj.id, obj.name);
return 0;
}
2、定义一个结构体类型,表示银行账户信息: 每个帐户包含账号,用户身份证号码,用户姓名,用户地址,账户金额。 然后,从控制台输入各个字段的值,保存到结构体变量中。
#include
#include
struct User
{
int id;
int card;
char name[32];
char address[128];
int money;
};
int main()
{
User obj;
printf("please input id:");
scanf_s("%d",&obj.id,sizeof(obj.id));
printf("please input card:");
scanf_s("%d", &obj.card, sizeof(obj.card));
printf("please input name:");
scanf_s("%s", &obj.name, sizeof(obj.name));
printf("please input adress:");
scanf_s("%s", &obj.address, sizeof(obj.address));
printf("please input money:");
scanf_s("%d", &obj.money, sizeof(obj.money));
printf("id:%d\n card:%d\n name:%s\n address:%s\n money:%d\n",
obj.id, obj.card, obj.name, obj.address, obj.money);
return 0;
}
但scanf_s对输入有要求,比如遇到空格就自动结束,不能允许输入存在空格。
所以另外一种方法是使用get_s函数(需要加入#include
)实现读取用户的输入。
但gets_s函数只能读取字符串,对于数字型输入要进行转换,使用atoi函数(需要加入#include
)实现字符串转换为整数。
代码另一版本:
#include
#include
#include
struct Account
{
unsigned int id;
char citizen_id[19];
char name[32];
char address[128];
unsigned int balance; // 余额
};
// -1, 表示输入有误。0,表示输入正确
int input(Account* acc)
{
char buf[128];
// 输入ID
printf("ID: ");
gets_s(buf);
acc->id = atoi(buf); //a to i
// 输入身份证号
printf("身份证号: ");
gets_s(acc->citizen_id);
// 有效性检测
if (strlen(acc->citizen_id) != 18)
{
printf("请输入18位的身份证号!\n");
return -1;
}
// 输入名称
printf("名称: ");
gets_s(acc->name);
printf("地址: ");
gets_s(acc->address);
printf("余额: ");
gets_s(buf);
acc->balance = atoi(buf); //a to i
return 0;
}
int main()
{
Account acc;
if (input(&acc) == 0)
{
printf("有效的输入!\n");
printf(" %d\n %s\n %s\n %s\n %d\n",
acc.id, acc.citizen_id, acc.name, acc.address, acc.balance);
}
else
{
printf("无效的输入!\n");
}
return 0;
}
3、定义一个User结构体,含以下字段:
id: 一个数字,每个用户不同的id
email: email地址,一般网站的用户允许以email地址登录
gender: 性别,男or女
QQ: QQ号码
写一个函数,在User数组中查找某个id的User(知识点:结构体数组初始化;指针访问成员变量)
函数描述:
User* find (User* all, int n, int id);
其中,
all: 输入一个User数组
n : 数组长度
id: 待查找的id
#include
#include
#include
struct User
{
int id;
char email[16];
char gender[5];
int qq;
};
User* find(User* all, int n, int id)
{
for (int i = 0; i < n; i++)
{
if (all[i].id == id)
{
printf("%d %s %s %d \n",
all[i].id, all[i].email, all[i].gender, all[i].qq);
}
}
return 0;
}
int main()
{
User a[3] = {
{123,"a@xxx.net","boy",19260909},
{124,"b@xxx.net","girl",19260901},
{125,"c@xxx.net","boy",19260902}
};
find(a, 3, 124);
return 0;
}
4、定义一个结构体Fraction,表示分数,用于表示 2/3, 5/6这样的分数。
描述:
**(1) 定义Fraction
(2) 完成分数的加法和乘法**
Fraction add (Fraction a, Fraction b);
Fraction mul (Fraction a, Fraction b);
#include
#include
#include
struct Fraction {
int numerator;
int denominator;
};
Fraction add(Fraction a, Fraction b)
{
Fraction result;
result.numerator = a.numerator * b.denominator +b.numerator * a.denominator;
result.denominator = a.denominator * b.denominator;
printf("%d/%d \n", result.numerator,result.denominator);
return result;
}
Fraction mul(Fraction a, Fraction b)
{
Fraction result;
result.numerator = a.numerator * b.denominator - b.numerator * a.denominator;
result.denominator = a.denominator * b.denominator;
printf("%d/%d \n", result.numerator, result.denominator);
return result;
}
int main()
{
Fraction a = { 2,3 };
Fraction b = { 3,5 };
add(a, b);
mul(a, b);
return 0;
}
5、根据上4的描述,用输入参数和输出参数来完成函数。
描述:
void add (const Fraction* a, const Fraction* b, Fraction* c );
void mul (const Fraction* a, const Fraction* b, Fraction* c );
其中,a, b为输入参数 , c为输出参数
(知识点:指针结构体访问成员变量)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Fraction {
int numerator;
int denominator;
};
void add(const Fraction* a, const Fraction* b, Fraction* c)
{
c->numerator = a->numerator * b->denominator + b->numerator *a->denominator;
c->denominator = a->denominator * b->denominator;
printf("%d/%d \n", c->numerator, c->denominator);
}
void mul(const Fraction* a, const Fraction* b, Fraction* c)
{
c->numerator = a->numerator * b->denominator - b->numerator *a->denominator;
c->denominator = a->denominator * b->denominator;
printf("%d/%d \n", c->numerator, c->denominator);
}
int main()
{
Fraction a = { 2,3 };
Fraction b = { 3,5 };
Fraction c;
add(&a, &b, &c);
mul(&a, &b, &c);
return 0;
}
6、根据上4的定义,完成一个函数:该函数用于对分数进行化简
描述:
原型:
void reduce (Fraction* f);
例如,f原为4/6,则reduce之后为2/3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Fraction
{
int numerator;
int denominator;
};
void reduce(Fraction* f)
{
//找出分子和分母的最小值
int min;
min = f->numerator;
if (min>f->denominator)
{
min = f->denominator;
}
//在1-min之间进行分解
for (int i = 1; i <= min; i++)
{
if (f->denominator % i == 0 && f->numerator % i == 0)
{
f->numerator = f->numerator / i;
f->denominator = f->denominator / i;
min = min / i;
}
}
printf("%d/%d \n", f->numerator, f->denominator);
}
int main()
{
Fraction a = { 24,64 };
reduce(&a);
return 0;
}
7、定义一个学生Student: 学号ID, 姓名。同时每个学生有一台笔记本电脑Laptop: 型号,颜色,价格(知识点:对象里面包含另一个对象,)
#include
#include
#include
struct Laptop
{
char type[16];
char color[16];
int value;
};
struct Student {
int ID;
char name[16];
//Laptop computer; 这样定义就意味着每个同学都有笔记本
Laptop* computer; //空指针时表示没有笔记本
};
int main()
{
//笔记本对象
Laptop computer = {
"lenovo",
"red",
5000
};
//学生对象
Student student = {
2018,
"shaofa",
&computer //NULL或0时,表示该同学没有笔记本
};
return 0;
}
8、试定义一个结构体表示:网络编程中的网络地址SocketAddr,包含以下信息:
IP地址:由4个字节组成,每个数界于0-255之间
端口号: 界于0-65535
描述:(1) 定义一个结构体 SockAddress
(2) 完成函数,用于从控制台输入数据
int input(SockAddress* addr);
#include
#include
#include
struct SockAddress
{
int IP[4];
int port;
};
int input(SockAddress* addr)
{
printf("please input four ID:");
scanf_s("%d-%d-%d-%d",
&addr->IP[0], &addr->IP[1], &addr->IP[2], &addr->IP[3]);
printf("please input port:");
scanf_s("%d", &addr->port);
printf("the ID is %d-%d-%d-%d \n",
addr->IP[0], addr->IP[1], addr->IP[2], addr->IP[3]);
printf("the port is %d \n", addr->port);
return 0;
}
int main()
{
SockAddress a;
input(&a);
return 0;
}
9、定义一个坐标点类型Point,每个Point有成员x, y表示其坐标。
设平面上两个点的坐标分别为(x1, y1) (x2, y2) ,其中 x1, y1, x2, y2为整数。
则曼哈顿距离 Manhattan Distance 的定义为: |x1 - x2 | + | y1 -y2|
写一个函数,求两点之间的直线距离Distance 和 曼哈顿距离
#include
#include
#include
struct Point
{
int x;
int y;
};
int ManhattanDistance(const Point* p1, const Point* p2)
{
Point result;
result.x = p1->x - p2->y;
if (result.x < 0)
{
result.x = (-1) * result.x;
}
result.y = p1->y - p2->y;
if (result.y<0)
{
result.y = (-1) * result.y;
}
int dis = result.x + result.y;
printf("the manhattandistance is %d \n", dis);
return dis;
}
double Distance(const Point* p1, const Point* p2)
{
Point result;
result.x = (p1->x - p2->x)*(p1->x - p2->x);
result.y = (p1->y - p2->y)*(p1->y - p2->y);
double dis =sqrt( result.x + result.y); //调用数学函数,头部添加math.h
printf("the line distance is %.2lf \n", dis);
return dis;
}
int main()
{
Point a = { 1,2 };
Point b = { 8,11 };
ManhattanDistance(&a, &b);
Distance(&a, &b);
return 0;
}
结构体试题就这么多,主要就是熟悉以下知识点:
1、结构体的定义
2、结构体中还含有其他结构体对象的定义
3、结构体中访问成员变量的方法:普通变量与指针变量的区别
代码是小鱼自己写的,如要使用,请注明转载出处;如有问题,请评论区留言,方便相互讨论;如果喜欢,请不要吝啬,点个赞再走哦 ^_^
试题出自afanihao官网,博客不断更新中。。。