第四周《C语言及程序设计》实践项目2 模块化程序设计及C语言中的函数
2016-09-03 17:14
741 查看
【项目1-函数版星号图】
【项目2-求解分段函数的值】
运行结果
【项目3-求最大公约数】
【项目3-求最大公约数】
【项目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;
} 运行结果
心得
...累死了,还是有一些小问题,这我要做大程序要咋办呀。。。
/* * 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;
} 运行结果
心得
...累死了,还是有一些小问题,这我要做大程序要咋办呀。。。
相关文章推荐
- 第四周《C语言及程序设计》实践项目7 返回指针的函数
- 第四周《C语言及程序设计》实践项目26 实现线性表基本操作的函数
- 第四周《C语言及程序设计》实践项目32 二维数组及其定义
- 第四周《C语言及程序设计》实践项目37 操作字符串数组
- 第四周《C语言及程序设计》实践项目14 开发一个电子词典
- 第四周《C语言及程序设计》实践项目22 用指针法访问数组元素
- 《C语言及程序设计》实践项目——数组与函数应用
- 《C语言及程序设计》实践项目——函数应用
- 第四周《C语言及程序设计》实践项目5 认识递归
- 第四周《C语言及程序设计》实践项目39 动态存储管理与动态数组的实现
- 第四周《C语言及程序设计》实践项目43 从文本文件中读入数据
- 第四周《C语言及程序设计》实践项目39 问题求解——求素数
- 第四周《C语言及程序设计》实践项目20 经典:查找的艺术
- 第四周《C语言及程序设计》实践项目11 体验结构体
- 第四周《C语言及程序设计》实践项目16 数组的引入
- 《C语言及程序设计》实践项目——函数起步
- 第四周《C语言及程序设计》实践项目40 问题求解方法——穷举
- 《C语言及程序设计》实践项目——用循环处理文字
- 《C语言及程序设计》实践项目——三种循环语句
- 《C语言及程序设计》实践项目——利用switch语句解决问题