您的位置:首页 > 编程语言 > C语言/C++

第四周《C语言及程序设计》实践项目2 模块化程序设计及C语言中的函数

2016-09-03 17:14 741 查看
【项目1-函数版星号图】

/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目1-函数版星号图】.cpp
* 作    者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
* 问题描述:根据main函数中对printchs函数的调用,以及printchs的功能要求,编写printchs函数,使下面的程序能输出
*/
//调用函数printchs输出星号图
#include <stdio.h>
//在下面写printchs函数的定义,功能是输出一行若干个指定字符
void printchs(int n,char ch)
{
int a;
for(a=1;a<=n;a++)
printf("%c",ch);
}

int main( )
{
int n=6; //n代表要输出的行数
int i;
//通过在下面的循环里调用printchs函数,输出右面的图
for(i=1; i<=n; ++i)
{
printchs(n-i,' ');
printchs(2*i-1,'A'+i-1) ;
printf("\n");
}
return 0;
}
运行结果



【项目2-求解分段函数的值】

/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目2-求解分段函数的值】.cpp
* 作    者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
*/
#include<stdio.h>
#define x1 0.3
#define x2 0.8//将x1和x2定义为符号常量,好维护 ,看起来也舒服
double f(double);     //这一句是对自定义函数f的声明
int main( )
{
double x;
printf("请输入x的值:");
scanf("%lf", &x);
printf("解得:f(%.2f)=%.2f\n", x, f(x));  //调用函数f求解
return 0;
}
double f(double x)
{
double y;
if(x<x1)
y=0;
else if(x>=x1&&x<=x2)
y=(x-x1)/(x2-x1);
else
y=1;

return y;
}
//一个是返回值的使用,不能用printf("0"),灵活的使用返回值很重要
//一个是在自定义函数中使用了小数,避免使用小数,就需要在开头使用define


运行结果



【项目3-求最大公约数】

/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目3-求最大公约数】.cpp
* 作    者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
* 问题描述:(1)输入两个数,并求出其最大公约数。请写出求最大公约数的函数
*/
#include <stdio.h>
//int gcd(int x,int y) //定义用于求两数的最大公约数的函数,函数只管求值,不管输出。输出由main完成
int gcd(int x,int y)//其实用辗转相除法更为简洁
{
int i,max;
for(i=1;i<x;++i)
{
if(x%i==0&&y%i==0)
max=i;
}
return max;
}
int main()
{
int a,b,g;
scanf("%d %d", &a, &b);
g=gcd(a,b);
printf("最大公约数是:%d\n", g);
return 0;
}
运行结果



【项目3-求最大公约数】

#include <stdio.h>
/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目3-求最大公约数】.cpp
* 作    者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
* 问题描述:(2)在上面程序基础上,增加函数gcds函数的声明和定义,实现求4数最大公约数的功能
*/
//int gcd(int x,int y) //定义用于求两数的最大公约数的函数,函数只管求值,不管输出。输出由main完成
int gcd(int x,int y)//其实用辗转相除法更为简洁
{
int i,max;
for(i=1;i<x;++i)
{
if(x%i==0&&y%i==0)
max=i;
}
return max;
}
int gcds(int x,int y,int z,int w)
{
int a,b;
int i,max;
a=gcd(x,y);
b=gcd(z,w);
for(i=1;i<a;++i)
{
if(a%i==0&&b%i==0)
max=i;
}
return max;
}
int main()
{
int a,b,z,w,g;
scanf("%d %d %d %d", &a, &b,&z,&w);
g = gcds(a,b,z,w);  //最好不要先看提示,没有挑战性
printf("最大公约数是:%d\n", g);
return 0;
}
运行结果



【项目4-求阶乘函数】

/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目4-求阶乘函数】.cpp
* 作 者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
* 问题描述:(1)请输出满足条件n=a!+b!+c!的所有三位数n,其中,a、b、c分别是n的百、十、个位数。要求用自定义函数实现求阶乘。
*/
#include<stdio.h>
int fac(int n);
int main()
{
int i,a,b,c,sum;
for(i=1;i<1000;++i)
{
a=i%10;
b=(i/10)%10;//没有想到怎么处理好b!,以前好像就是一个一个套的,很麻烦,现在用了函数方便多了,函数适合做重复的事,看起来也舒服
c=i/100;
sum=fac(a)+fac(b)+fac(c);
if(sum==i)
printf("%d",sum);
}

return 0;

}
int fac(int n)//求n得阶乘
{
int i, sum = 1;
for(i=1;i<=n;++i)
{
sum*=i;
}
return sum;

}

