学习笔记10:程序设计基础(C)实验(函数)

【描述】
求三个整数的最大值。要求定义和调用函数:int max(intnum1, int num2, int num3),它返回num1、num2和num3中的最大值。
【输入】
输入三个整数,整数之间以空格间隔。
【输出】
输出三个整数的最大值。
【输入示例】
3 4 5
【输出示例】
5
【来源】
《程序设计基础——以C为例》第4章上机实验题2。

#include <stdio.h>
int max(int num1, int  num2, int num3);
int main(void) {
    
    
	int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
	printf("%d\n", max(a, b, c));
    return 0;
}
/* 请在下面编写max函数 */
int max(int num1, int  num2, int num3)
{
    
    
	int s;
	//num1>num2?s=num1:s=num2;
	//num3>s?s=num3:s=s;//缺少头文件
	if(num1>num2)
	{
    
    
		s=num1;
	}
	else
	{
    
    
		s=num2;
	}
	if(num3>s)
	{
    
    
		s=num3;
	}
	return s;
}

【描述】
如果四边形四条边的长度分别为a、b、c、d,一对对角之和为2α,则求其面积的公式如下:
在这里插入图片描述

其中

在这里插入图片描述

要求定义和调用函数:double computeArea(doublea, double b, double c, double d, double alpha),该函数返回任意四边形的面积。
π值为3.14159。
【输入】
输入四边形的四条边a、b、c、d和一对对角之和2α(单位为度数)
【输出】
输出对应的任意四边形面积。
【输入示例】
3 4 5 5 145
【输出示例】
16.615057
【提示】
可以使用数学库中的cos函数,单位为弧度。包含头文件<math.h>。
【来源】
《程序设计基础——以C为例》第4章上机实验题1。

#include <stdio.h>
#include <math.h>
#define PI 3.14159
double computeArea(double a, double b, double c, double d, double alpha);
int main(void) {
    
    
    double a, b, c, d, alpha;
    scanf("%lf%lf%lf%lf%lf", &a, &b, &c, &d, &alpha);
    alpha = alpha * PI / 360;
    printf("%f\n", computeArea(a, b, c, d, alpha));
    return 0;
}
/* 请在下面编写computeArea函数 */
double computeArea(double a, double b, double c, double d, double alpha)
{
    
    
    double area,p;
    p=(1.0/2)*(a+b+c+d);//1.0/2转double
    area=sqrt((p-a)*(p-b)*(p-c)*(p-d)-a*b*c*d*pow(cos(alpha),2));
    return area;
}


【描述】
求一个整数的逆序数。要求定义和调用函数:int reverse(int n),该函数返回一个整数的逆序数。
【输入】
输入一个整数。
【输出】
输出整数的逆序数。
【输入示例】
-123
【输出示例】
-321
【来源】
《程序设计基础——以C为例》第4章上机实验题3。

#include <stdio.h>
int reverse(int n);
int main() {
    
    
    int n;
    scanf("%d", &n);
    printf("%d\n", reverse(n));
    return 0;
}
/* 请在下面编写reverse */
int reverse(int n)//
{
    
    
    int c=0;
    int a,d;

    if(n>=0)
    {
    
    
        d=n;
        }
        else
        {
    
    
            d=-n;
        }
    while(d>0)
    {
    
    
        a=d%10;
        c=c*10+a;
        d/=10;//算逆序
    }
     if(n<0)
    {
    
    
            c=-c;//负数情况
        }
return c;
}


【描述】
求一个正整数各位数字之和。要求定义和调用函数:int sumDigits(int n),该函数返回一个正整数各位数字之和。
【输入】
输入一个正整数。
【输出】
输出该正整数各位数字之和。
【输入示例】
3456
【输出示例】
18

#include <stdio.h>
int sumDigits(int n);
int main() {
    
    
    int n;
    scanf("%d", &n);
    printf("%d\n", sumDigits(n));
    return 0;
}
/* 请在下面编写sumDigits函数 */
int sumDigits(int n)
{
    
    
    int a=0;
    int t;
    t=n;
    while(t>0)
    {
    
    
        a+=t%10;//取余求和
        t/=10;//除去已加的
    }
    return a;
}

