《面向过程程序设计》软件1801-1803 期末练习

6-1 求一个四位数的各位数字的立方和 (6 分)
编写函数fun,函数的功能是:求一个四位数的各位数字的立方和。

函数接口定义:
int fun(int n);
其中 n是用户传入的参数。函数须返回 n 的各位数字的立方和。

裁判测试程序样例:
#include <stdio.h>
int fun(int n);
int main()
{
int k;
k=fun(1234);
printf("k=%d\n",k);
return 0;
 }


/* 请在这里填写答案 */
输出样例:
k=100
int fun(int n){
    int s = 0;
    while(n!=0){
        int k = n % 10; 
        s = s + k * k * k;
        n/=10;

    } 
    return s;


}
6-2 求主对角线元素的平方和 (6 分)
函数fun的功能是求一个3行3列主对角线元素的平方和。输入输出由主函数完成。

函数接口定义:
int fun(int a[3][3]);
其中 a 是用户传入的参数。函数须返回 a主对角线元素的平方和。

裁判测试程序样例:
#include <stdio.h>
int fun(int a[3][3]);
int main()
{
 int i,j,s,a[3][3];;
 for(i=0;i<3;i++)
   for(j=0;j<3;j++)
      scanf("%d",&a[i][j]);
 s=fun(a);
 printf("Sum=%d\n",s);
 return 0;
 }

/* 请在这里填写答案 */
输入样例:
1 2 3 4 5 6 7 8 9


### 输出样例:
```out
Sum=107
作者: 王跃萍
单位: 东北石油大学
时间限制: 400 ms
内存限制: 64 MB
int fun(int a[3][3]){
    int s = 0;
    for(int i = 0; i < 3; i++){
        s = s + a[i][i] * a[i][i];
    } 

   // printf("### 输出样例:\n```out\n");
    return s;
}
6-3 三整数排序(升序)* (6 分)
请编写函数,对三个整数进行排序。

函数原型
// 三整数排序(升序)
void IntSort3(int *x, int *y, int *z);
说明:参数 x、y 和 z 为指示三个整数的指针,函数值对这三个整数进行排序,使 x、y 和 z 所指变量值按由小到大的顺序排列。

裁判程序
#include <stdio.h>

// 交换整数
void IntSwap(int *x, int *y);
// 三整数排序
void IntSort3(int *x, int *y, int *z);

int main()
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    IntSort3(&a, &b, &c);
    printf("%d %d %d\n", a, b, c);
    return 0;
}

// 交换整数
void IntSwap(int *x, int *y)
{
    ...(略)...
}

/* 你提交的代码将被嵌在这里 */
输入样例
15 36 -27
输出样例
-27 15 36
要求:调用 IntSwap 函数交换两个整数的值。
void IntSort3(int *x, int *y, int *z){
    if(*x>*y){
        IntSwap(x,y);
    }
    if(*x>*z){
        IntSwap(x,z);
    }
    if(*y>*z){
        IntSwap(y,z);
    }
}

由于没给出交换的函数具体内容 所以我写了  提交答案不用提交  如果有误请联系我改正

void IntSwap(int *x,int *y)
{
    int t;
    t = *x;
    *x = *y;   
    *y = t; 


}
6-4 判断数字字符* (6 分)
C语言标准函数库中包括 isdigit 函数,用于判断数字字符。作为练习,我们自己编写一个功能与之相同的函数。

请编写函数,判断数字。

函数原型
// 判断数字
int IsDigit(char x);
说明:参数 x 是任意字符的 ASCII 码。若 x 是数字字符的 ASCII 码,则函数值为 1(真),否则为 0(假)。

裁判程序
#include <stdio.h>

// 判断数字
int IsDigit(char x);

int main()
{
    char x;
    scanf(" %c", &x);
    if (IsDigit(x))
    {
        puts("Yes");
    }
    else
    {
        puts("No");
    }
    return 0;
}