运行结果



【项目4-求阶乘函数】(2)

/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目4-求阶乘函数】.cpp
* 作 者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
* 问题描述:(2)求组合数:求组合数公式为:

编一程序,输入m和n的值,求组合数。要求分别定义求阶乘和求组合的函数,求组合数的函数调用求阶乘的函数来实现求解,在main()函数中,负责输入输出及调用求组合数的函数。
*/
#include<stdio.h>
int fact(int a);
int main()
{
int n,m,sum;
printf("请输入m和n的数值: ");
scanf("%d %d",&n,&m);//没有判断M和n的大小关系
if(m>=n)
{
sum=fact(m)/(fact(n)*fact(m-n));
printf("%d\n",sum);
}
else
printf("m应该不小于n\n");

return 0;
}
int fact(int a)
{
int sum=1,i;//忘记了把sum初始化,输出来的就是 1.#IF00,乱码。。。
for(i=1;i<=a;++i)
sum*=i;

return sum;
}
//设计的时候忘记了m应该不小于n

运行结果



【项目5-当年第几天】

/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目5-当年第几天】.cpp
* 作 者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
* 问题描述:定义一个函数,其参数为年、月、日的值,返回这一天为该年的第几天。要求在main函数中输入年月日,然后调用这个函数求值,并在main函数中输出结果。
*/
#include<stdio.h>
int days(int y, int m, int d);
int main()
{
int year, month, day;
printf("输入年 月 日: ");
scanf("%d %d %d", &year, &month, &day);
printf("这是该年的第 %d 天\n", days(year, month, day));
return 0;
}

int days(int y, int m, int d)//完全没有想到m的运用
{
int sum,i;
for(i=1;i<=m;++i)//switch好长时间没有使用了
{
switch(i)
{
case 2:
sum+=((y%4==0&&y%100!=0)||y%400==0)?29:28;//这个算法的使用蛮过瘾的,判断是否为闰年
break;
case 4:
case 6:
case 9:
case 11:
sum+=30;
break;
default://开始我还准备傻傻的继续往下写
sum+=31;
break;
}
}
return sum;
}

运行结果



【项目6-回文、素数】

/*
* Copyright (c) 2016, CSDN学院
* All rights reserved.
* 文件名称:【项目6-回文、素数】.cpp
* 作 者:张易安
* 完成日期:2016年 9 月 3 日
* 版 本 号:v1.0
*
* 问题描述:((4)编制main函数,调用上面定义的3个函数,完成
* 输出1000以内的所有素数。
* 输出1000以内的所有回文数。
* 输出1000以内的所有回文素数。
* 若一个素数的反序数仍为素数,则称它为可逆素数。求10000以内的所有可逆素数。
*/
//第一次感觉做了一个大的程序:-D
#include<stdio.h>
#include<math.h>
int isPalindrome(int);
int reverse(int);
int isPrime(int);
int main()
{
int m;
printf("(1)输出1000以内的所有素数\n");
for(m=2;m<1000;++m)
{
if(isPrime(m))
printf("%d\t", m);
}
printf("\n\n");
printf("(2)输出1000以内的所有回文数\n");
for(m=2;m<1000;++m)
{
if(isPalindrome(m))
printf("%d\t", m);
}
printf("\n\n");
printf("(3)输出1000以内的所有回文素数\n");
for(m=2;m<1000;++m)
{
if(isPalindrome(m)&&isPrime(m))
printf("%d\t", m);
}
printf("\n\n");
printf("(4)求1000以内的所有可逆素数\n");
for(m=2;m<1000;++m)
{
if(isPrime(m)&&isPrime(reverse(m)))
printf("%d\t", m);
}
printf("\n\n");
return 0;
}
int reverse(int x) //函数只管求值,不管输出。输出由main函数完成
{
int sum,b;
sum=0;
while(x>0)//想了半天,就只是想用for循环,应该用while循环判断
{
sum=sum*10+b%10;
x=x/10;
}
return sum;
}
int isPalindrome(int n) //在这个函数中只管判断,不能出现printf语句!
{
int sum,m;
sum=0;
m=n;
while(m>0)
{
sum=sum*10+m%10;
m=m/10;
}
if(n==sum)
return sum;
else
return 0;
}
int isPrime(int n)
{
int prime=1;
int k=(int)(sqrt(n));
int i;
for(i=2; i<=k; i++)
{
if(n%i==0)
{
prime=0;
break;
}
}
return prime;
} 运行结果



心得

...累死了,还是有一些小问题,这我要做大程序要咋办呀。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