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);
}
运行结果