目录
输人10 个整数,将它们置人一个数组中,并计算它们的和、平均值、最大值、最小值及最值所对应的下标。
将一个一维数组反序放置,例如,a=[67,89,76,98,66],反序放置后,a= [66,98,76,89,67]。
5.,有n个考生,每个考生有一个考号和一个总分成绩。如果录取m人,确定录取分数线,并输出录取考生的考号和成绩。
7.从键盘上输人一个字符串,统计其中英文字母字符、数字字符出现的次数。
8.从键盘输人11个数字,输出前 10个数字中与第 11个数字相同的数字的个数。
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;
}
写在最后:今晚创作量有些大,时间紧,有很多地方还没做到位,有些注释还没做,有不足的地方欢迎大家指出,后续我会继续改进的,感谢各位大佬。