C语言实验题目[01]

  1. 编程计算存款利息。有1000元,想存5年,可按以下5种办法存:
    (1) 一次存5年期。
    (2) 先存2年期,到期后将本息再存3年期。
    (3) 先存3年期,到期后将本息再存2年期。
    (4) 存1年期,到期后将本息再存1年期,连续存5次。
    (5) 存活期存款,活期利息每一季度结算一次。

假设银行存款利息如下:
1年期定期存款利息为1.5%;
2年期定期存款利息为2.1%;
3年期定期存款利息为2.75%;
5年期定期存款利息为3%;
活期存款利息为0.35% (活期存款每一季度结算一次利息)。

计算方法如下:
如果r为年利率,n为存款年数,则计算本息和的公式为
1年期本息和:P = 1000 * (1+r);
n年期本息和:P = 1000 * (1+n*r);
存n次1年期的本息和:P = 1000 * (1+r)n;
活期存款本息和:P = 1000 * (1+r/4)4n。

:1000 * (1+r/4)是一个季度的本息和。
提示:math.h函数库中有pow函数,例如pow(3.6, 2)就表示3.62。

//author:祁山何小喵  
//time:2020.03.28  
//task:计算各种存款方式所得的利息  
#include   
#include   
#define Principal 1000  //本金1000元  
int main()  
{  
    float p1, p2, p3, p4, p5;  
    p1 = Principal * (1 + 5 * 0.03) - Principal;  //5年期,利率为3%  
    p2 = Principal * (1 + 2 * 0.021) * (1 + 3 * 0.0275) - Principal;  //先存2年(利率2.1%),到期本息再存3年(利率2.75%)  
    p3 = Principal * (1 + 3 * 0.0275) * (1 + 2 * 0.021) - Principal;  //先存3年(利率2.75%),到期本息再存2年(利率2.1%)  
    p4 = Principal * pow((1 + 0.015), 5) - Principal;  //存1年期(利率1.5%),到期后将本息再存1年期,连续存5次  
    p5 = Principal * pow((1 + 0.0035 / 4), 4 * 5) - Principal;  //存活期存款(利率0.35%)  
    printf("存5年期所得的利息是%.2f元\n", p1);  
    printf("先存2年,到期本息再存3年所得的利息是%.2f元\n", p2);  
    printf("先存3年,到期本息再存2年所得的利息是%.2f元\n", p3);  
    printf("存1年期,到期后将本息再存1年期,连续存5次所得的利息是%.2f元\n", p4);  
    printf("存活期存款所得的利息是%.2f元\n", p5);  
    return 0;  
} 
  1. 购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,编程计算多少月能还清。设d为300000元,p为6000元,r为1%。对求得的结果取小数点后一位,对第2位按四舍五入处理。
    计算还清月数m的公式如下:
    lg ⁡ p − lg ⁡ ( p − d ∗ r ) lg ⁡ ( 1 + r ) \frac{\lg{p}-\lg{(p-d*r)}}{\lg{(1+r)}} lg(1+r)lgplg(pdr)
    或改写为
    lg ⁡ p p − d ∗ r lg ⁡ ( 1 + r ) \frac{\lg{\frac{p}{p-d*r}}}{\lg{(1+r)}} lg(1+r)lgpdrp
    提示:math.h函数库中有log10函数求以10为底的对数,
    例如log10(7)就表示log7。
//author:祁山何小喵 
//time:2020.03.28  
//task:计算还清贷款所需月数  
#include   
#include   
int main()  
{  
    int d = 300000, p = 6000;   //贷款金额为300000元,每月还款6000元  
    float m, r = 0.001;        //月利率为1%,需要m月才能还清  
    m = log10(p / (p - d * r)) / log10(1 + r);  
    printf("还清月数为%.1f", m);  
    return 0;  
}
  1. 输入一个不多于5位的正整数,要求:
    (1) 求出它是几位数;
    (2) 分别输出每一位数字;
    (3) 按逆序输出各位数字,例如原数为321,应输出123。