/* 你提交的代码将被嵌在这里 */
输入样例1
8
输出样例1
Yes
输入样例2
W
输出样例2
No
int IsDigit(char x){
    if(x-'0'>=0&&x-'0'<10){
        return 1;
    }
    else
    return 0;

}
6-5 使用函数的选择法排序 (10 分)
本题要求实现一个用选择法对整数数组进行简单排序的函数。

函数接口定义:
void sort( int a[], int n );
其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。

裁判测试程序样例:
#include <stdio.h>
#define MAXN 10

void sort( int a[], int n );

int main()
{
    int i, n;
    int a[MAXN];

    scanf("%d", &n);
    for( i=0; i<n; i++ )
        scanf("%d", &a[i]);

    sort(a, n);

    printf("After sorted the array is:");
    for( i = 0; i < n; i++ )
        printf(" %d", a[i]);
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
4
5 1 7 6
输出样例:
After sorted the array is: 1 5 6 7
选择忘记了 直接冒泡了
void sort( int a[], int n ){
    for(int i = 0; i < n-1; i++){
        for(int j = 0; j < n-1-i; j++){
            if(a[j]>a[j+1]){
                int t = a[j];
                a[j] = a[j+1];
                a[j+1] = t; 
            }
        }
    }
}
7-1 找出总分最高的学生 (7 分)
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
#include <stdio.h>
struct {
    int num;
    char name[20];
    int a;
    int b;
    int c;
}stu[101];
int main(){
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n ;i++){
        scanf("%d %s %d %d %d",&stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
    }
    int min = 0;
    int t;
    for(int i = 0;i < n; i++){

            if(stu[i].a+stu[i].b+stu[i].c>min){
                min = stu[i].a+stu[i].b+stu[i].c;
                t = i;
            }

    }
    printf("%s %.5d %d",stu[t].name,stu[t].num,min);


    return 0;

}
7-2 结构体输出成绩最高者的信息 (10 分)
已知学生的信息包括姓名、成绩。编写程序从键盘输入5个学生的信息,输出其中成绩最高者的姓名和成绩。

输入格式:
每条信息占一行,姓名和成绩之间用空格分隔。

输出格式:
输出成绩保留1位小数。

输入样例:
aaaa 80
bbbb 95
cccc 74
dddd 65
eeee 86
输出样例:
name = bbbb, score = 95.0
#include <stdio.h>
struct {
    double num;
    char name[20];


}stu[101];
int main(){
    int n = 5;
    //scanf("%d",&n);
    for(int i = 0; i < n ;i++){
        scanf("%s %lf",stu[i].name,&stu[i].num);
    }
    double min = 0;
    int t;
    for(int i = 0;i < n; i++){

            if(stu[i].num > min){
                min = stu[i].num;
                t = i;
            }

    }
    printf("name = %s, score = %.1lf",stu[t].name,min);


    return 0;

}
7-3 求1!+2!+……+n! (10 分)
求1!+2!+3!+……+n!,n<12,要求用一重循环设计程序。

输入格式:
输入一个小于12的正整数。

输出格式:
在一行中以“m=运算结果”顺序输出,其中运算结果是一个正整数,没有任何列宽控制。

输入样例:
5
输出样例:
m=153
#include <stdio.h>
int main(){
    int n;
    int s = 0;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        int sum = 1;
        for(int j = i; j > 0; j--){
            sum *= j;
        }
        s += sum;
    }
    printf("m=%d",s);
    return 0;


}
7-4 等腰直角三角形 (10 分)
等腰直角三角形是指一个角是直角,且两条直角边相等的三角形。这里我们输出直角边长为n的等腰直角三角形的格式如下所示: 比如n=1,则输出:

*  
n=2,输出:
*
** 
n=3,输出:

*
** 
*** 
那么,你能用程序来实现么?

输入格式:
输入一个数n,表示三角形的边长。1<n<1000。

输出格式:
输出对应的用*表示的等腰直角三角形。

输入样例:
4
输出样例:
*
**
***
****
#include <stdio.h>
int main(){
    int n;
    int s = 0;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){

        for(int j = 1; j <= i; j++){
            printf("*");
        }

        printf("\n");
    }
    //printf("m = %d",s);
    return 0;


}
7-5 N阶楼梯上楼问题 (10 分)
N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。例如,当楼梯只有一阶时,只有一种方法;当楼梯有两阶时,可以每次跨一阶,跨两次,也可以每次跨两阶,跨一次,因此有两种方法。

