当前位置: 首页 > article >正文

C语言学习-数组练习

1. 键盘录入一组数列,利用冒泡排序将数据由大到小排序

#include <stdio.h>
#include <string.h>
#define A_NUM 10

int t1 = 0;
int t2 = 0;

/**
*键盘录入一组数列,利用冒泡排序将数据由大到小排序
*/
//使用常规冒泡完成
void t_1_1()
{
   int i,n;
   printf("请输入数列的大小:\n");
   scanf("%d",&n);
   int arr[n];
   printf("请输入该数列:\n");
   for(i = 0; i < n; i++)
   {
       scanf("%d",&arr[i]);
   }
   for(i = 0; i < n - 1; i++)
   {
       for(int j = 0; j < n - i - 1; j++)
       {
           if(arr[j] < arr[j+1] )
           {
               int temp = arr[j];
               arr[j] = arr[j+1];
               arr[j+1] = temp;
           }
           t1++;
       }
   }
   for(i = 0; i < n; i++)
   {
       printf("%-4d",arr[i]);
   }
   printf("\n%d\n",t1);
}

//使用鸡尾酒排序法完成
void t_1_2()
{
   int i,n;
   printf("请输入数列的大小:\n");
   scanf("%d",&n);
   int arr[n];
   int start = 0;
   int end = n - 1;
   int is_flag = 1;
   for(i = 0; i < n; i++)
   {
       scanf("%d",&arr[i]);
   }
   while(is_flag)
   {
       is_flag = 0;
       for(i = start; i < end; i++)
       {
           if(arr[i] < arr[i+1])
           {
               int temp = arr[i];
               arr[i] = arr[i+1];
               arr[i+1] = temp;
               is_flag = 1;
           }
           t2++;
       }
       end--;

       if(!is_flag)
           break;

       for(i = end; i > start; i--)
       {
           if(arr[i] > arr[i-1])
           {
               int temp = arr[i];
               arr[i] = arr[i-1];
               arr[i-1] = temp;
               is_flag = 1;
           }
           t2++;
       }
       start++;
   }
   for(i = 0; i < n; i++)
   {
       printf("%-4d",arr[i]);
   }
   printf("\n%d\n",t2);
}

2.输入年、月、日,计算该天是本年的第几天

/**
*输入年、月、日,计算该天是本年的第几天
*/
void t_2()
{
   int num_y,num_m,num_d;
   printf("输入年数-月数-天:\n");
   scanf("%d-%d-%d",&num_y,&num_m,&num_d);
   int m[] = {31,28,31,30,31,30,31,31,30,31,30,31};
   int len = sizeof(m)/sizeof(m[0]);
   if((num_y % 400 == 0) || (num_y % 100 != 0 && num_y % 4 == 0))
       m[1]++;
   int sum = num_d;
   for(int i = 0; i < num_m - 1; i++)
   {
       sum += m[i];
   }
   printf("%d年已经过%d天\n",num_y,sum);
}

3.键盘录入一组数列,求最大值、最小值、均值

/**
*键盘录入一组数列,求最大值、最小值、均值
*/
void t_3()
{
   int arr[A_NUM];
   int len = sizeof(arr)/sizeof(arr[0]);
   for(int i = 0; i < len; i++)
   {
       scanf("%d",&arr[i]);
   }

   int max = arr[0];
   int min = arr[0];
   int sum = 0;
   for(int i = 1; i < len; i++)
   {
       sum += arr[i];
       if(arr[i] > max)
           max = arr[i];
       if(arr[i] < min)
           min = arr[i];
   }
   printf("十个数的最大值是%d,最小值是%d,平均值是%.1lf\n",max,min,(double)sum/10);
}

4.从键盘录入一组数据,判断是否是回文,如12321,abba

/**
*从键盘录入一组数据,判断是否是回文,如12321,abba
*/
void t_4()
{
   int n;
   printf("输入数据的位数:\n");
   scanf("%d",&n);
   int arr[n];
   int is_flag = 1;
   for(int i = 0; i < n; i++)
   {
       scanf("%1d",&arr[i]);
   }
   for(int i = 0; i < n/2; i++)
   {
       if(arr[i] != arr[n-i-1])
           is_flag = 0;
   }
   if(is_flag)
       printf("是回文数据!\n");
   else printf("不是回文数据!\n");
}

5.用数组存储10个整型数,通过键盘输入一个数,找出该数在数组中的下标值

/**
*用数组存储10个整型数,通过键盘输入一个数,找出该数在数组中的下标值
*/

void t_5()
{
   int arr[10];
   for(int i = 0; i < 10; i++)
   {
       scanf("%d",&arr[i]);
   }
   int n;
   printf("输入需要查找的数:\n");
   scanf("%d",&n);
   int is_flag = 1;
   int i;
   for(i = 0; i < 10; i++)
   {
       if(arr[i] == n)
           break;
       if(i == 10 - 1)
           is_flag = 0;
   }
   if(is_flag)
       printf("下标值为%d!\n",i);
   else printf("数组中没有这个数\n");
}

