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

Posted weixin_35827498

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四周《C语言及程序设计》实践项目2 模块化程序设计及C语言中的函数相关的知识,希望对你有一定的参考价值。

【项目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;  
  
运行结果


心得

...累死了,还是有一些小问题,这我要做大程序要咋办呀。。。

以上是关于第四周《C语言及程序设计》实践项目2 模块化程序设计及C语言中的函数的主要内容,如果未能解决你的问题,请参考以下文章

第四周《C语言及程序设计》实践项目37 操作字符串数组

第四周《C语言及程序设计》实践项目5 认识递归

第四周《C语言及程序设计》实践项目5 认识递归

第四周《C语言及程序设计》实践项目43 从文本文件中读入数据

第四周《C语言及程序设计》实践项目39 问题求解——求素数

第四周《C语言及程序设计》实践项目11 体验结构体