中等——结构体

1.

候选人得票统计程序。设有3个候选人,每次输入一个得票候选人的名字,不考虑弃权情况,要求最后输出各个候选人的得票结果(参加投票的人数由程序运行时输入)。
输入格式:
"输入%d个候选人的基本信息:姓名\n"
"%s"
"输入参加投票的人数:"
"%d"
"输入%d个参加投票人的投票情况\n"
"%s"
输出格式:
"输出%d个候选人的基本信息:姓名,票数\n"
"%s %d\n"
程序的运行示例如下:
输入3个候选人的基本信息:姓名
a
b
c
输入参加投票的人数:5
输入5个参加投票人的投票情况
a
a
b
b
c
输出3个候选人的基本信息:姓名,票数
a 2
b 2
c 1
#include <stdio.h>
#include <string.h>

#define MAXN 3

struct Candidate
{
    char name[10];
    int ticket;
};

typedef struct Candidate cPepl;

int main (void)
{
    cPepl a[MAXN];

    printf ("输入%d个候选人的基本信息:姓名\n", MAXN);

    int i;
    for (i = 0; i < MAXN; i ++)
    {
        scanf ("%s", &a[i].name);
        a[i].ticket = 0;
    }

    int iSum;
    printf ("输入参加投票的人数:");
    scanf ("%d", &iSum);

    printf ("输入%d个参加投票人的投票情况\n", iSum);

    for (i = 0; i < iSum; i ++)
    {
        char vote[10];

        scanf ("%s", vote);

        if (strcmp (vote, a[0].name) == 0)
        {
            a[0].ticket ++;
        }

        if (strcmp (vote, a[1].name) == 0)
        {
            a[1].ticket ++;
        }

        if (strcmp (vote, a[2].name) == 0)
        {
            a[2].ticket ++;
        }
    }

    printf ("输出%d个候选人的基本信息:姓名,票数\n", MAXN);

    for (i = 0; i < MAXN; i ++)
    {
        printf ("%s %d\n", a[i].name, a[i].ticket);
    }

}

2.

struct date_rec

  {

    int day ;

    int month ;

    int year ;

  };

写一个函数接收两个日期,如果两个日期相同,则返回0,如果第一个日期晚于第二个日期,则返回1,如果第一个日期早于第二个日期,则返回-1。并编写main函数测试它。

**输入格式要求:"%d%d%d" 提示信息:"请输入当前日期(年 月 日):"
**输出格式要求:"当前日期:%d年%d月%d日!\n" "第一个日期晚于第二个日期!" "第一个日期早于第二个日期!"  "两个日期相同!"

程序运行示例如下:

请输入当前日期(年 月 日):2012 9 10↙
请输入当前日期(年 月 日):2013 7 10↙
当前日期:2012年9月10日!  
当前日期:2013年7月10日!
第一个日期早于第二个日期!
#include <stdio.h>

const char *msg[] = {"第一个日期晚于第二个日期!", "第一个日期早于第二个日期!", "两个日期相同!"};

struct date_rec
{
    int day;
    int month;
    int year;
};

typedef struct date_rec  data;
typedef struct date_rec *sPtr;

void Compre (sPtr p, sPtr q);

int main (void)
{
    data d1, d2;
    printf ("请输入当前日期(年 月 日):");
    scanf ("%d%d%d", &d1.year, &d1.month, &d1.day);

    printf ("请输入当前日期(年 月 日):");
    scanf ("%d%d%d", &d2.year, &d2.month, &d2.day);

    printf ("当前日期:%d年%d月%d日!\n", d1.year, d1.month, d1.day);

    printf ("当前日期:%d年%d月%d日!\n", d2.year, d2.month, d2.day);

    sPtr p = &d1;
    sPtr q = &d2;

    Compare (p, q);

    return 0;
}

void
Compare (sPtr p, sPtr q)
{
    if (p -> year < q -> year)
    {
        printf ("%s", msg[1]);
    }
    else if (p -> year > q -> year)
    {
        printf ("%s", msg[0]);
    }
    else if (p -> year == p -> year)
    {
        if (p -> month == q -> month)
        {
            if (p -> day == q -> day)
            {
                printf ("%s", msg[2]);
            }
            else if (p -> day > q -> day)
            {
                printf ("%s", msg[0]);
            }
            else
            {
                printf ("%s", msg[1]);
            }
        }
        else if (p -> month > q -> month)
        {
            printf ("%s", msg[0]);
        }
        else
        {
            printf ("%s", msg[1]);
        }
    }
}

3.

