C语言学习|数组习题(10.17)

特殊函数

1.exit(1):退出整个程序,终止进程,返回1给操作系统(返回0表示正常退出,其余数表异常)

代码

猜随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10

void MakeNum (int a[]);
int GuessNum (int b[]);
int RightPosition (int a[],int b[]);
int RightNum (int a[],int b[]);

int main()
{
    int a[N],b[N],x,y,count = 1;
    MakeNum(a); //计算机随机生成数
    printf("Please input the number:\n");
    do
    {
        printf("The %d time:\n",count);
        if (GuessNum(b) != 0) //若输入合法,则开始判断
        {
            count++;
            x = RightPosition(a,b);
            y = RightNum(a,b)-x;
            printf("%dx%dy\n",x,y);
        }
    }while (count <= 4 && x != 4); //若猜对或者次数用完,则退出
    if (x == 4)
        printf("Congratulations!\n");
    else
        printf("Sorry,you haven't got it,see you next time!\n");
    printf("The right answer is %d%d%d%d.\n",a[0],a[1],a[2],a[3]);

    return 0;
}
void MakeNum (int a[])
{
    int i,j,t,k;
    srand(time(NULL));
    for (i = 0; i < N; i++) //存储0~9的数
        a[i] = i;
    for (j = 0; j < N; j++) //在0~9中随机选择数字,换入数组前4个元素
    {
        k = rand()%10;
        t = a[j];
        a[j] = a[k];
        a [k] = t;
    }
    return;
}
/*用户输入数据猜数,若输入合法,返回1,否则返回0*/
int GuessNum (int b[])
{
    int i,pol = 1;
    for (i = 0; i < 4; i++) //依次输入每一位数
    {
        pol = scanf("%d",&b[i]);
        if (pol != 1) //若输入非法
        {
            while(getchar() != '\n');
            printf("Please input the right number!\n");
            return 0;
        }
    }
    if (b[0] == b[1] || b[0] == b[2] || b[0] == b[3] || b[1] == b[2] || b[1] == b[3] || b[2] == b[3])
    {
        printf("The number can't be the same!\n"); //若输入的两数字相同
        return 0;
    }
    else
        return 1;
}
/*判断位置数字均正确的数字个数*/
int RightPosition (int a[],int b[])
{
    int i,x = 0;
    for (i = 0; i < 4; i++)
        if (a[i] == b[i])
            x++;
    return x;
}
/*判断正确的数字个数*/
int RightNum (int a[],int b[])
{
    int i,j,y = 0;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            if (a[i] == b[j])
                y++;
    return y;
}

运行结果

数组的插入

int Insert (int a[],int x,int num)
{
    int i,j;
    for (i = 0; i < num; i++)
        if (x < a[i])
            break; //查找x应该插入的位置,若找到,记录i,退出查找
    for (j = num; j > i; j-- )
        a[j] = a[j-1]; //将x后的元素依次后移一位
    a[i] = x;//将x插入数组
    return i+1; //返回x所在下标值
}
#include <stdio.h>
#define N 51

int BigFact (int a[],int n);

int main()
{
    int i,j,n,index,a[N]={0};
    printf("Enter a number to be calculated:");
    scanf("%d",&n);
    for (i = 1; i <= n; i++) //循环每一个数的阶乘
    {
        index = BigFact(a,i); //分别记录每一个数阶乘结果的位数,溢出则返回0
        if (index != 0)
        {
            printf("%d! = ",i);
            for (j = index; j > 0; j--)
                printf ("%d",a[j]);
            printf("\n");
        }
        else
        {
            printf("Overflow!\n");
            exit(1); //异常退出整个程序,终止进程,返回1给操作系统
        }
    }
    return 0;
}
/*计算阶乘,并返回位数or溢出*/
int BigFact (int a[],int n)
{
    int i,j,k,index = 1;
    for (i = 0; i < N; i++) //将结果数组初始化为0
        a[i] = 0;
    a[1] = 1; //将个位初始化为1
    for (i = 1; i <= n; i++) //表示一个阶乘的每一次乘法运算
    {
        for (j = 1;j <= index; j++) //利用竖式乘法,将乘数与每一位数分别相乘,最高位数为index
            a[j] = a[j]*i;
        for (k = 1; k < index; k++) //除了最高位index,从个位开始,依次进位
        {
            if (a[k] >= 10)
            {
                a[k+1] = a[k+1]+a[k]/10;
                a[k] = a[k]%10;
            }
        }
        while (a[index] >= 10&&index <= N-1) //当最高为>=10,对最高位进位,此时位数index进一
        {
            a[index+1] = a[index]/10;
            a[index] = a[index]%10;
            index++;
        }
    }
    if (index <= N-1) //位数是否溢出数组
        return index;
    else
        return 0;
    return 1;
}

运行结果

猜你喜欢

转载自blog.csdn.net/qq_42272723/article/details/83151523