//author:祁山何小喵  
//time:2020.04.12  
//task:输入一个整数,求其位数;输出其每个数字;将其逆序输出  
#include  
int number(int p);        //自定义函数number的声明,返回值类型为int;  
void printnumber(int p);  //自定义函数printnumber的声明,无返回值;  
void reverse01(int p);    //自定义函数reverse01的声明,无返回值;  
int main(void)            //主函数;  
{  
    int p;  
    printf("请输入一个不多于5位的整数:");  
    scanf_s("%5d", &p);    //输入不多于5位的整数p;  
    printf("输入的整数是%d位数。\n", number(p));   //调用函数number,并输出返回值;  
    printf("从最低位到最高位依次是:");  
    printnumber(p);       //调用函数printnumber;  
    printf("\n%d的逆序输出为:",p);  
    reverse01(p);         //调用函数reverse01;  
  
    return 0;  
}  
  
//定义函数number,求出输入整数的位数  
int number(int p)  
{  
    int count = 0;  //count用来累计p除以10的整数商大于0的次数,即该整数的位数;  
    while (p > 0)  
    {  
        p /= 10;  
        count++;  
    }  
    return count;  
}  
  
//定义printnumber函数,求出输入整数的每一位数字  
void printnumber(int p)  
{  
    int temp;       
    while (p > 0)  
    {  
        temp = p % 10;  //temp用来存放p除以10的余数,即该整数的最低位;  
        p /= 10;  
        printf("%d ", temp);  
    }  
}  
  
