C语言数组练习题

目录

 

1.数列(3种方法)

 2.计算

输人10 个整数,将它们置人一个数组中,并计算它们的和、平均值、最大值、最小值及最值所对应的下标。

3.矩阵颠倒

将一个一维数组反序放置,例如,a=[67,89,76,98,66],反序放置后,a= [66,98,76,89,67]。

4.使用数组,输出300以内的素数。

5.,有n个考生,每个考生有一个考号和一个总分成绩。如果录取m人,确定录取分数线,并输出录取考生的考号和成绩。

6.输出n阶单位矩阵

7.从键盘上输人一个字符串,统计其中英文字母字符、数字字符出现的次数。

8.从键盘输人11个数字,输出前 10个数字中与第 11个数字相同的数字的个数。

9.求一个4x4阶矩阵的转置矩阵及逆矩阵。

10.求两个3x3矩阵A和B的和、差、积,并将结果按矩阵形式输出到屏幕上。

11.求矩阵的鞍点及鞍点所在的行列号(若元素Aij 在第i行中最大,在第j列中最小:或在第i行最小,在第j列中最大,则称Aij为矩阵的一个鞍点)。

12.从键盘输人一行字符,将连续出现的多个空格缩减为一个空格。


1.已知数列a₁=1;x>1时,aₓ=a₁+a₂+aₓ₋₁,将该数列的前20项置入一个一维数组中(3种方法)。

#include<stdio.h>
#define N 21
int a[N];
int main()
{
    int sum=0;
    a[0] = 1;
    for(int j =0;j<20;j++)
	{
        sum = sum +a[j];
		a[j+1] = sum;
		printf("%d  ",a[j]);
    }
    return 0;
}
#include<stdio.h>
#define N 20
int a[N];
int main()
{
    int sum=0;
    a[0] = 1;
    printf("%d  ",a[0]);
    for(int j =1;j<20;j++)
	{
        sum = sum +a[j-1];
		a[j] = sum;
		printf("%d  ",a[j]);
    }
    return 0;
}
#include<stdio.h>
#define N 20
int a[N];
int main()
{
    int sum=0;
    a[0] = 1;
    a[1]=1;
    printf("%d  ",a[0]);
    printf("%d  ",a[1]);
    for(int j =1;j+1<20;j++)
	{
        sum = 2*a[j];
		a[j+1] = sum;
		printf("%d  ",a[j+1]);
    }
    return 0;
}

 2.输人10 个整数,将它们置人一个数组中,并计算它们的和、平均值、最大值、最小值及最值所对应的下标。

#include<stdio.h>
#define N 10
int a[N];
int main()
{
	int i;
    int sum=0;
    int max=0,min=0;
    float ave;
    for(i=0;i<10;i++)
    {
		scanf("%d",&a[i]);
        sum=sum+a[i];
        if (a[max] < a[i])
        {
            max = i;
        }
		        
        if (a[min] > a[i])
        {
            min = i;
        }
	}
    printf("%d\n",sum);
	ave=sum/10.0;
	printf("%.2f\n",ave);
	printf("最大值为:%d下标%d\n",a[max],max);
	printf("最小值为:%d下标%d\n",a[min],min);
    return 0;
}

3.将一个一维数组反序放置,例如,a=[67,89,76,98,66],反序放置后,a= [66,98,76,89,67]。

#include<stdio.h>
int main()
{
  	int n,i;
  	printf("请输入总元素个数n:\n");
  	scanf("%d",&n);
  	int a[n];//定义变长数组a[n]
  	printf("请输入a[%d]中的元素:\n",n);
  	for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
  	int temp;//定义中间变量temp
    for(i=0;i<=n/2-1;i++)
	{
        temp=a[i];
        a[i]=a[n-1-i];
        a[n-1-i]=temp;
    }//功能函数:交换n/2次,每次都把头尾元素交换
  	printf("元素倒置后:\n");
  	for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
  	return 0;
}

4.使用数组,输出300以内的素数。

