C语言习题---数组篇

基础

一维数组:

1、用数组实现求 10 个数的和。

#include 
int main()
{
    int a[10]={0};
    int sum=0;
    for(int i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<10;i++)
    {
        sum+=a[i];
    }
    printf("%d\n",sum);   
    
    return 0;
}

2、将一个数组中的值按逆序重新存放。

#include 
int main()
{
    int a[500]={0};
    int n=0;
    int tmp=0;
    int sum=0;
    printf("数据总量:");
    scanf("%d",&n); 
    for(int i=0;i a[j+1])
            {
                tmp=a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
            }
        }
    }   
    for(int i=0;i

3、从键盘输入 10 个数,计算并输出它们的最大值、最小值和平均值。

#include 
int main()
{
    int a[500]={0};
    int n=0;
    int tmp=0;
    int sum=0;
    printf("数据总量:");
    scanf("%d",&n); 
    for(int i=0;i a[j+1])
            {
                tmp=a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
            }
        }
    }   
    for(int i=0;i

二维数组

1、有一个 3*4 的矩阵,找出其中值最大的元素,及其行列号。

#include 
int main()
{
    int a[3][4] = {0};
    int MAX = a[0][0];//默认定义最大值为第一个数据
    int MAX_i = 0,MAX_j = 0;//默认第一个数据的下标最大下标
    int i,j;
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            if(a[i][j] > MAX)//更新MAX的值
            {
                MAX = a[i][j];
                MAX_i = i;//更新i,j的值
                MAX_j = j;
            }
        }
    }
    printf("MAX = %d\n", MAX);
    printf("MAX_i = %d\n", MAX_i);
    printf("MAX_j = %d\n", MAX_j);

    return 0;
}

2、一个 3*3 的整型矩阵对角线元素之和。

#include 
int main()
{
    int i;
    int sum = 0;
    int sum1 = 0;
    int j;
    int a[3][3] = { {1,2,3},
                    {3,4,5},
                    {10,7,8}};
    for(i = 0; i < 3; i++)//主对角线
    {
        sum += a[i][i];
    }
    printf("%d\n", sum);
    
    
    for(i = 0,j = 2; j >= 0; i++, j--)//负对角线
    {
        sum1 += a[i][j];
    }
        
    printf("%d\n", sum1);
    
    return 0;
}

字符数组:

1、输入一行字符,统计其中大写字母的个数,并将所有的大写字母转化成小写字母后输出。

#include 
int main()
{
    char a[5] = {0};
    int i;
    int count = 0;
    printf("程序功能:\n");
    printf("输入五个字母,使大写变小写并统计大写字母个数:\n");
    for(i = 0; i < 5; i++)
    {
        scanf("%c", &a[i]);
    }
    while(getchar() != '\n');
    for(i = 0; i < 5; i++)
    {
        if(a[i] >= 'A' && a[i] <= 'Z')
        {
            a[i] = a[i] + 32;
            count++;
        }
        
    }
    for(i = 0; i < 5; i++)
    {
        printf("%c ", a[i]);
    }
    printf("\n");
    printf("大写字母总数:%d", count);
    printf("\n");
    return 0;
}

2、输入密码,设置一个密码,然后输入密码,机会为 3 次,三次密码错误就直接退出。

#include 
#include 
#define N 500
int main()
{
    char a[N] = {0};
    int i = 0;
    int j = 0;
    int k = 0;
    int m = 0;
    int n = 0;
    int flag = 0;
    char pwd[N] = {0};//设置密码
    printf("请输入要设置的密码");
    gets(pwd);
    n = strlen(pwd);
    printf("请输入密码");
    for(j = 3; j > 0; j--)
    {
        flag = 0;
        printf("还可输入%d次密码:\n", j);
        gets(a);
        m = strlen(a);
        if(m <= n)
        {
            for(k = 0; k < n; k++)
            {
                if(pwd[k] == a[k])
                {
                    flag++;    
                } 
                else
                {
                    flag = 0;
                }       
            }
        }
        if(flag == n)
        {
            printf("密码正确\n");
            break; 
            
        }
        else
        {
            printf("密码不正确\n");  
                     
        } 
    }  
    return 0;
}

3、输入一行字符,分别统计出其中字母、空格、数字和其他字符的个数。