//定义reverse函数,将输入的整数逆序输出  
void reverse01(int p)  
{  
    while (p > 0)  
    {  
        printf("%d", p % 10);   //p%10的作用同上一个函数中的temp;  
        p /= 10;  
    }  
} 
  1. 企业根据利润发放奖金。利润I低于或等于100000元的,奖金按10%提成;利润高于100000元、低于200000元(1000001000000时,高于1000000元的部分按1%提成。编程时输入当月利润I,求应发奖金总数。

要求:
(1) 用if语句编程序
(2) 用switch语句编程序

//author:祁山何小喵 
//time:2020.04.12  
//task:输入当月利润,分别用if、switch语句求出应发奖金总数  
#include  
void bonus01(float I);    //声明bonus01函数,无返回值  
void bonus02(float I);    //声明bonus02函数,无返回值  
int main()                //主函数  
{  
    float I;  
    printf("请输入当月利润(单位:元):");  
    scanf_s("%f", &I);  
    printf("(if语句)应发奖金总数为");  
    bonus01(I);           //调用bonus01函数  
    printf("\n(switch语句)应发奖金总数为");  
    bonus02(I);           //调用bonus02函数  
  
    return 0;  
}  
  
//定义bonus01函数,输入当月利润,用if语句,求出应发奖金总数  
void bonus01(float I)    
{  
    float p;              //p为奖金总数  
  
    if (I <= 100000)  
    {  
        p = I * 0.1;  
    }  
    else if (100000 < I && I <= 200000)  
    {  
        p = 100000 * 0.1 + (I - 100000) * 0.075;  
    }  
    else if (200000 < I && I <= 400000)  
    {  
        p = 100000 * 0.1 + 100000 * 0.075 + (I - 200000) * 0.05;  
    }  
    else if (400000 < I && I <= 600000)  
    {  
        p = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (I - 400000) * 0.03;  
    }  
    else if (600000 < I && I <= 1000000)  
    {  
        p = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (I - 600000) * 0.015;  
    }  
    else if (I > 1000000)  
    {  
        p = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (I - 1000000) * 0.01;  
    }  
    printf("%.2f元", p);       //输出奖金总数,保留两位小数  
}  
  
//定义bonus02函数,输入当月利润,用switch语句,求出应发奖金总数  
void bonus02(float I)  
{  
    float p;                 //p为奖金总数  
    int c;                   //c为 I/100000的整数商,用来做case后的常量  
    if (I > 1000000)  c = 11;  
    else  c = I / 100000;  
  
    switch (c)  
    {  
    case 0: p = I * 0.1; break;  
    case 1: p = 100000 * 0.1 + (I - 100000) * 0.075; break;  
    case 2:   
    case 3: p = 100000 * 0.1 + 100000 * 0.075 + (I - 200000) * 0.05; break;  
    case 4:  
    case 5: p = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (I - 400000) * 0.03; break;  
    case 6:  
    case 7:  
    case 8:  
    case 9: p = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (I - 600000) * 0.015; break;  
    case 10:  
    case 11: p = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (I - 1000000) * 0.01; break;  
    }  
    printf("%.2f元", p);             //输出奖金总数,保留两位小数  
}  
  1. ∑ n = 1 20 n ! \displaystyle\sum_{n=1}^{20} n! n=120n!(即求 1 ! + 2 ! + 3 ! + . . . + 20 ! 1!+2!+3!+...+20! 1!+2!+3!+...+20! )
//author:祁山何小喵 
//time:2020.04.23  
//task:求1-20的阶乘之和  
  
/* 20!数据太大,int类型存储不下,所以用long long int类型, 
long long int是C99标准, 为64位, 8字节长度 
*/  
  
#include  
int main()  
{  
    long long int i, h = 1, s = 0; //h=0!=1;  
    for (i = 1; i <= 20; i++)  
    {  
        h *= i;  
        s += h;  
    }  
    printf("%I64d\n", s);  //long long int的输出;  
    return 0;  
}  
  1. 输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一位水仙花数,因为 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+33.
//author:祁山何小喵  
//time:2020.04.23  
//task:求出所有水仙花数  
#include  
int main()  
{     
    int i, x, y, z;  
    for (i = 100; i < 1000; i++)  
    {  
        x = i % 10;         //个位     
        y = i / 10 % 10;      //十位     
        z = i / 100 % 10;     //百位    
        if (i == (x * x * x + y * y * y + z * z * z))  
            printf("%d\n", i);  
    }  
    return 0;  
}  

7.有一个分数序列
2 1 , 3 2 , 5 3 , 8 5 , 13 8 , 21 13 , . . . \frac{2}{1},\frac{3}{2},\frac{5}{3},\frac{8}{5},\frac{13}{8},\frac{21}{13},... 12,23,35,58,813,1321,...

求出这个数列的前20项之和.

1.	//author:祁山何小喵  
//time:2020.04.23  
//task:求一数列的前20项和  
#include    
#define n 20          //求解项数  
int main()  
{     
    int i;           //循环变量   
    double a = 2, b = 1;  //a,b分别为某项的分子、分母    
    double  sum=0;    
    double temp;     //临时变量   
    for (i = 1; i <= n; i++)  
    {  
        sum += a / b;  
        temp = a;      //记录前一项分子      
        a = a + b;       //前一项分子与分母之和为后一项分子   
        b = temp;      //前一项分子为后一项分母   
    }  
    printf("前%d项之和为:sum=%10.8f\n", n, sum);  
    return 0;  
}
  1. 一个球从100m高度落下,每次落地后反跳回原高度的一半,再落下,再反弹。求它在第10次落地时,共经过多少米,第10次反弹多高
//author:祁山何小喵 
//time:2020.04.23  
//task:求小球第10次落地经过的路程以及反弹起的高度  
#include  
float length(float h, float s);     //函数length的声明,返回值类型为float  
float height(float h);              //函数height的声明,返回值类型为float  
int main()                          //主函数  
{  
    float h = 100.0, s = 0.0;       //起始高度h,经过的路程s  
    printf("第10次落地时,共经过%f米\n", length(h, s));     //函数length的调用及输出  
    printf("第10次反弹%f米\n", height(h));                  //函数height的调用及输出  
    return 0;  
}  
  
//自定义函数length,height落地经过的总路程  
float length(float h, float s)  
{  
    s = h;  
    for (int i = 2; i <= 10; i++)  
    {  
        h /= 2;  
        s += 2 * h;  
    }  
    return s;  
}  
  
//自定义函数height,求小球第10次反弹起的高度  
float height(float h)  
{  
    for (int i = 1; i <= 10; i++)  
    {  
        h /= 2;  
    }  
    return h;  
} 
  1. 写两个函数,分别求两个整数的最大公约数和最小公倍数。在主函数中输入两个整数,输出结果
//author:祁山何小喵 
//time:2020.05.30  
//task:编写两个函数,输入两个整数,输出其最大公约数和最小公倍数  
#include  
int gcd(int a, int b);         //函数gcd的声明  
int lcm(int a, int b);         //函数lcm的声明  
int main()  
{  
    int a, b;  
    printf("请输入两个整数:");  
    scanf("%d,%d", &a, &b);  
    printf("%d和%d的最大公约数是:%d\n", a, b, gcd(a,b));  
    printf("%d和%d的最小公倍数是:%d\n", a, b, lcm(a,b));  
    return 0;  
}  
  
//定义函数gcd,求两个整数的最大公约数,算法为辗转相除法;  
int gcd(int a, int b)  
{  
    int x, y, c;  
    x = a;  
    y = b;  
    while (b != 0)  
    {  
        c = a % b;  
        a = b;  
        b = c;  
    }  
    return a;  
}  
  
//定义函数lcm,求两个整数的最小公倍数,最小公倍数=a*b/最大公约数  
int lcm(int a, int b)  
{  
    int x, y, c;  
    x = a;  
    y = b;  
    while (b != 0)  
    {  
        c = a % b;  
        a = b;  
        b = c;  
    }  
    return (x * y / a);  
}
  1. 写一个函数,使输入的一个字符串按反序存放。在主函数中输入字符串、输出结果
//author:祁山何小喵 
//time:2020.05.30  
//task:编写一个函数,反序输出字符串  
#include   
#include   
void reverse(char a[]);                      //声明reverse函数  
int main()  
{  
    char str[100];  
    printf("请输入一个字符串:\n");  
    gets_s(str);                               //输入一个字符串  
    reverse(str);                            //调用reverse函数  
    printf("反序后的字符串为:\n");  
    puts(str);                               //输出反序后的字符串  
    return 0;  
}  
//定义reverse函数  
void reverse(char a[])  
{  
    int i, j, n;  
    char t;  
    n = strlen(a);  
    for (i = 0; i < n / 2; i++)  
    {  
        t = a[i];  
        a[i] = a[n-i-1];  
        a[n-i-1] = t;  
    }  
}  
  1. 写一个函数,用“起泡法”对输入的10个字符按由小到大的顺序排序。在主函数中输入字符、输出结果。
//author:祁山何小喵 
//time:2020.05.30  
//task:编写一个函数,将输入的10个字符从小到大排序输出  
#include  
#include  
void sort(char s[]);         //声明sort函数  
int main()  
{  
    char s[11];  
    printf("请输入要比较的10个字符:\n");  
    gets_s(s);              //输入一个字符串到字符数组s[]  
    sort(s);                //调用sort函数  
    printf("从小到大排序为:\n");  
    puts(s);                //输出s[]中的字符串  
    return 0;  
}  
  
//定义sort函数,用“气泡法”对字符从小到大排序  
void sort(char s[])  
{  
    int i, j;  
    char t;  
    for (i = 0; i < 9; i++)  
    {  
        for (j = 0; j < 9 - i; j++)  
        {  
            if (s[j] > s[j + 1])  
            {  
                t = s[j];  
                s[j] = s[j + 1];  
                s[j + 1] = t;  
            }  
        }  
    }  
}

你可能感兴趣的:(C语言,数组,循环结构程序设计)