#include <stdio.h>
int main()
{
	int a[1000],isprime,i,j,k=0;
	for(i=2;i<300;i++)
	{
		isprime=1;
		for(j=2;j<i;j++)
		{
			if(i%j==0)
				isprime=0;
		}
		if(isprime==1)
		{
			a[k]=i;
			printf("%d\n",a[k]);
			k++;
		}
	}
	return 0;
}

5.利用数组记录5个学生的三科成绩及每个学科5个学生成绩之和的平均值

分析:程序首先定义了一个名为 `ave` 的函数,用于计算各科成绩的平均值。在 `main` 函数中,首先定义了一个二维数组 `b` 用于存储学生的成绩,然后通过循环输入每个学生的成绩。接着调用 `ave` 函数计算平均值,并将结果输出。最后,再次循环输出每个学生的成绩。

#include <stdio.h>
#define N 5
double ave(int a[][3])
{
    int i, j, sum[3];
    double c[3];
 
    for (i = 0; i < 3; i++)
    {
        sum[i] = 0;
        for (j = 0; j < N; j++)
        {
            sum[i] += a[j][i];
        }
        c[i] = (double)sum[i] / N; // 平均值的计算
        printf("%lf  ",c[i]);
    }
    return 0;
}
int main()
{
    int b[N][3];
    int i, j;
    double d;
    for (j = 0; j < N; j++)
    {
        printf("输入第%d个学生的三科成绩\n", j + 1);
        for (i = 0; i < 3; i++)
        {
            scanf("%d", &b[j][i]);
        }
    }
    for (j = 0; j < N; j++)
    {
        printf("输出三科成绩%d  ", j + 1);
        for (i = 0; i < 3; i++)
        {
            printf("%d  ", b[j][i]);
        }
        printf("\n");
    }
    d = ave(b);
    return 0;
}
 

6.输出n阶单位矩阵

#include<stdio.h>
int main()
{
    int n;
    printf("输入n的值");
    scanf("%d",&n);
        for(int i=0;i<n;i++)
		{
            for(int j=0;j<n;j++)
			{
                if(i==j)
				{
                    printf("1");
                }else{
                    printf("0");
                }
                if(j<n-1){
                    printf(" ");
                }
            }
            printf("\n");
        }
        printf("\n");
    return 0;
}

7.从键盘上输人一个字符串,统计其中英文字母字符、数字字符出现的次数。

#include <stdio.h>
#include <string.h>
int main() 
{
    char str[100];
    char eng_count = 0, num_count = 0;
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);
    for (int i = 0; str[i]; i++) 
	{
        if (str[i] >= 'A' && str[i] <= 'Z')
        {
            eng_count++;
        } 
		else if (str[i] >= 'a' && str[i] <= 'z') 
		{
            eng_count++;
        } 
		else if (isdigit(str[i])) 
		{
            num_count++;
        }
    }
    printf("英文字母次数:%d\n", eng_count);
    printf("数字次数:%d\n", num_count);
    return 0;
}

分析:这段代码首先定义了一个字符数组`str`用于存储输入的字符串,以及两个计数器`eng_count`和`num_count`用于统计英文字母和数字的出现次数。接下来,通过`fgets`函数从键盘读取字符串,然后使用`for`循环遍历字符串中的每个字符。根据字符的类型,分别进行英文字母和数字的计数。最后,输出统计结果。

8.从键盘输人11个数字,输出前 10个数字中与第 11个数字相同的数字的个数。

#include <stdio.h>
int main() 
{
    int nums[11];
    int count = 0;
    int target;
    printf("输入十一个数字:");
    for (int i = 0; i < 11; i++) 
	{
        scanf("%d", &nums[i]);
    }
    printf("第11个数字");
    scanf("%d", &target);
    // 遍历前10个数字,统计与目标数字相同的个数
    for (int i = 0; i < 10; i++) 
	{
        if (nums[i] == target)
	    {
            count++;
        }
    }
    // 输出结果
    printf("与第11个数字相同的数字个数:%d\n", count);
    return 0;
}