#include 
#include 
int main()
{
    char a[100] = {0};
    int i = 0, j = 0, n = 0;
    int z = 0, kongge = 0, num = 0, other = 0;
    
    //gets(a);  不安全,缓冲区太大,但是不知道缓冲区有多大,容易引起崩溃
    fgets(a,(sizeof a / sizeof a[0]), stdin);   //读到EOF停止
    
    n = strlen(a);
    
    for(j = 0; j < n; j++)
    {
        if((a[j] >= 'a' && a[j] <= 'z') || (a[j] >= 'A' && a[j] <= 'Z'))
        {
            z++;
        }
        else if(a[j] == 32)
        {
            kongge++;
        }
        else if(a[j] >= '0' && a[j] <= '9')
        {
            num++;
        }
        else
        {
            other++;
        }
    
    }
    printf("字母:%d, 空格:%d, 数字:%d, 其他:%d\n", z, kongge, num, other);
    return 0;
}

提升

一维数组

1、 利用数组实现斐波那契数列的前 30 项,并要求格式化对齐,每行值输出 5 个数。(斐波那契数列:1 1 2 3 5 8 13 21……) 。

#include 
int main()
{
    int a[30] = {1,1};
    int i;
    for(i = 2; i < 30; i++)
    {
        a[i] = a[i - 1] + a[i - 2];
    }
    for(i = 0; i < 30; i++)
    {   
        printf("%-5d ", a[i]);
        if((i + 1) % 5 == 0)
        {
            printf("\n");
        }
    }
    printf("\n");
    return 0;
}

2、 将 n 个整数由小到大排序。

#include 
int main()
{
    int i,j,tmp = 0;
    int n;
    int a[500] = {0};
    printf("请输入数据:\n");
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    for(i = 1; i < n; i++)
    {
        for(j = 0; j < n - i; j++)
        {
            if(a[j] > a[j + 1])
            {
                tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
    for(i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

3、 输入 10 进制数转换为二进制进行输出。

#include 
#include 
int main()
{
    int temp[32] = {0};
    int num = 0, i = 0, j = 0;
    printf("请输入十进制数:");
    scanf("%d", &num);
    for(i = 0; num != 0; i++)
    {
        temp[i] = num % 2;
        num /= 2;
    }
    for(j = i-1; j >= 0; j--)
    {
        printf("%d", temp[j]);
    }
    printf("\n");
    return 0;
}

二维数组

1、将一个 3×3 矩阵转置,(行变列列变行)。

#include 
int main()
{
    int a[3][3] = {{1,2,3},
                   {4,5,6},
                   {7,8,9}};
    int i,j;
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)
        {
            if(j % 3 == 0)
            {
                printf("\n");
            }
            printf("%d", a[i][j]);
        }
    }
    printf("\n");
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 3; j++)
        {
            if(j % 3 == 0)
            {
                printf("\n");
            }
            printf("%d", a[j][i]);
        }
    }
    printf("\n");
 
    return 0;
}

2、分别给出 3 个学生的 4 门课程的成绩,求其中的最高成绩、各门课程的平均成绩和总平均成绩。

#include 
int main()
{
    float a[3][4] = {0};
    int i,j;
    float MAX = 0;
    int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0, sum5 = 0; 
    for(i = 0; i < 3; i++)
    {
        printf("请输入第%d个学生的4门课成绩:\n", i + 1);
        for(j = 0; j < 4; j++)
        {
            scanf("%f", &a[i][j]);
        }
    }
    printf("---------------------------\n");
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            if(a[i][j] > MAX)
            {
               MAX = a[i][j];
            }
        }
    }
    for(i = 0; i < 3; i++)
    {
        sum1 += a[i][0];
    }
    for(i = 0; i < 3; i++)
    {
        sum2 += a[i][1];
    }
    for(i = 0; i < 3; i++)
    {
        sum3 += a[i][2];
    }
    for(i = 0; i < 3; i++)
    {
        sum4 += a[i][3
        ];
    }
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            sum5 += a[i][j];
        }
    }
    printf("最高成绩:%.1f\n", MAX);
    printf("---------------------------\n");
    printf("第一门课平均成绩:%.1f\n", sum1*1.0/4);
    printf("第二门课平均成绩:%.1f\n", sum2*1.0/4);
    printf("第三门课平均成绩:%.1f\n", sum3*1.0/4);
    printf("第四门课平均成绩:%.1f\n", sum4*1.0/4);
    printf("---------------------------\n");
    printf("总平均成绩:%.1f\n", sum5*1.0/4);
    printf("\n");
    
 
    return 0;
}

