对象-@C语言大神:此题不用C++能做吗?求算法思路??【不要求代码】

问题描述

@C语言大神:此题不用C++能做吗?求算法思路??【不要求代码】

求:同日出生的人的总个数,请使用面向对象的方法,找出若干同学中,生日相同的学生总数。
提示:
1、定义类表示日期,包含私有属性年月日,重载等于操作符,用于大小比较
2、定义类表示学生,包含私有属性姓名、生日(日期类型)
输入:四个学生对象的信息,分别是姓名,年,月,日
比如 XiaoZhang 1994 5 1
XiaoWang 1994 5 1
XiaoLi 1994 6 3
XiaoChen 1994 6 3

输出 生日相同的学生总数
比如 4

关键是不知道用C怎么做?求算法的思路??

解决方案

好吧。可能我写代码也上瘾了。


#include <stdio.h>
#define MAXSTUDENTS 200
typedef struct
{
    char* name;
    int year;
    int month;
    int day;
    int birthday;
} stutype;
typedef struct
{
    stutype stu[MAXSTUDENTS];
    int count;
} stulist;

stutype assign(char* name, int year, int month, int day);
stulist sort(stulist list);

main()
{
    stulist list;
    int n = 1;
    int i;
    int differ = 1;
    list.stu[0] = assign("XiaoZhang", 1994, 5, 1);
    list.stu[1] = assign("XiaoLi", 1994, 6, 3);
    list.stu[2] = assign("XiaoWang", 1994, 5, 1);
    list.stu[3] = assign("XiaoChen", 1994, 6, 3);
    list.stu[4] = assign("XiaoDong", 1994, 8, 1);
    list.stu[5] = assign("XiaoMing", 1994, 3, 3);
    list.stu[6] = assign("XiaoFang", 1994, 5, 1);
    list.count = 7;
    list = sort(list);
    for ( i = 0; i < list.count - 1; i++)
    {
        if ( list.stu[i + 1].birthday == list.stu[i].birthday)
        {
            n += 1;
            differ = 0;
        }
        else if ( differ == 0)
        {
            n +=1;
            differ += 1;
        }
    }
    if ( differ != 0)       // 多加了一次,去掉
        n -= 1;

    for ( i = 0; i < list.count; i++)
        printf("%s, %dn", list.stu[i].name, list.stu[i].birthday);
    printf("生日相同的学生总数:%d.n", n);
}

stutype assign(char* name, int year, int month, int day)
{
    stutype student;
    student.name = name;
    student.year = year;
    student.month = month;
    student.day = day;
    student.birthday =
        student.year * 10000 + student.month * 100 + student.day;
    return student;
} // 学生结构赋值

stulist sort(stulist list)
{
    stutype temp;
    int i;
    int j;
    int finish = 0;
    for ( i = 0; i < list.count - 1 && finish == 0; i++)
    {
        finish = 1;
        for ( j = 0; j < list.count - 1; j++)
            if ( list.stu[j].birthday > list.stu[j + 1].birthday)
            {
                temp = list.stu[j];
                list.stu[j] = list.stu[j + 1];
                list.stu[j + 1] = temp;
                finish = 0;
            }
    }
    return list;
} // 冒泡排序

解决方案二:

不是说了用oop吗,为什么非要用c..

解决方案三:

题目要求用面向对象做了!用c当然能出同样的效果。但是c是面向过程的

解决方案四:

直接比较时间复杂度会高一些,先排序。
因为生日要分年月日,所以用基数排序。
设置生日相同的学生总数初值n=1(生日相同的学生总数不可能为1,循环过之后若n=1,则n=0)
然后从小到大开始比较。
每发现后一个学生的生日和前一个学生相等,则n+=1;
基本就可以收工了。

解决方案五:

程序没用基数排序,得有链表,不太好弄,用的是冒泡。
因为C里面没有引用,所以都是值传递的,看起来比较费劲。
初始化顺序给你打乱了,好调程序。
还有一些地方是可以优化的,但程序功能我是调试通过的。

时间: 2024-08-31 21:10:06

对象-@C语言大神:此题不用C++能做吗?求算法思路??【不要求代码】的相关文章

c-萌妹纸@C语言大神,学科平均分用结构体,此题跪求代码?

