数组专项
1.输入一个5个元素的一维数组,实现冒泡排序(大到小)。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[5];
for(int i=0;i<5;i++) //输入一个5个元素
{
scanf("%d",&arr[i]);
}
int t=0;
for(int i=0;i<5;i++) //冒泡排序
{
for(int j=1;j<5-i;j++) //把最小的值一步一步飘到数组的最后面
{
if(arr[j-1]<arr[j]) //每次取相邻的两个数比较找小的值,从小到大排序就找大的值
{
t=arr[j-1];
arr[j-1]=arr[j];
arr[j]=t;
}
}
}
for(int i=0;i<5;i++) //输出一个5个元素
{
printf("%d ",arr[i]);
}
putchar(10);
return 0;
}
2.输入一个5个元素的一维数组,实现简单选择排序(大到小)。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[5];
for(int i=0;i<5;i++) //输入一个5个元素
{
scanf("%d",&arr[i]);
}
int t=0;
for(int i=0;i<5;i++) //简单选择排序:循环遍历,每次选择最大的值和未排序的第一个元素交换,直到排完
{
int maxi=i; //定义每次循环要找的值的数组下标(从小到大排找最小的值的下标,本人一般定义为mini)
for(int j=i+1;j<5;j++)
{
if(arr[maxi]<arr[j])maxi=j;
}
if(maxi!=i)
{
t=arr[i];
arr[i]=arr[maxi];
arr[maxi]=t;
}
}
for(int i=0;i<5;i++) //输出一个5个元素
{
printf("%d ",arr[i]);
}
putchar(10);
return 0;
}
3.输入一个5个元素的一维数组,计算最大值最小值。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[5];
for(int i=0;i<5;i++) //输入一个5个元素
{
scanf("%d",&arr[i]);
}
int max=arr[0],min=arr[0];
for(int i=1;i<5;i++)
{
if(max<arr[i])max=arr[i];
if(min>arr[i])min=arr[i];
}
printf("最小值为%d,最大值为%d\n",min,max);
return 0;
}
4.输入一个3行4列个元素的二维数组,计算最大值最小值。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[3][4];
for(int i=0;i<3;i++) //输入一个5个元素
{
for(int j=0;j<4;j++)
{
scanf("%d",&arr[i][j]);
}
}
int max=arr[0][0],min=arr[0][0];
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
if(max<arr[i][j])max=arr[i][j];
if(min>arr[i][j])min=arr[i][j];
}
}
printf("最小值为%d,最大值为%d\n",min,max);
return 0;
}
5.使用二维数组计算杨辉三角。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int n;
printf("输入杨辉三角的行数:");
scanf("%d",&n);
int arr[n][n]={0};
arr[0][0]=arr[1][0]=arr[1][1]=1;
for(int i=2;i<n;i++)
{
arr[i][0]=1;
for(int j=1;j<i;j++)
{
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
arr[i][i]=1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<i+1;j++)
{
printf("%d ",arr[i][j]);
}
putchar(10);
}
return 0;
}
6.输入一个n个元素的一维数组,计算最大的和,最大差(不允许使用排序)。提示:最大和=第一大值+第二大值,最大差=第一大值-最小值。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int n;
printf("请输入n的值:");
scanf("%d",&n);
int arr[n]; //定义一个n个元素的一维数组
for(int i=0;i<n;i++) //输入一个n个元素的一维数组
{
scanf("%d",&arr[i]);
}
int max=0,max2=0,min=0; //分别定义第一大值、第二大值、最小值的下标
for(int i=1;i<n;i++)
{
if(arr[max]<arr[i])max=i;
if(arr[min]>arr[i])min=i;
}
max2=min; //把最小值下标赋值给第二大值下标,以防下标走到第一大值了
for(int i=0;i<n;i++) //找第二大值下标
{
if(arr[max2]<arr[i])
{
if(i!=max)
{
max2=i;
}
}
}
int sum=arr[max]+arr[max2];
int difference=arr[max]-arr[min];
printf("最大和:%d,最大差:%d\n",sum,difference);
return 0;
}
7.输入一个m行n列的二维数组,计算第二小值。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int m=0,n=0;
printf("请分别输入m行n列的m和n的值:");
scanf("%d %d",&m,&n);
int arr[m][n];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
int min=0,min2=0; //定义下标
for(int i=0;i<m*n;i++) //找到第一小值
{
if(arr[min/m][min%n]>arr[i/m][i%n])min=i;
}
while(arr[min2/m][min2%n]==arr[min/m][min%n]&&min2<m*n)min2++; //如果初始下标是重复的第一小值则跳过,但下标不能越界
for(int i=0;i<m*n;i++) //找第二小值
{
if(arr[min2/m][min2%n]>arr[i/m][i%n]&&arr[min/m][min%n]<arr[i/m][i%n])min2=i;
}
printf("第二小值为:arr[%d][%d]=%d\n",min2/m,min2%n,arr[min2/m][min2%n]);
return 0;
}
8.输入n个元素的一维数组,输入查找的key值。若key出现一次,则输出对应的下标;若没有出现,则提示不存在;若key出现多次,则提示出现的次数。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int n=0,key=0,num=0,index=0;
printf("请输入n的数值:");
scanf("%d",&n);
int arr[n];
printf("请输入一维数组的n个元素:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
printf("请输入要查找的key值:");
scanf("%d",&key);
for(int i=0;i<n;i++)
{
if(arr[i]==key)
{
num++;
index=i;
}
}
switch(num)
{
case 0:
printf("输入的值不存在\n");
break;
case 1:
printf("存在且存在1个,下标为%d\n",index);
break;
default:
printf("存在%d个\n",num);
break;
}
return 0;
}
9.输入一个m行n列的二维数组,输出每一行的和,以及每一列的和。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int m=0,n=0;
printf("请分别输入m行n列的m和n的值:");
scanf("%d %d",&m,&n);
int arr[m][n];
int sumline[m]={0},sumrow[n]={0};
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
sumline[i]+=arr[i][j];
sumrow[j]+=arr[i][j];
}
}
for(int i=0;i<m;i++)
{
printf("第%d行的和为%d\n",i+1,sumline[i]);
}
for(int i=0;i<n;i++)
{
printf("第%d列的和为%d\n",i+1,sumrow[i]);
}
return 0;
}
10.输入一个m行m列的二维数组,输出正对角线和反对角线的差。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int m=0;
printf("请输入m的值:");
scanf("%d",&m);
int arr[m][m];
int sum1=0,sum2=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&arr[i][j]);
if(i==j)sum1+=arr[i][j];
if(i==m-j-1)sum2+=arr[i][j];
}
}
printf("正对角线和反对角线的差为%d\n",sum1-sum2);
return 0;
}
11.输入一个2行3列的二维数组,实现转置(行列转换)。
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[2][3],arr2[3][2];
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(int i=0;i<3;i++)
{
for(int j=0;j<2;j++)
{
arr2[i][j]=arr[j][i]; //行列转换
printf("%d ",arr2 [i][j]); //输出转置的数组
}
putchar(10);
}
return 0;
}
运算符练习题
1.设foat a=2,b=4,c=3;C语言表达式(1/2)+(a+b)*c的计算结果是?
答:结果是18。因为1/2的结果是0,整数和整数相处结果也是整数。
2.下述程序执行后的输出结果是?
main()
{
int x='f';
printf("%c\n",'a'+(x-'a'+1));
}
答:g。字符和整数想运算会转为ascall码值进行计算,输出使用的是%c格式符,输出ascall码值对应的字符。
3.执行语句“k=7>>1;”后,变量k的当前值是?
答:3。右移一位,有个窍门,右移1除2,左移1乘2,使用窍门还需注意取值范围。
4.若有宏定义:#defne MOD(x,y) x%y,则执行以下语句后的输出结果是?
int a=10,b=94;
printf("%d\n",MOD(b,a+4));
答:8。宏定义是在预处理阶段实现文本替换,不会先进行计算,所以会输出b%a+4的值。
5.下列程序段运行后,x的值是?
int a=1;b=2;x=0;
if(!(--a))x--;
if(!b)x=7;else ++x;
答:0。