3、 打印杨辉三角的前 10 行 。

#include 
#define N 10
int main()
{
    int a[N][N] = {' '};
    int i,j;
    // a[0][0] + a[0][1]
    
    for(i = 0; i < 10; i++)
    {
        a[i][0] = 1;
    }
    for(i = 0; i < 9; i++)
    {
        a[i][i] = 1;
    }
    for(i = 2; i < 10; i++)
    {
        for(j = 1; j < 10; j++)
        {
            
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
        }
        
    }
    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < 10; j++)
        {
            printf("%-2d   ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

字符数组

1、 不使用库函数,实现字符串的求长度,复制,比较,连接。

#include 
int main()
{
    char a[500] = "0";
    char b[500] = "0";
    int flag = 0;
    int n;
    int count = 0;
    int i = 0,j = 0;
    printf("---------------------------------------\n");
    printf("实现求字符串长度\n");
    printf("请输入a字符串:");
    scanf("%s", a); 
    for(i = 0; i < sizeof(a) / sizeof (a[0]); i++)//求字符串a长度
    {
        if(a[i] != '\0')
        {
            count++;
        }
    }
    printf("此字符串a的长度为:%d\n", count);
    printf("---------------------------------------\n");
    printf("实现strcpy\n");
    printf("请输入a字符串:");
    scanf("%s", a);    
    printf("请输入b字符串:");
    scanf("%s", b);    
    for(i = 0; i < sizeof(a) / sizeof (a[0]); i++)
    {
        if(b[i] != '\0')
        {
            a[i] = b[i];
        }
    }
    printf("把b复制到a后此字符串,a为:%s\n", a);   
    printf("---------------------------------------\n");
    printf("实现strcmp\n");
    printf("请输入a字符串:");
    scanf("%s", a);    
    printf("请输入b字符串:");
    scanf("%s", b);    
    for(i = 0; i < sizeof(a) / sizeof (a[0]); i++)
    {
        if(a[i] > b[i])
        {
            flag = 1;
            break;
        }
        else
        {
            flag = 0;
            break;
        }
    }
    if(flag == 1)
    {
        printf("a数组大于b\n");
    }
    else
    {
        printf("b数组大于a\n");
    }
    printf("---------------------------------------\n");
    printf("实现strcat\n");
    printf("请再次输入a字符串:");
    scanf("%s", a);
    printf("请再次输入b字符串:");
    scanf("%s", b);
    while(a[i] != '\0')
    {
        i++;
    }
    while(b[j] != '\0')
    {
        a[i++] = b[j++];
    }
    a[i] = '\0';
    printf("字符串a = %s\n", a);
    return 0;
}

2、 输入一个字符串,判断是否是回文。(回文:这个字符串顺读和反读是一样的。如“abcba””123321”都是回文。

#include 
#include 
int main()
{
    char a[500] = "0";
    int i = 0;
    int j = 0;
    int k = 0;
    int flag = 1;
    scanf("%s", a);
    /*if(a[strlen(a) - 1] == '\n')
    {
        a[strlen(a) - 1] == '\0';
    }*/
    while(getchar() != '\n');
    for(i = 0, j = strlen(a) - 1; i < j; i++,j--)
    {
        if(a[i] != a[j])
        {
            flag = 0;
            break;
        }
    }
    if(flag)
    {
        printf("%s是回文\n", a);
    }
    else
    {
        printf("%s不是回文\n", a);
    }
    return 0;
}

3、 一篇文章,有三行文字,每行有 80 个字符。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。(二维数组)

#include 
int main()
{
    char a[3][80] = {0};
    int numD = 0, numd = 0, num = 0, konge = 0, other = 0;
    int i,j;
    for(i = 0; i < 3; i++)
    {
        gets(a[i]);
    }
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 80; j++)
        {
            if(a[i][j] >= 'A' && a[i][j] <= 'Z')
            {
                numD++;
            }
            else if(a[i][j] >= 'a' && a[i][j] <= 'z')
            {
                numd++;
            }
            else if(a[i][j] >= '0' && a[i][j] <= '9')
            {
                num++;
            }
            else if(a[i][j] == ' ')
            {
                konge++;
            }
            else
            {
                other++;
            }
        }
    }
    printf("%d %d %d %d %d\n", numD, numd, num, konge, other);
    return 0;
}

你可能感兴趣的:(C语言学习,c语言,算法,数据结构)