中国有句俗语叫“三天打鱼两天晒网”,某人从90年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天中是在“打渔”,还是在“晒网”.
**输入格式要求:"%d%d%d" 提示信息:"Enter year/month/day:"
**输出格式要求:"He is fishing.\n" "He is sleeping.\n"
程序运行示例如下:
Enter year/month/day:1990 1 5
He is sleeping.
#include<stdio.h>

struct date
{
	int year;
	int month;
	int day;
};

const int Month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };


int year_day(int year);
int days (int year, int month, int day);
void isFish (int t);

int main (void)
{
	struct date t;

	printf ("Enter year/month/day:");

	scanf ("%d %d %d", &t.year, &t.month, &t.day);

	int n = days (t.year, t.month, t.day);

	isFish (n);
}


int
year_day (int year)
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		return 366;
	}

	return 365;
}

int
days (int year, int month, int day)
{
	int t = 0, i;

	for (i = 1990; i < year; i ++)
	{
		t += year_day(i);
	}

	for (i = 0; i < month - 1; i ++)
	{
		t += Month[i];
	}

	t += day;

	if (year_day(year) == 366 && month > 2)
    {
        t ++;
    }

	return t;
}

void
isFish (int t)
{
	if (t % 5 == 4 || t % 5 == 0)
	{
		printf ("He is sleeping.\n");
	}
	else
    {
        printf ("He is fishing.\n");
    }
}

4.

完成对输入的字符串中C关键词的查找统计。
程序运行示例如下:
本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入:
if do while while do break goto helloworld end
您的输入中C语言关键字出现的次数统计如下:
break     :      1
do        :      2
goto      :      1
if        :      1
while     :      2

输入格式:
"本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入:\n"
输出格式:
"您的输入中C语言关键字出现的次数统计如下:\n"
"%-10s: %6d\n"
#include <stdio.h>
#include <string.h>

#define MAXN 32

struct Key
{
    char name[10];
    int  count;
};

struct Key array[MAXN] = {{"break", 0}, {"auto", 0}, {"case",0}, {"char",0}, {"const", 0}, {"continue", 0}, {"do", 0}, {"goto", 0},
                                {"int", 0}, {"double", 0}, {"long", 0}, {"float", 0}, {"void", 0}, {"strcut", 0}, {"short", 0}, {"signed", 0},
                                {"unsigned", 0}, {"if", 0}, {"else", 0}, {"for", 0}, {"while", 0}, {"return", 0}, {"sizeof", 0}, {"static", 0},
                                {"default", 0}, {"case", 0}, {"swicth", 0}, {"register", 0}, {"typedef", 0}, {"union", 0}, {"enum", 0}, {"volatile", 0}};

int main (void)
{
    printf ("本程序将为您统计C语言的关键字的个数,请输入,输入end结束输入:\n");

    char str[10] = {' '};
    int i;

    while (strcmp (str, "end") != 0)
    {
        scanf ("%s", str);


        for (i = 0; i <MAXN; i ++)
        {
            if (strcmp (str, array[i].name) == 0)
            {
                array[i].count ++;
            }
        }
    }

    printf("您的输入中C语言关键字出现的次数统计如下:\n");

	for (i = 0; i < MAXN - 1; i ++)
	{
		if (array[i].count != 0)
		{
			printf ("%-10s: %6d\n", array[i].name, array[i].count);
		}
	}

    return 0;
}

5.

13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。 输出提示 "出圈成员及顺序:" 格式 "%3d" 输出提示 "\n最后的成员是:" 格式 "%3d" 程序的运行示例如下: 出圈成员及顺序: 3 6 (后面以此类推,抱歉这里的输出结果保密,暂不公开,注意最后一个人是不出圈的哦) 最后的成员是: (抱歉这里的输出结果保密,暂不公开)

#include <stdio.h>

#define MAXN 13
#define MAXP 12
#define MAXH 3

int main (void)
{
    int p[MAXN] = {0};
    int rest = MAXP;
    int cnt = 1;
    int j = 0;

    printf("出圈成员及顺序:");
    while (rest != 0)
    {
        while (p[j] != 0)
        {
            j = (j + 1) % MAXN;
        }

        if (cnt == MAXH)
        {
            p[j] = 1;
            printf ("%3d", j + 1);

            rest --;

            j = (j + 1) % MAXN;
            cnt = 1;
        }
        else
        {
            cnt ++;
            j = (j + 1) % MAXN;
        }
    }

    printf ("\n最后的成员是:");
    int i;
    for (i = 0; i < MAXN; i ++)
    {
        if (p[i] != 1)
        {
            printf ("%3d", i + 1);

            break;
        }
    }

    return 0;
}