9.求一个4x4阶矩阵的转置矩阵及逆矩阵。(求矩阵的逆矩阵较难,对初学者不要求一定掌握)

分析:

. 首先,给定了矩阵的转置(adjoint[i][j] = m[i][k] * m[j][k] - m[i][j]),这里采用了列主元消法。通过这一步,我们可以得到矩阵的简化阶梯形式。

2. 接下来,程序通过嵌套循环初始化了 adjoint 矩阵。adjoint 矩阵是原矩阵的转置的逆矩阵。在这个例子中,我们初始化了 adjoint 矩阵的对角线元素为1,这是因为对角线元素是逆矩阵的主对角线元素。

3. 最后,通过嵌套循环计算 adjoint 矩阵的其他元素。这里使用了原矩阵的元素进行计算。计算过程如下:

   - adjoint[i][j] = m[i][k] * m[j][k] - m[i][j]

   这个过程实际上是对矩阵进行列主元消法,从而得到简化阶梯形式。在这个过程中,adjoint 矩阵的元素被计算出来。

4. 得到 adjoint 矩阵后,我们可以通过求逆矩阵的公式计算原矩阵的逆矩阵:

   - minv[i][j] = m[i][j] * adjoint[i][j] / m[i][i]

   其中,minv[i][j] 是原矩阵的逆矩阵元素。

综上所述,这段程序通过列主元消法计算四阶矩阵的逆矩阵。首先初始化 adjoint 矩阵,然后对矩阵进行简化阶梯形式,最后计算出原矩阵的逆矩阵。需要注意的是,这段程序仅适用于方阵矩阵(即行数等于列数的矩阵),并且需要满足矩阵可逆的条件,如果输入的矩阵不是方阵,程序将无法正确计算逆矩阵。

#include <stdio.h>
int main() 
{
    int n,i,j;
    int m[4][4];
    int temp[4][4];
    printf("请输入一个4行4列的矩阵:\n");
    for (n = 0; n < 4; n++) 
	{
        for ( i = 0; i < 4; i++) 
		{
            scanf("%d", &m[n][i]);
        }
    }
    for (int i = 0; i < 4; i++) 
	{
        for (j = 0; j < 4; j++) 
		{
            temp[j][i] = m[i][j];
        }
    }// 转置矩阵
    printf("转置后的矩阵:\n");
    for (int i = 0; i < 4; i++) 
	{
        for (int j = 0; j < 4; j++) 
		{
            printf("%d ", temp[i][j]);
        }
        printf("\n");
    }
    int adjoint[4][4];
    for (int i = 0; i < 4; i++) 
	{
        adjoint[i][i] = 1;
    }
    for (int k = 0; k < 4; k++) 
	{
        for (int i = 0; i < 4; i++) 
		{
            for (int j = 0; j < 4; j++) 
			{
                if (i != j) 
				{
                    adjoint[i][j] = m[i][k] * m[j][k] - m[i][j];
                }
            }
        }
    }// 计算逆矩阵
    printf("逆矩阵:\n");
    for (int i = 0; i < 4; i++) 
	{
        for (int j = 0; j < 4; j++)
		 {
            printf("%d ", adjoint[i][j]);
        }
        printf("\n");
    }
    return 0;
}

10.求两个3x3矩阵A和B的和、差、积,并将结果按矩阵形式输出到屏幕上。

