C语言实验(十三):函数(求两个任意分数和的最简形式、将正整数转换为字符串输出、某日期是该年第几天)


一、任意输入两个分数,用C语言编程求这两个分数和的最简形式。如:输入为“2/6 + 12/9 =”,输出为“5/3”; 输入为“1/4 + 3/4 =”,输出为“1”。

思路分析

1、求两个分数的和,需要知道分数求和的计算方法。先通分,再将分子相加得到结果,化简即为最终结果。
2、通过分析得,该功能的实现只需要两步:通分相加、化简。分别实现即可。
3、输出结果的时候,如果结果为整数是一种特殊情况,输出前进行判断。

实验代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b,c,d,result;
    scanf("%d/%d + %d/%d =",&a,&b,&c,&d);
    fractionadd(a,b,c,d);
    return 0;
}

int fractionadd(int a,int b,int c,int d)//分数相加函数
{
    int m,s,i;
    m = b*d;
    s = a*d + b*c;
    for (i=m;i>0;i--)
    {
        if(m%i==0 && s%i==0)
        {
            m = m/i;
            s = s/i;
        }
    }
    if(m%s==0) //判断结果是否是整数
        printf("%d",m/s);
    else
        printf("%d/%d",s,m);
}

运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


二、任意输入一个小于7位的正整数,将其转换为字符串并输出。如:输入正整数1234567,输出字符串为“1234567”。

思路分析

1、将整数转化为字符串,首先考虑从其ASCII码值入手,只需将每位数字分别加‘0’(0对应的ASCII码值为48,即48),逐位输出即可。
2、按照这个思路,每次对10取余取得最后一位数,加上48,存放到一个字符数组中去。最后打印出来,实验代码1代码如下。
3、另一种思路:在上面的代码中,先找到第一位(终止条件)然后倒序输出。由每次都执行一样的模运算想到可以使用递归实现。取模运算之后,再取模,由此先执行的是第一位的输出。实验代码2。

实验代码1
常规思路

#include <stdio.h>
#include <stdlib.h>
char *itos(int num,char* str);

int main()
{
    int t;
    char s[8]={0};
    scanf("%d",&t);
    itos(t,s);
    printf("%s",s);
    return 0;
}

char *itos(int num,char* str)
{
    int i,j;
    char tmp[8]={0};
    for(i=0;i<9;i++)
    {
        tmp[i] = num%10 + '0';
        num = num/10;
        if(num == 0)
            break;
    }

    for(j=0;i>=0;i--)
        str[j++] = tmp[i];
    str[j] = '\0';
    return str;
}

运行结果1
在这里插入图片描述
实验代码2
递归实现

#include <stdio.h>

void main() {
    int n;
    printf("Please enter a number:");
    scanf("%d", &n);
    printf("the string is ");
    if (n < 0)
    {
        printf("-");
        n = -n;
    }
    tranvers(n);
}

void tranvers(int n) { //递归法实现整数转换为字符串
    if (n / 10 != 0)
        tranvers(n / 10);
    printf("%c", n % 10 + '0');
}

运行结果2
在这里插入图片描述


三、任意输入某年某月某日,判断这一天是这一年的第几天?

1、判断某年某月某日是该年的第几天,只需将该年该日之前的天数计算出来即可。这就需要直到每个月有多少天,需要判断特殊情况二月份的天数。

2、闰年二月份有29天,平年二月份有28天,其余月份天数不会变化。计算出待测天数之前的月份中有多少天,加上本月过去的天数得到结果。

实验代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int y,m,d;
   printf("请输入日期(示例:2000.3.9)\n");
   scanf("%d.%d.%d",&y,&m,&d);
   Dijitian(y,m,d);
   return 0;
}


int Runnian(int year)//判断year年是否是闰年
{
   if (year%4 == 0 && year%100!=0 || year%400==0)
       return 1;
   else
       return 0;
}

int Dijitian(int year,int month,int day) //判断year年month月day日是这年第几天
{
   int i,s=0,n,a[13];
   if(Runnian(year))
       a[2] = 29;
   else
       a[2] = 28;

   for(i=1;i<=12;i++)
       if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
           a[i]=31;
       else if(i==4||i==6||i==9||i==11)
           a[i]=30;

   for(i=1;i<month;i++)
       s+=a[i];//这年过去的月份共多少天
   s+=day;//加上这是本月第几天
   printf("今年的第%d天\n",s);
}

运行结果
在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值