6.

给定如下定义:
 struct time_rec
  {
    int hours ;
    int mins  ;
    int secs  ;
  } ;
  struct time_rec current_time ; 
写一个程序包含如下的函数,完成:
(a) 输入current_time的值:
void input_time(struct time_rec *current_time)
(b) 将current_time增加1秒:
void increment_time(struct time_rec *current_time)
(c) 显示current_time的新值。
void output_time(struct time_rec *current_time)

**输入格式要求:"%d%d%d" 提示信息:"请输入当前时间(时 分 秒):"
**输出格式要求:"当前时间:%d时%d分%d秒!
#include <stdio.h>

struct time_rec
{
    int hours;
    int mins;
    int secs;
};

struct time_rec current_time;

void input_time(struct time_rec *current_time);
void increment_time(struct time_rec *current_time);
void output_time(struct time_rec *current_time);

int main (void)
{
    printf ("请输入当前时间(时 分 秒):");

    struct time_rec *sp = &current_time;

    input_time (sp);
    increment_time (sp);
    output_time (sp);

    return 0;
}

void
input_time(struct time_rec *sp)
{
    scanf ("%d%d%d", &sp -> hours, &sp -> mins, &sp -> secs);
}

void
increment_time(struct time_rec *sp)
{
    if (sp -> secs == 59)
    {
        sp -> secs = 0;

        if (sp -> mins == 59)
        {
            sp -> mins = 0;

            if (sp -> hours == 23)
            {
                sp -> hours = 0;
            }
            else
            {
                sp -> hours ++;
            }
        }
        else
        {
            sp -> mins ++;
        }
    }
    else
    {
        sp -> secs ++;
    }
}

void
output_time(struct time_rec *sp)
{
    printf ("当前时间:%d时%d分%d秒!", sp -> hours, sp -> mins, sp -> secs);
}

7.

编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
例如:
Input vote 1:li
Input vote 2:li
Input vote 3:Zhang
Input vote 4:wang
Input vote 5:zhang
Input vote 6:Wang
Input vote 7:Zhang
Input vote 8:wan
Input vote 9:li
Input vote 10:lii
Election results:
      li:3
   zhang:3
    wang:2
Wrong election:2

输入格式:
"Input vote %d:"
"%s"
输出格式:
"Election results:\n"
候选人姓名+"%8s:%d\n"
"Wrong election:%d\n"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define MAXN 10
#define MAXP 3

struct Candidat
{
    char name[10];
    int ticket;
};

char *toUpper (char *str);

int main (void)
{
    struct Candidat candidate[MAXP] = {{"zhang", 0}, {"li", 0}, {"wang", 0}};
    int wrong = 0;

    int i;
    for (i = 0; i < MAXN; i ++)
    {
        printf ("Input vote %d:", i + 1);

        char vote[10];
        scanf ("%s", vote);

        bool bFlag = false;

        if (strcmp (toUpper (vote), "ZHANG") == 0)
        {
            candidate[0].ticket ++;
            
            bFlag = true;
        }
        
        if (strcmp (toUpper (vote), "LI") == 0)
        {
            candidate[1].ticket ++;
            
            bFlag = true;
        }
        
        if (strcmp (toUpper (vote), "WANG") == 0)
        {
            candidate[2].ticket ++;
            
            bFlag = true;
        }

        if (bFlag == false)
        {
            wrong ++;
        }
    }

    printf ("Election results:\n");

    printf ("%8s:%d\n", candidate[1].name, candidate[1].ticket);
    printf ("%8s:%d\n", candidate[0].name, candidate[0].ticket);
    printf ("%8s:%d\n", candidate[2].name, candidate[2].ticket);

    printf ("Wrong election:%d\n", wrong);

    return 0;
}

char
*toUpper (char *str)
{
    char *p = str;
    while (*p != '\0')
    {
        if (*p >= 'a' && *p <= 'z')
        {
            *p -= 32;
        }

        p ++;
    }

    return str;
}

8.

以下程序有若干语法错误,不能正确输出成员a和成员v的值。请找出错误并改正之。

union  

{   int a;

    Struct 

    {   int u;

        float v;

    }b;

}

main()

{   union uu m;

    m.a=200;

    m.u=500;   

    m.v=120.5;     

    printf(“%d\t%f\n”,m.a,m.b.v);

}

#include <stdio.h>

union
{
    int a;

    struct
    {
        int u;
        float v;
    } b;
} m;

