2020年哈尔滨工业大学C语言程序设计精髓 第九周编程作业题

/第三题真的有肝很久,因为方向判断错误的关系,要理解二维数组作为形参进入函数里面,注意第一下标和第二下标代表的关系,第一下标是行数,第二是一列的个数,作为形参可以只定义个数,就当是这一排多少个自动化行,等不及的同学可以私信给我一起讨论后面的题目,后面几周的学习主要围绕编程作业,练兵题会慢慢更的,肝不动*/
1
重复数字检查(4分)
题目内容:
从键盘输入一个数,检查这个数中是否有重复出现的数字。如果这个数中有重复出现的数字,则显示“Repeated digit!”;否则显示“No repeated digit!”。
已知函数原型:
int CountRepeatNum(int count[], int n);
若有重复数字,则该函数返回重复出现的数字;否则返回-1.
程序运行结果示例1:
Input n:
28212↙
Repeated digit!

程序运行结果示例2:
Input n:
12345↙
No repeated digit!

输入提示:“Input n:\n”
输入格式: “%ld”
输出格式:
有重复数字,输出信息: “Repeated digit!\n”
没有重复数字,输出信息: “No repeated digit!\n”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
int CountRepeatNum(int count[], int n)
{
    int i,j;
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=n;j++)
        {
            if(count[i]==count[j]&&i!=j)
               {
                   return -1;
               }
        }
    }
}
int main()
{
    long n;
    int i,j=0,Sentence=0,count[10000];
    printf("Input n:\n");
    scanf("%ld",&n);
    for(i=0;i<10000;i++)
    {
        count[i]=n%10;
        n=n/10;
        if(n==0)
        {
            break;
        }
    }
    Sentence=CountRepeatNum(count,i);
    if(Sentence==-1)
    {
        printf("Repeated digit!\n");
    }
    else
    {
        printf("No repeated digit!\n");
    }
    return 0;
}

2
教授的课(4分)
题目内容:
教授正在为一个有N个学生的班级讲授离散数学课。他对某些学生缺乏纪律性很不满意,于是决定:如果课程开始后上课的人数小于K,就取消这门课程。从键盘输入每个学生的到达时间,请编程确定该课程是否被取消。如果该门课程被取消,则输出“Yes”,否则输出“No”。假设教授在时刻0开始上课。如果一个学生的到达时间是非正整数,则表示该学生在上课前进入教室。如果一个学生的到达时间是正整数,则表示该学生在上课后进入教室。如果一个学生在时刻0进入教室,也被认为是在上课前进入教室。假设到达时间的绝对值不超过100,学生数N不超过1000。要求在输入学生的到达时间之前,先输入N和K。
已知函数原型:
//函数功能:根据数组a中记录的学生到达时间确定课程是否被取消,取消则返回1,否则返回0
int IsCancel(int a[], int n, int k);
程序运行结果示例1:
Input n,k:
4,3↙
-1 -3 4 2↙
YES

程序运行结果示例2:
Input n,k:
5,3↙
-1 -2 -3 0 4↙
NO

输入提示:“Input n,k:\n”
输入格式:
“%d,%d”
“%d”
输入包括两行数据:
第1行是n,k的值。
第2行是学生的到达时间。
输出格式:
课程被取消,输出"YES"
课程不取消,输出"NO"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
int IsCancel(int a[], int n, int k)
{
    int i,late=0;
    for(i=0;i<n;i++)
    {
        if(a[i]<0)
        {
            late++;
        }
        if(k==late)
        {
            return 1;
        }
    }
    return 0;
}
int main()
{
    int i,j=0,count=0,Sentence=0,a[1000],n,k;
    printf("Input n,k:\n");
    scanf("%d,%d",&n,&k);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    Sentence=IsCancel(a,n,k);
    if(Sentence==0)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0;
}

3
寻找鞍点(4分)
题目内容:
请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!”
已知函数原型:
void FindSaddlePoint(int a[][N], int m, int n);
在该函数中输出有无鞍点的信息。
程序运行结果示例1:
Input m,n:
3,3↙
Input matrix:
1 2 3↙
4 5 6↙
7 8 9↙
a[0][2] is 3

程序运行结果示例2:
Input m,n:
3,4↙
Input matrix:
3 4 7 5↙
0 1 8 2↙
9 3 2 6↙
No saddle point!

输入提示: “Input m,n:\n”
“Input matrix:\n"
输入格式:
输入矩阵大小: “%d,%d”
输入矩阵元素: “%d”
输出格式:
找到鞍点的输出格式:“a[%d][%d] is %d\n”

没找到鞍点的输出格式:“No saddle point!\n”
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
#define N 100
void FindSaddlePoint(int a[][N], int m, int n)
{
    int num,i,k,z,Maxpoint,Minpoint,maxleft,maxright,minleft,minright;

    for(i=0; i<m; i++)
    {
        Maxpoint=a[i][0];
        maxleft=i;
        maxright=0;
        for(k=1; k<n; k++)
        {
            if(a[i][k] > Maxpoint)
            {
                Maxpoint = a[i][k];
                maxleft = i;
                maxright = k;
            }
        }
        Minpoint=a[0][maxright];
        minleft=0;
        minright=maxright;
        for(z=0; z<m; z++)
        {

            if(a[z][maxright] < Minpoint)
            {
                Minpoint = a[z][maxright];
                minleft = z;
                minright = maxright;
            }
        }
        if(maxleft==minleft&&maxright==minright)
        {
            printf("a[%d][%d] is %d\n", maxleft, maxright, a[maxleft][maxright]);
            return ;
        }

    }
    printf("No saddle point!\n");
return ;

}
int main()
{
    int i,j,m,n,a[100][100];
    printf("Input m,n:\n");
    scanf("%d,%d",&m,&n);
    printf("Input matrix:\n");
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    FindSaddlePoint(a,m,n);
    return 0;
}

4
计算三位阶乘和数(4分)
题目内容:
试求出所有三位阶乘和数:m=a!+b!+c!(其中a为百位数字,b为十位数字,c为个位数字。约定0!=1,并输出所有的m)

输入格式: 无
输出格式:"%ld\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb

#include <stdio.h>
int Fact(int n)
{
    if(n<=1)
        return 1;
    return (n*Fact(n-1));
}
int main()
{
    int i,num[3];
    for(i=100; i<1000; i++)
    {
        num[0]=i%10;
        num[1]=(i/10)%10;
        num[2]=i/100;
        if(i==Fact(num[0])+Fact(num[1])+Fact(num[2]))
        {
            printf("%ld\n",i);
        }
    }
    return 0;
}
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值