输入格式:
输入包括一个整数N,(1<=N<46)。

输出格式:
输出当楼梯阶数是N时的上楼方式总数。

输入样例1:
3
输出样例1:
3
输入样例2:
4
输出样例2:
5
思路: 倒着分析  然后正过来 就是斐波那契数列  

#include <stdio.h>
int main(){
    int a[50]={1,1,2};
    for(int i = 3;i < 50; i++){
        a[i] = a[i-1] + a[i-2];
    }
    int n;
    scanf("%d",&n);
    printf("%d",a[n]);

return 0;
}
7-6 猴子选大王 (10 分)
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:
输入在一行中给一个正整数N(≤1000)。

输出格式:
在一行中输出当选猴王的编号。

输入样例:
11
输出样例:
7
约瑟夫环问题 
#include<stdio.h>

int main(void){
    int a[1002]={0};
    int n,temp=0;
    int out=0;
    int count = 0;
    scanf("%d",&n);
    do{
        temp++;
        if(temp>n)
            temp=1;
        if(!a[temp])
            count++;
        else
            continue;
        if(count==3){
            count=0;
            a[temp]=1;
            out++;
        }
    }while((out+1)!=n);
    int i;
    for(i=1;i<=n;++i){
        if(!a[i]){
            printf("%d\n",i);
            break;}
    }
    return 0;
}
7-7 一维数组最大值和最小值交换 (5 分)
找出含有10个元素一维数组中的最大值和最小值,并互换这两个数的位置。

输入格式:
在一行中输入10个整数,数据之间只能用1个空格间隔。

输出格式:
在一行中按照“max=最大值,min=最小值”的格式输出结果,最大值和最小值均原样输出,没有列宽控制。 在下一行中输出交换完最大值和最小值的一维数组,每个数据输出占5列。

输入样例:
6 5 1 2 3 4 8 9 7 5
输出样例:
max=9,min=1
    6    5    9    2    3    4    8    1    7    5
这道题过不了 不知道为什么 试了很多方法也考虑了多个最大最小值 还是没过  但是有1-2个大佬过了

//知道了 那个是英文的逗号

#include <stdio.h>
int main(){
    int a[100];
    for(int i=0;i<9;i++){
        scanf("%d ",&a[i]);
    }
    scanf("%d",&a[9]);
    int tmax,tmin;
    int min = a[0];
    int max = a[9];
    for(int i =0;i<10;i++){
        if(a[i]<min){
            min = a[i];
            tmin = i;
        }
        if(a[i]>max)
        {
            max = a[i];
            tmax = i;
        }
    }
    a[tmax] = min;
    a[tmin] = max;
    printf("max=%d,min=%d\n",max,min);
    for(int i =0;i<10;i++){
        printf("%5d",a[i]);
    }
    printf("\n");
    return 0;
}
7-8 计算平均分并输出低于平均分的学生成绩 (4 分)
从键盘上输入若干(<20)个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。

输入格式:
在一行中输入若干(<20)个学生的实型成绩,用输入负数结束输入,数据之间各用一个空格间隔。

输出格式:
在一行中按照“ave=平均成绩(回车)”顺序输出平均成绩,平均成绩保留2位小数,没有列宽控制。 在下一行中输出低于平均分的学生成绩,学生成绩保留1位小数,列宽为6列。

输入样例:
85 65 74 -1
输出样例:
ave=74.67
  65.0  74.0
#include <stdio.h>
int main(){
    int n;
    double a[20];
    double sum = 0;
    int count=0;
    while (scanf("%d",&n)&&n!=-1){
        a[count] = n;
        count++;
        sum += n;
    }
    printf("ave=%.2lf\n",sum/count);
    for(int i =0; i < count;i++){
        if(a[i]<(sum/count)){
            printf("%6.1lf",a[i]);
        }
    }
}
发布了55 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42612338/article/details/94500167