C/C++试题集——结构体篇

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官网,博客不断更新中。。。

你可能感兴趣的:(c/c++,代码进修)