#include <stdio.h>
int main() 
{
    float mA[3][3], mB[3][3], sum[3][3], d[3][3], p[3][3];
    // 输入矩阵A
    printf("输入矩阵A的元素:\n");
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            scanf("%f", &mA[i][j]);
        }
    }
    // 输入矩阵B
    printf("输入矩阵B的元素:\n");
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            scanf("%f", &mB[i][j]);
            sum[i][j] = mA[i][j] + mB[i][j];
            d[i][j] = mA[i][j] - mB[i][j];
        }
    }
    // 计算矩阵的和、差、积
    printf("矩阵的和:\n");
    for (int i = 0; i < 3; i++) 
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%.2f ", sum[i][j]);
        }
        printf("\n");
    }
    printf("矩阵A和B的差:\n");
    for (int i = 0; i < 3; i++) 
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%.2f ", d[i][j]);
        }
        printf("\n");
    }
    printf("矩阵A和B的积:\n");
    for (int i = 0; i < 3; i++) 
    {
        for (int j = 0; j < 3; j++) 
        {
            p[i][j] = 0; // 初始化矩阵积的元素为0
            for (int k = 0; k < 3; k++) 
            {
                p[i][j] += mA[i][k] * mB[k][j];
            }
            printf("%.2f ", p[i][j]);
        }
        printf("\n");
    }
    return 0;
}

注意:此代码仅适用于float类型的矩阵元素。如果矩阵元素是int类型,请将浮点数相关的运算符(如+、-、*)替换为整数相关的运算符(如+、-、*)。同时,输出时将百分号去掉。

11.求矩阵的鞍点及鞍点所在的行列号(若元素Aij 在第i行中最大,在第j列中最小:或在第i行最小,在第j列中最大,则称Aij为矩阵的一个鞍点)。

#include <stdio.h>
#define ROWS 3  // 矩阵的行数
#define COLS 3  // 矩阵的列数
void f(int m[ROWS][COLS], int rows, int cols) 
{
    int s = 0;  // 鞍点的计数
    // 遍历矩阵元素
    for (int i = 0; i < rows; i++)
    {
        int minrow = m[i][0];  // 第i行中的最小值
        int mincol = 0;  // 最小值所在的列索引
        // 找到第i行的最小值及其所在列索引
        for (int j = 1; j < cols; j++) 
		{
            if (m[i][j] < minrow) 
			{
                minrow = m[i][j];
                mincol = j;
            }
        }// 判断最小值是否在列上是最大值
        int iss = 1;
        for (int k = 0; k <rows; k++) 
		{
            if (m[k][mincol] > minrow)
	        {
                iss = 0;
                break;
            }
        }// 如果是鞍点,则打印输出
        if (iss) 
		{
            printf("鞍点: %d, 位于(%d, %d)\n", minrow, i+1, mincol+1);
            s++;
        }
    }
    if (s == 0) 
	{
        printf("矩阵不存在鞍点\n");
    }
}
int main() 
{
    int m[ROWS][COLS] =
    {
        {1, 2, 3},
        {4, 5, 6},
        {2, 8, 9}
    };
    printf("矩阵的鞍点及其所在的行列号:\n");
    f(m, ROWS, COLS);
    return 0;
}

注意此代码仅适用于输入的矩阵是非对称矩阵且元素为整数的情况。若矩阵是对称矩阵或元素为其他类型,请根据实际情况进行修改。

12.从键盘输人一行字符,将连续出现的多个空格缩减为一个空格。

#include <stdio.h>
#include <stdbool.h>
int main() 
{
    char input[1000];  // 假设输入的字符串长度不超过1000个字符
    char output[1000];
    int inp = 0;
    int outp = 0;
    bool iss = false;
    // 从键盘输入一行字符
    printf("请输入一行字符: ");
    fgets(input, sizeof(input), stdin);
    // 处理输入字符串,缩减多个空格为一个空格
    while (input[inp] != '\0') 
	{
        if (input[inp] == ' ') 
		{
            if (!iss) 
			{
                // 遇到第一个空格,将其添加到输出字符串中
                output[outp++] = ' ';
                iss= true;
            }
        } else 
		{
            // 遇到非空格字符,将其添加到输出字符串中
            output[outp++] = input[inp];
            iss = false;
        }
        inp++;
    }
    // 添加字符串结束符
    output[outp] = '\0';
    // 输出结果
    printf("缩减后的字符串: %s\n", output);
    return 0;
}

写在最后:今晚创作量有些大,时间紧,有很多地方还没做到位,有些注释还没做,有不足的地方欢迎大家指出,后续我会继续改进的,感谢各位大佬。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梧桐810

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值