int main (void)
{

    m.a=200;

    m.b.u=500;

    m.b.v=120.5;

    printf ("%d\t%f\n",m.a,m.b.v);
    
    return 0;
}

 9.

*约瑟夫问题。这是十七世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个基督教徒和15个异教徒在海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:30个人围成一个圆圈,从第一个人开始依次报数,每数到第9个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是异教徒。
本题示例为 @ @ @ @ + + + + + @ @ + @ @ @ + @ + + @ @ + + + @ + + @ @ + (第一个人前无空格,每人中间1个空格)
**输出格式要求:"The original circle is (+:papandom,  @:christian);\n" "%c "
#include <stdio.h>

#define MAXN 30
#define MAXP 15
#define MAXH 9

int main (void)
{
    int p[MAXN] = {0};
    int rest = MAXP;
    int cnt = 1;
    int j = 0;

    while (rest != 0)
    {
        while (p[j] != 0)
        {
            j = (j + 1) % MAXN;
        }

        if (cnt == MAXH)
        {
            p[j] = 1;

            rest --;

            j = (j + 1) % MAXN;
            cnt = 1;
        }
        else
        {
            cnt ++;
            j = (j + 1) % MAXN;
        }
    }

    printf ("The original circle is (+:papandom,  @:christian);\n");
    
    int i;
    for (i = 0; i < MAXN; i ++)
    {
        if (p[i] == 1)
        {
            printf ("+ ");
        }
        else
        {
            printf ("@ ");
        }
    }
    
    return 0;
}

10.

定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天?注意闰年问题。
输入格式要求:"请输入日期(年,月,日)\n"
输出格式要求:"%d月%d日是%d年的第%d天\n"
程序的运行示例如下:
请输入日期(年,月,日)
1990,2,14↙
2月14日是1990年的第45天。
#include <stdio.h>
#include <stdbool.h>

struct Date
{
    int year;
    int month;
    int day;
};

bool isLeap (int year);


int main (void)
{
    printf("请输入日期(年,月,日)\n");

    struct Date date;

    scanf ("%d,%d,%d", &date.year, &date.month, &date.day);

    bool bFlag = isLeap (date.year);
    int sum = 0;

    int i;
    for (i = 1; i < date.month; i++)
    {
        if (i == 4 || i == 6 || i == 9 || i == 11)
        {
            sum += 30;
        }
        else if (i == 2)
        {
            if (bFlag == false)
            {
                sum += 28;
            }
            else
            {
                sum += 29;
            }
        }
        else
        {
            sum += 31;
        }
    }
    
    sum += date.day;

    printf ("%d月%d日是%d年的第%d天\n", date.month, date.day, date.year, sum);

    return 0;
}

bool
isLeap (int year)
{
    if ((year % 400 == 0) | (year % 100 != 0 && year % 4 == 0))
    {
        return true;
    }

    return false;
}

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在MATLAB中,结构体是一种数据类型,用于存储不同类型的数据。结构体由不同名字的字段组成,每个字段可以存储任意类型的数据。可以使用函数struct()来创建结构体数组。例如,通过直接对结构体变量名.字段名赋值的方式,可以创建一个结构体数组。每个结构体都是1x1的结构体数组,可以通过指定位置的方式来访问和操作每个结构体的字段。 引用提供了创建结构体数组的几种方式,包括使用struct()函数和直接赋值的方法。可以通过给每个字段赋值来创建结构体数组,字段的命名规则和变量一样。例如,可以创建一个1x2的结构体数组,其中包含'name'、'gender'等字段,并分别赋值。也可以通过元胞数组来创建多个结构体结构体数组。 引用说明了当value不是元胞数组,或者value是标量元胞数组时,结构体是标量结构体。这意味着如果每个字段的值是标量或者非元胞数据,那么结构体将是标量结构体。 引用提到结构体和元胞类型一样,可以存储任意类型的数据。结构体数组要求每个结构体的字段数目和字段名字必须相同。可以通过直接对结构体变量名.字段名赋值的方式来创建结构体数组,并且可以将结构体数组视为一维结构体数组。 总而言之,MATLAB中的结构体是一种用于存储不同类型数据的数据类型。可以通过函数struct()和直接赋值的方式来创建结构体数组,每个结构体都由不同名字的字段组成,每个字段可以存储任意类型的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MATLAB数据类型 — 结构体(struct)](https://blog.csdn.net/weixin_42033845/article/details/106793447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [matlab初学matlab——结构体](https://blog.csdn.net/m0_54028213/article/details/121315561)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的企鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值