6.通过键盘输入10个学员成绩,输出不及格学员的成绩和下标;最高分,最低分的下标;总成绩与平均成绩!

/**
*通过键盘输入10个学员成绩
*输出不及格学员的成绩和下标;最高分,最低分的下标;总成绩与平均成绩!
*/

void t_6()
{
   int st[10];
   int i;
   int len = sizeof(st) / sizeof(st[0]);
   printf("输入十个学员的成绩:\n");
   for(i = 0; i < 10; i++)
   {
       scanf("%d",&st[i]);
   }
   int max = st[0],min = st[0];
   int sum = 0;
   int no_max,no_min;
   for(i = 0; i < 10; i++)
   {
       if(st[i] < 60)
           printf("%d号学生的成绩不及格,为%d\n",i+1,st[i]);
       if(st[i] > max)
       {
           max = st[i];
           no_max = i;
       }
       if(st[i] < min)
       {
           min = st[i];
           no_min = i;
       }
       sum += st[i];
   }
   printf("最高分是第%d个同学,考了%d分\n",no_max+1,max);
   printf("最低分是第%d个同学,考了%d分\n",no_min+1,min);
   printf("总成绩为%d,平均成绩为%.1lf\n",sum,(double)sum / len);

}

7.一个二维数组赋初值,用户输入一个数,在该二维数组中查找,找到返回行列位置,没找到提示

/**
*一个二维数组赋初值,用户输入一个数,在该二维数组中查找,找到返回行列位置,没找到提示
*/
void t_7()
{
   int arr[3][3] = {11,12,13,21,22,23,31,32,33};
   int n;
   printf("输入要查找的数:\n");
   scanf("%d",&n);
   int i,j;
   int is_flag = 0;
   for(i = 0; i < sizeof(arr) / sizeof(arr[0]);i++)
   {
       for( j = 0; j < sizeof(arr[0]) / sizeof(arr[0][0]);j++)
       {
           if(n == arr[i][j])
           {
               is_flag = 1;
               break;
           }
       }
       if(is_flag)
           break;
   }
   if(is_flag)
       printf("在第%d行第%d列!\n",i+1,j+1);
   else printf("没这个数!\n");
}

8.二维整型数组,求所有元素的平均值,求每行最大值,求每列最小值

/**
*二维整型数组,求所有元素的平均值,求每行最大值,求每列最小值
*/
void t_8()
{
   int arr[3][3] = {19,35,21,38,15,25,24,17,33};
   int i,j;
   int sum = 0;
   int max;
   int row = sizeof(arr) / sizeof(arr[0]);
   int col = sizeof(arr[0]) / sizeof(arr[0][0]);
   int min[col];
   printf("设有二维数组如下:\n");
   for(i = 0; i < row; i++)
   {
       for(j = 0; j < col; j++)
       {
           printf("%-4d",arr[i][j]);
       }
       printf("\n");
   }
   for(i = 0; i < row; i++)
   {
       max = arr[i][0]; 
       for(j = 0; j < col; j++)
       {
           sum += arr[i][j];
           if(arr[i][j] > max)
               max = arr[i][j];
           if(i == 0)
               min[j] = arr[i][j];
           else if(i > 0)
           {
               if(min[j] > arr[i][j])
                   min[j] = arr[i][j];
           }
       }
       printf("第%d行最大值为%d\n",i+1,max);
   }
   for(i = 0; i < col; i++)
   {
       printf("第%d列的最小值为%d\n",i+1,min[i]);
   }
   printf("所有元素的平均值为:%.1f\n",(float)sum/(i*j));
}

9.在行列相等数组计算主对角线元素的和

/**
*在行列相等数组计算主对角线元素的和
*/
void t_9()
{
   int n;
   printf("输入数组行列的值(行列相等):\n");
   scanf("%d",&n);
   int a[n][n];
   int sum = 0;
   for(int i = 0; i < n; i++)
   {
       for(int j = 0; j < n; j++)
       {
           scanf("%d",&a[i][j]);
       }
   }
   for(int i = 0; i < n ; i++)
   {
       for(int j = 0; j < n; j++)
       {
           if(i == j)
               sum += a[i][j];
       }
   }
   printf("对角线的和为%d\n",sum);

}

10.计算矩阵下三角元素的和

/**
*计算矩阵下三角元素的和
*/
void t_10()
{
   int n;
   printf("输入数组行列的值(行列相等):\n");
   scanf("%d",&n);
   int a[n][n];
   int sum = 0;
   for(int i = 0; i < n; i++)
   {
       for(int j = 0; j < n; j++)
       {
           scanf("%d",&a[i][j]);
       }
   }
   for(int i = 0; i < n; i++)
   {
       for(int j = 0; j < n; j++)
       {
           if(j <= i)
               sum += a[i][j];
       }
   }
   printf("矩阵下三角元素的和是%d\n",sum);
}