【描述】
输入一个正整数,判断它是否是回文数。要求定义和调用函数:int isPalindrome(int n),如果n是回文数,该函数返回1,否则返回0。回文数是指正读和反读都相同的数。
【输入】
输入一个正整数。
【输出】
如果该正整数是回文数,输出true,否则输出false。
【输入示例】
616
【输出示例】
true
【来源】
《程序设计基础——以C为例》第4章实例学习。

#include <stdio.h>
int isPalindrome(int n);
int main() {
    
    
    int n;
    scanf("%d", &n);
    printf(isPalindrome(n) ? "true" : "false");
    return 0;
}
/* 请在下面编写isPalindrome函数 */
int isPalindrome(int n)
{
    
    
    int c=0;
    int a,d;
    d=n;
    while(d>0)//逆序操作
    {
    
    
        a=d%10;
        c=c*10+a;
        d/=10;
    }

    int m;
    if(c==n)//回文数的正序逆序都相等
    {
    
    
        m=1;
    }
    else
    {
    
    
        m=0;
    }
return m;
}

【描述】
如果一个素数可以写成在这里插入图片描述
的形式,其中p是一个正整数,那么该素数就称为梅森素数。
例如,p为2时,在这里插入图片描述
为3,3就是梅森素数。
注意:1不是素数。
要求定义和调用函数:int isPrime(int n),如果n是素数,该函数返回1,否则返回0。
【输入】
输入一个正整数n(0≤n≤31)。
【输出】
输出p≤n的梅森素数的个数。
【输入示例】
3
【输出示例】
2

#include <stdio.h>
#include <math.h>
int isPrime(int n);
int main() {
    
    
    int p, n, count = 0;
    scanf("%d", &n);
    for(p = 1; p <= n; ++p) {
    
    
    	if(isPrime(pow(2, p) - 1))
    	    ++count;
    }
    printf("%d\n", count);
    return 0;
}
/* 请在下面编写isPrime函数 */
int isPrime(int n)
{
    
    
    int c;
    int b=0;
    c=n;
    int i;
    for(i=2;i<n;i++)
    {
    
    
        if(c%i==0)//若被整除
        {
    
    
            break;
        }
    }
    if(i==n)//是素数的话,i++最后会加到n
    {
    
    
        b=1;
    }
    return b;
}

【描述】
无暇素数emirp(英文素数prime的逆序)是这样一种素数:本身为素数,且其逆序数也是素数。例如,17是素数,其逆序数71也是,因此17和71是emirp。定义和调用函数:intisPrime(int n),判断n是否是素数,如果是素数,函数返回1,否则返回0;定义和调用函数:int reverse(int n),求n的逆序数,函数返回n的逆序数,如n为17,函数reverse(n)返回71。
输出前n个emirp,每行显示5个,并适当对齐。
【输入】
输入一个正整数n。
【输出】
输出前n个emirp,每行显示5个,每个宽度为5。
【输入示例】
10
【输出示例】
在这里插入图片描述

【提示】
对于整数i,如果isPrime(i)与isPrime(reverse(i))的返回值都是1,i即为无暇素数。
【来源】
《程序设计基础——以C为例》第4章上机实验题5。

#include <stdio.h>
#include <math.h>
int isPrime(int n);
int reverse(int n);
int main(void) {
    
    
    int i, n, count = 0;
    scanf("%d", &n);
    for(i = 2; count < n; ++i) {
    
    
        if (isPrime(i) && isPrime(reverse(i))) {
    
    
            printf("%5d", i);//固定5位宽输出
            ++count;
            if(count % 5 == 0)
                printf("\n");
        }
    }
    return 0;
}
/* 请在下面分别编写isPrime函数和reverse函数 */
int isPrime(int n)
{
    
    
int i;
int b=1;
for(i=2;i<n;i++)//判断素数
{
    
    
    if(n%i==0)
    {
    
    
        b=0;
        break;
    }
}
return b;
}
int reverse(int n)
{
    
    
    int m;
    int sum=0;
    while(n>0)
    {
    
    
        sum=sum*10+n%10;//求逆序
        n/=10;
    }
    return sum;
}

