飞道的博客

20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises12

496人阅读  评论(0)

20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises13

P701


/*
  编写一程序P701.C实现以下功能
  从键盘读入10个数存放在一个数组中,要求用户由小到大输入。
    如果发现读入的某个数不是由小到大,则该数输入无效,继续读入后面的输入数据。
    再将这10个数依次输出到屏幕上,要求每个数的输出宽度为5、不足5位的在其左边补上空格、数与数之间使用逗号(,)分隔。
    然后输入一个数,要求找出该数是数组中第几个(序号从1开始计算)元素的值,如果该数不在数组中,则输出“Not Find!”。
  编程可用素材:
        printf("please input 10 numbers: ");
        printf("input the num to look for: ");
        printf("\nthe position of … is …\n"…);
        printf("\nNot Find!\n");
  程序的运行效果应类似地如图1、图2和图3所示,
    图1中的1 2 9 10 20 30 80 90 100 101和80、
    图2中的1 2 9 10 20 30 80 90 100 101和70、
    图3中的1 2 9 10 20 30 80 90 72 68 100 101和100是从键盘输入的内容。

please input 10 numbers: 1 2 9 10 20 30 80 90 100 101
    1,    2,    9,   10,   20,   30,   80,   90,  100,  101
input the num to look for: 80

the position of 80 is 7
图1 程序运行效果示例01

please input 10 numbers: 1 2 9 10 20 30 80 90 100 101
    1,    2,    9,   10,   20,   30,   80,   90,  100,  101
input the num to look for: 70

Not Find!
图2 程序运行效果示例02

please input 10 numbers: 1 2 9 10 20 30 80 90 72 68 100 101
    1,    2,    9,   10,   20,   30,   80,   90,  100,  101
input the num to look for: 100

the position of 100 is 9
图3 程序运行效果示例03 


*/

#include <stdio.h>
#define N 10

int main(void)
{
    int arr[N];
    int data;
    int i;
    int count;

    // 读入10个数存放在一个数组
    printf("please input 10 numbers: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &arr[i]);
        // 某个数不是由小到大,则该数输入无效,继续读入后面的输入数据
        if(i >= 1)
        {
            // 在第2个数开始,都要和之前的数比较,如果小就丢弃重新输入
            while( arr[i] < arr[i-1])
            {
                scanf("%d", &arr[i]);
            }
        }
    }

    // 输出 输出宽度为5、不足5位的在其左边补上空格、数与数之间使用逗号(,)分隔
    for (i = 0; i < N - 1; i++)
    {
        printf("%5d,", arr[i]);
    }
    printf("%5d\n", arr[N - 1]);    

    // 输入一个数
    printf("\ninput the num to look for: ");
    scanf("%d", &data);

    // 要求找出该数是数组中第几个(序号从1开始计算)元素的值
    count = 0;
    for(i = 0; i < N; i++)
    {
        if (data == arr[i])
        {
            count = i + 1;
            break;
        }
    }
    //~~if(count==0 || count ==N)~~ // 这里,测试数据中,刚好是最后一个数时,就会出错,有一个学生提出了,见评论区。
    if(count==0)
    {
        printf("\nNot Find!\n");    
    }
    else
    {
        printf("\nthe position of %d is %d\n", data, count);

    }
    

    return 0;
}

P718

/*
  编写一程序P718.C实现以下功能
  有一递推数列,满足f(0)=0,f(1)=1,f(2)=2,  f(n+1)=2f(n)+f(n-1)f(n-2) (n>=2), 编写程序求f(n)的值(n由键盘输入,13>=n>=2)。
    编程可用素材:
        printf("Input n (13>=n>=2): ");
        printf("\nf(…)=…\n"…);
  程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。

Input n (13>=n>=2): 10

f(10)=1819456
图1 程序运行效果示例
*/

#include <stdio.h>

double f(int n);

int main(void)
{
    int n;
    double result;

    printf("Input n (13>=n>=2): ");
    scanf("%d", &n);

    result = f(n);
    printf("\nf(%d)=%.0lf\n", n, result);

    return 0;
}

/* 
    直接使用递归方式,实现递推数列,满足
        f(0)=0,
        f(1)=1,
        f(2)=2,  
        f(n+1)=2f(n)+f(n-1)f(n-2) (n>=2)
            注意,这里的跨度:n,n-1,n-2,n-3四级递推式
 */