11.电影院某一排某一列放置礼品,放置位置规定为“行和列的平方和为512”,电影院有20排,每排25座!找出礼品所在位置!

/**
*电影院某一排某一列放置礼品,放置位置规定为“行和列的平方和为512”,电影院有20排,每排25座!
*找出礼品所在位置!
*/
void t_11()
{
   int i,j;
   int arr[20][25];
   for(i = 0; i < 20; i++)
   {
       for(j = 0; j < 25; j++)
       {
           int temp = (i+1)*(i+1) + (j+1)*(j+1);
           if(temp == 512)
               printf("礼包在第%d排,第%d列!\n",i+1,j+1);
       }
   }
}

12.编写一个程序,读取用户输入的字符串,并将其反转输出

/**
*编写一个程序,读取用户输入的字符串,并将其反转输出
*/
void t_12()
{
   char str[30];
   fgets(str,30,stdin);
   char str_turn[30];
   int len = strlen(str);
   int i;
   len--; //去掉'\0'
   for(i = 0; i < len; i++)
   {
       if(str[len - i - 1] == '\n')
           continue;
       str_turn[i] = str[len - i - 1];
   }
   printf("%s\n",str_turn);
}

13.编写一个程序,判断用户输入字符串是否为回文

/**
*编写一个程序,判断用户输入字符串是否为回文
*/
void t_13()
{
   char arr[30];
   fgets(arr,30,stdin);
   int len = strlen(arr);
   //fgets会将\n也算进去,所以末尾为\n时要移除
   if(arr[len - 1] == '\n')
   {
       arr[len - 1] = '\0';
       len--;
   }
   int is_flag = 1;
   for(int i = 0; i < len/2; i++)
   {
       if(arr[i] != arr[len-i-1])
           is_flag = 0;
   }
   if(is_flag)
       printf("是回文数据!\n");
   else printf("不是回文数据!\n");
}

14.求一个矩阵的鞍点(行最大的同时列也最大)

/**
*求一个矩阵的鞍点(行最大的同时列也最大)
*/
void t_14()
{
   int arr[4][5] = {99,35,46,13,89,13,34,56,86,12,56,25,34,27,3,48,67,53,19,24};
   int i,j;
   int sum = 0;
   int max_row;         //存放每行最大值
   int row = sizeof(arr) / sizeof(arr[0]);
   int col = sizeof(arr[0]) / sizeof(arr[0][0]);
   int max_col[col];    //存放每列最大值
   int max_row_i[row];  //存放每行最大数的列
   int max_col_j[col];  //存放每列最大数的行
   printf("设有二维数组如下:\n");
   for(i = 0; i < row; i++)
   {
       for(j = 0; j < col; j++)
       {
           printf("%-4d",arr[i][j]);
       }
       printf("\n");
   }
   for(i = 0; i < row; i++)
   {
       max_row = arr[i][0]; 
       for(j = 0; j < col; j++)
       {
           if(arr[i][j] > max_row)
           {
               max_row = arr[i][j];
               max_row_i[i] = j;
           }
           if(i == 0)
           {
               max_col[j] = arr[i][j];
               max_col_j[j] = i;
           }
           else if(i > 0)
           {
               if(max_col[j] < arr[i][j])
               {
                   max_col[j] = arr[i][j];
                   max_col_j[j] = i;
               }
           }
       }
   }
   for(i = 0; i < row; i++)
   {
       for(j = 0; j < col; j++)
       {
           if(j == max_row_i[i] && i == max_col_j[j])
               printf("%d是一个鞍点!\n",arr[i][j]);
       }
   }
}


http://www.kler.cn/a/446535.html

相关文章:

  • OB删除1.5亿数据耗费2小时
  • 开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述
  • 《计算机组成及汇编语言原理》阅读笔记:p9-p27
  • 构建MacOS应用小白教程(打包 签名 公证 上架)
  • centos7下制作DockerFile 镜像
  • 牛客月赛107
  • 云消息队列 Kafka 版
  • 前端数据可视化库介绍Echarts、D3.js、Plotly、Matplotlib
  • 各种开源汇编、反汇编引擎的非专业比较
  • 电子应用设计方案-65:智能餐桌系统方案设计
  • Windows 无法启动 Redis服务(位于本地计算机上)错误 1067
  • 3349、检测相邻递增子数组 Ⅰ
  • SpringCloudAlibaba | Sentinel从基础到进阶
  • Three.js入门-Raycaster鼠标拾取详解与应用
  • 【蓝桥杯】43696.小数第n位
  • 如何创建属于自己的大语言模型:从零开始的指南
  • 目标检测与R-CNN——pytorch与paddle实现目标检测与R-CNN
  • 互联网医院系统,互联网医院系统源码可供
  • 固定资产分类,提升资产盘活效益
  • flink实现复杂kafka数据读取