【描述】
按如下公式:

在这里插入图片描述

求出数列的前n项(n≤20)并输出,要求每行输出5项。定义和调用函数:long sequence(int n),计算数列第n项的值。
【输入】
输入一个正整数n。
【输出】
输出数列的前n项。每行输出5项。每项宽度为6。
【输入示例】
20
【输出示例】
在这里插入图片描述

【来源】
《程序设计基础——以C为例》第4章上机实验题8。

#include <stdio.h>
long sequence(int n);
int main(void) {
    
    
    int i, n, count = 0;
    scanf("%d", &n);
    for(i = 0; i < n; ++i) {
    
    
        printf("%6ld", sequence(i));
        ++count;
        if(count % 5 == 0)
            printf("\n");
    }
    return 0;
}
/* 请在下面编写sequence函数 */
long sequence(int n)
{
    
    
    if(n<=2)
    {
    
    
        return n;
    }
    return sequence(n-1)+sequence(n-2)+sequence(n-3);//递归函数
}

【描述】
对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。例如,假定初始正整数为5,计算过程分别为16、8、4、2、1。要求定义和调用递归函数:guess(n),输出计算过程。
【输入】
输入一个正整数。
【输出】
从输入整数到1的步骤,每一步为一行,每一步中描述计算过程,最后一行输出“End”。如果输入为1,直接输出“End”。
【输入示例】
5
【输出示例】
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End

#include <stdio.h>
void guess(long long int n);
int main() {
    
    
    long long int n;
    scanf("%lld", &n);
    guess(n);
    return 0;
}
/* 请在下面编写guess函数 */
void guess(long long int n)
{
    
    
     if(n==1)//最后到1的时候输出end
    {
    
    
        printf("End");

    }
    else if(n%2==0)
    {
    
    
        printf("%lld/2=%lld\n",n,n/2);//按格式输出
    guess(n/2);//递归函数

    }
    else
    {
    
    
            printf("%lld*3+1=%lld\n",n,n*3+1);//经hxd提醒,已更正,long long输出要用%lld
        guess(n*3+1);
    }



    /*while(n>1)
    {
        if(n%2==0)
        {
            printf("%lld/2=%lld\n",n,n/2);//经hxd提醒已更正,long long要用%lld
            n/=2;
        }
        else
        {
            printf("%lld*3+1=%lld\n",n,n*3+1);
            n=n*3+1;
        }
    }
    printf("End\n");*/
}

奇怪了这题, istudy就是不给通过,感觉没错啊, 好气哦, 谷角猜想就是这样的吧

经hxd指正,已通过,芜湖~~


【描述】
分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
定义和调用函数:int gcd(int m, int n),求最大公约数。
【输入】
在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0)。
【输出】
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如 5/6表示6分之5。
【输入示例】
60/120
【输出示例】
1/2

#include <stdio.h>
int gcd(int m, int n);
int main(void) {
    
    
    int n, d, g;
    scanf("%d/%d", &n, &d);
    g = gcd(n, d);
    n /= g;
    d /= g;
    printf("%d/%d\n", n, d);
    return 0;
}
/* 请在下面编写gcd函数 */
int gcd(int m, int n)
{
    
    
	int min;
	int i;
	if(m<n)//找出最小值
	{
    
    
		min=m;
	}
	else
	{
    
    
		min=n;
	}
	for(i=min;i>=1;i--)//从后往前找
	{
    
    
		if(m%i==0 && n%i==0)//当两个都能整除
		{
    
    
			break;
		}
	}
	return i;
}

猜你喜欢

转载自blog.csdn.net/qq_49868778/article/details/110550030
今日推荐