double f(int n)
{
    if(n==0)
        return 0;
    else if(n==1)
        return 1;
    else if(n==2)
        return 2;
    else
        // f(n+1)=2f(n)+f(n-1)f(n-2) (n>=2)
        return 2.0 * f(n - 1) + f(n - 2) * f(n - 3);
}

P739

/*
  编写一程序P739.C实现以下功能
  从键盘输入年月日日期,计算出该日期是公元纪年以来的第几天。
    注:判断年份是否为闰年的方法——为400的倍数为闰年,如2000年;若非100的倍数,而是4的倍数,为闰年,如1996年。
    编程可用素材:
        printf("input a data(year-month-day):");
        printf("\nThe result is ....\n"...);
  程序的运行效果应类似地如图1所示,图1中的2009-10-1是从键盘输入的内容。
input a data(year-mont-day):2009-10-1
The result is 733681.
图1 程序运行效果示例


思路:
    1. 整年,直接使用365或是366天,注意闫年
    2. 当年,计月份,具体月份具体计算,注意二月,所以上面的年份,只能计到前一年
    3. 当天,是计天数,该月的第几天,所以,上面的月份,只能计到前一个月
*/

#include <stdio.h>

int isLeapYear(int year);

int main(void)
{
    int year, month, day;
    int totalDays = 0;
    int i;

    // 输入的year要>=1才是有效的,因为公元元年即公元1年
    printf("input a data(year-month-day):");
    scanf("%d-%d-%d", &year, &month, &day);

    // 求之前年的所有天 公元纪年以来的第几天
    // 常识:
    //      公元元年采用是公元纪年法,它以耶稣诞生之年作为纪年的开始,即公元1年。
    //      之前的年份一般称为公元前。在中国这一年正好是西汉平帝元始元年。
    // 注意,公元元年,即第0年,不能计算,只能从第1年开始,才可以计前一年的天数
    for (i = 1; i < year; i++)
    {
        if (isLeapYear(i))
        {
            totalDays += 366;
        }
        else
        {
            totalDays += 365;
        }
    }
    // 当年到当日的天数
    switch (month - 1)
    {
    case 11:
        totalDays += 30;
    case 10:
        totalDays += 31;
    case 9:
        totalDays += 30;
    case 8:
        totalDays += 31;
    case 7:
        totalDays += 31;
    case 6:
        totalDays += 30;
    case 5:
        totalDays += 31;
    case 4:
        totalDays += 30;
    case 3:
        totalDays += 31;
    case 2:
        if (isLeapYear(year))
        {
            totalDays += 29;
        }
        else
        {
            totalDays += 28;
        }
    case 1:
        totalDays += 31;
    default:
        break;
    }
    // 加上天
    totalDays += day;

    printf("\nThe result is %d\n", totalDays);

    return 0;
}

int isLeapYear(int year)
{
    return year % (year % 100 ? 4 : 400) ? 0 : 1;
}

P831

/*
  编写一程序P831.C实现以下功能
  某班有40位同学参加考试,成绩(整数)从键盘输入,求全班最高分、最低分以及平均分,并统计该班同学的考试及格率。
    编程可用素材:
        printf("请输入40位同学的成绩:");
        printf("\n最高分:…最低分:…平均分:…及格率:);
  程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。

请输入40位同学的成绩:99 81 71 81 77 94 100 67 66 44 75 49 47 45 65 74 73 74 63
69 72 77 65 79 84 73 46 62 68 42 75 62 65 66 62 69 44 62 84 77

最高分:100
最低分:42
平均分:68.7
及格率:83%
图1 程序运行效果示例
*/

#include <stdio.h>

#define N 40

/* 
    自行完成四舍五入的取整运算函数
 */
int double2Int(double a);

int main(void)
{
    int score[N]; // 40位同学参加考试,成绩(整数)
    int i;
    // 最高分 最低分 平均分 考试及格率
    int max, min, beyond60 = 0;
    double total, avg, rate;

    printf("请输入40位同学的成绩:");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &score[i]);
    }
    // 第一个人的成绩,初始化各种数据
    max = min = score[0];
    total = score[0];
    if (score[0] > 60)
    {
        beyond60++;
    }
    // 从第二个人开始处理
    for (i = 1; i < N; i++)
    {
        total += score[i];
        if (max < score[i])
        {
            max = score[i];
        }
        if (min > score[i])
        {
            min = score[i];
        }
        if (score[i] >= 60)
        {
            beyond60++;
        }
    }
    avg = total / N;                // 平均分
    rate = (double)beyond60 / N;    // 及格率

    // 求全班最高分、最低分以及平均分,并统计该班同学的考试及格率
    // 输出
    // 最高分:100
    // 最低分:42
    // 平均分:68.7
    // 及格率:83%
    printf("\n最高分:%d\n最低分:%d\n平均分:%.1lf\n及格率:%d%%", max, min, avg, double2Int(rate * 100));
    return 0;
}