问题描述 萌妹纸@C语言大神,学科平均分用结构体,此题跪求代码? 题目: 班里10名同学,选修物理和数学的同学各有若干名. 现在录入同学学号,姓名,选修课程编号,以及其成 绩, 要求计算出物理.数学课程的平均分,各成绩段学 生数和比例,最高分及学生信息. 其中,分数(含平均分)都按百分制(整数处理) ,比例按浮点数处理,精确到小数点后两位.平均 分取整时按四舍五入处理,例如,74.5,四舍五入为 75.最高分可能有多个.(要求,分别建立班级类 ,课程类.班级类包含所有学生信息,课程类实例为 物理

运行错误-求c语言大神帮忙看看哪里出错了

问题描述 求c语言大神帮忙看看哪里出错了 #include #include #include struct course { int num; //选题编号 char name[20];//课题名称 char kind[10];//课程性质 int taltime,ttime,etime,mark,term;//课程时间,学分,开课信息 }; struct student { int snum; //学生学号 int cnum; //所选课题编号 char cname[20];//所选课题名称

c-求助C语言大神! 二叉排序树

问题描述 求助C语言大神! 二叉排序树 求用C实现:输入初始关键字序列,构造一个二叉排序树. 谢谢!不用C++ 解决方案 // 二叉树_C.cpp : 定义控制台应用程序的入口点.//#include ""stdafx.h""#include ""malloc.h""#define MAX 1240typedef struct bitnode{ char data; struct bitnode *lchild*rchild;

不用控件显示数据-求助各位大神,如何不用控件来显示数据库的中的数据

问题描述 求助各位大神,如何不用控件来显示数据库的中的数据 在线等 急!!! 谢谢了 解决方案 你这里不要用++,缺少数据字符串没有实现++,所以报错采纳的话可以详细写给你.不过你要贴文本形式的代码,而不是图片. 解决方案二: sb.Append(""<table>""); sb.Append(""<th>""); for (int i = 0; i < ds.Tables[0].Columns.

指针-@C语言大神,这程序谭浩强给的答案看不懂,求解释?

问题描述 @C语言大神,这程序谭浩强给的答案看不懂,求解释? //题目:输出字符串里数字团,以及个数.比如89cy129//就输出89,129,一共2个数.// 问题:后面一大段为啥要复制粘贴前面一大段的代码?//有什么用?求解释.而且运行也不对,求修改!跪谢! include int main() { char str[80],*pstr; int m,i=0,j=0,k=0,digit=0,ndigit=0,e10,a[80],*pa; pstr=&str[0];pa=&a[0]; g

c语言-求问C语言大神,帮忙看一下这道题~~

问题描述 求问C语言大神,帮忙看一下这道题~~ 分离单词 Description 编写程序以字符串为单位,以空格或标点符号(字符串中仅含英文逗号','或小数点'.'作为标点符号)作为分隔符,对字符串中所有单词进行倒排,然后把已处理的字符串(应不含标点符号)打印出来. Input 输入一个字符串(包含大小写字母.空格.逗号或小数点) Output 输出处理后的字符串. Sample Input I am a student. I like study. Sample Output study li

c语言-求大神帮忙 数据结构课程设计怎么做都运行不不起来,下周就要交了,拜托拜托T^T

问题描述 求大神帮忙 数据结构课程设计怎么做都运行不不起来,下周就要交了,拜托拜托T^T 输入文件中含有待格式化(或成为待排版)的文本,由多行文字组成.每一行由一系列被一个或多个空格符所隔开的字所组成,任何完整的字都没被分隔在两行,每行字数不超过80.除了上述文本类字符外,还存在起控制作用的字符:符号"@"指示它后面的正文在格式化时应另起一段排放,即空一行,并在段首缩入8个字符位置."@"自成一个字,一个文本格式化程序可以处理上述输入文件,按照用户指定的版面规格重排

求助各位大神,如何不用控件读取dataset中的值

问题描述 求助各位大神,如何不用控件读取dataset中的值 各位大神 如何不用控件把dataset表中的值动态循环呈现在页面上 请各位大神赐教 ~~~~ 解决方案 dataset.tables[0].rows[行][列]就可以读取了for循环换成你的下标就可以 解决方案二: 你应该学习一下asp.net mvc.http://blog.csdn.net/chinacsharper/article/details/43927025 解决方案三: 把你的代码以文本的形式贴出来并且采纳我的回答,我可

java中为什么用final修饰了引用类型,但还是能修改对象,请大神解答下哈

问题描述 java中为什么用final修饰了引用类型,但还是能修改对象,请大神解答下哈 class Person{ String name; int age; Person(){} Person(String name,int age){ this.name=name; this.age=age; } public void ShowInfo(){ System.out.println("姓名:"+this.name+"年龄:"+this.age); } } pub