/* 
    四舍五入完成
 */
int double2Int(double a)
{
    int tmp;
    // 取小数点后的第一位来判断四还是五
    tmp = (int)(a * 10) % 10;
    if(tmp>=5)
    {
        return (int)(a) + 1;
    }
    else
    {
        return (int)(a);
    }
}

/* 
关于C语言的取整的讨论
    1. int i = 2.5; 或 i = (int) 2.5;    这种方法采用的是舍去小数部分
    2. 使用floor函数。floor(x)返回的是x的整数部分。如:    floor(2.5) = 2    floor(-2.5) = -3    
    3. 使用ceil函数。ceil(x)返回的是不大于x的最小整数。如:    ceil(2.5) = 2    ceil(-2.5) = -2    
            floor和ceil对于正数没有区别,但是对于负数结果不同。
                floor()是向负无穷大舍入,floor(-2.5) = -3   【即,向下,地板取整】
                ceil()是向正无穷大舍入,ceil(-2.5) = -2     【即,向上,天花板取整】
    4. round(x)返回x的四舍五入整数值

    本题,应该四舍五入取整更符合常理
 */

P740

/*
  编写一程序P740.C实现以下功能
  公鸡每只5元,母鸡每只3元,小鸡每3只1元,用M元钱买N只鸡,问公鸡、母鸡、小鸡各几只。
    编程可用素材:
        printf("Input the money: ");
        printf("Input the number: ");
        printf("\n  cock   hen chick\n");
  程序的运行效果应类似地如图1和图2所示,图中的红色部分是从键盘输入的内容。

Input the money: 100
Input the number: 100

  cock   hen chick
     0    25    75
     4    18    78
     8    11    81
    12     4    84
图1 程序运行效果示例

Input the money: 80
Input the number: 90

  cock   hen chick
     1    17    72
     5    10    75
     9     3    78
图2 程序运行效果示例
*/

#include <stdio.h>

void printResult(int money, int count);     // 声明函数

int main(void)
{
    int money, count;

    printf("Input the money: ");
    scanf("%d", &money);

    printf("Input the number: ");
    scanf("%d", &count);

    printf("\n  cock   hen chick\n");
    printResult(money, count);      // 调用函数

    return 0;
}

/* 
    直接实现M钱C鸡的功能函数
 */
void printResult(int money, int count)
{
    int cock, hen, chick;
    for (cock = 0; cock <= money / 5; cock++)
    {
        for (hen = 0; hen <= money / 3; hen++)
        {
            /* 
                要特别注意,chick可能出现负值的情况,这里的负数是没有实际意义的
             */
            chick = count - cock - hen;
            if (cock * 5 + hen * 3 + (double)chick / 3.0 == money && chick >= 0)
            {
                printf("%6d%6d%6d\n", cock, hen, chick);
            }
        }
    }
}

P741

/*
  编写一程序P741.C实现以下功能
  输入两个整数m和n,输出大于等于m(m>5)的n个素数,输出的各素数间以空格相隔。
    注:素数(Prime Number),亦称质数,指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
  编程可用素材:
        printf("Input the m, n: ");
        printf("\nThe result:\n");
  程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。

Input the m, n: 17, 5

The result:
17 19 23 29 31
图1 程序运行效果示例
*/

#include <stdio.h>
#include <math.h>

int isPrime(int m);

int main(void)
{
    int m, n;
    int count = 0;

    printf("Input the m, n: ");
    scanf("%d, %d", &m, &n);

    printf("\nThe result:\n");
    do
    {
        if(isPrime(m))
        {
            count++;
            printf("%d ", m);   // 是素数,则计数,并输出
            if(count == n)
            {
                break;
            }
        }
    } while (m++);

    return 0;
}

/* 
    判断是否素数
    只要有了约数,就一定不是素数,直接回返0,即否定
    算到了最后,就返回1,即肯定是素数
 */
int isPrime(int m)
{
    int i;
    for (i = 2; i <= (int)sqrt(m); i++)
    {
        if(m%i==0)
        {
            return 0;
        }
    }
    return 1;
}

转载:https://blog.csdn.net/matrixbbs/article/details/109512150
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场