一维数组
1键盘录入一组数列,利用冒泡排序将数据由大到小排序
/*************************************************************************> File Name: work11.c> Author: sgc> Description: 键盘录入一组数列,利用冒泡排序将数据由大到小排序> Created Time: 2024年12月04日 星期三 10时29分37秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义排序数组int arr[10];// 计算数组长度int len = sizeof(arr)/sizeof(arr[0]);// 遍历输入for( int i = 0; i < len; i++){scanf("%d", arr + i); // 从控制台输入等价于&arr[i]}// 冒泡排序for( int i = 0; i < len - 1; i++ ){for( int j = 0; j < len - i - 1; j++ ){if( arr[j] < arr[j+1] ){arr[j] = arr[j] ^ arr[j+1];arr[j+1]= arr[j] ^ arr[j+1];arr[j] = arr[j] ^ arr[j+1];}}}// 遍历输出for( int i = 0; i < len; i++ ){printf("%d ", *(arr + i)); // 等价于a[i]}printf("\n");return 0;
}
运行截图:
// 不完全优化,利用双向冒泡的思维
/*************************************************************************> File Name: work11.c> Author: sgc> Description: 键盘录入一组数列,利用冒泡排序将数据由大到小排序> Created Time: 2024年12月04日 星期三 10时29分37秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义排序数组int arr[10];// 计算数组长度int len = sizeof(arr)/sizeof(arr[0]);// 遍历输入for( int i = 0; i < len; i++){scanf("%d", arr + i); // 从控制台输入等价于&arr[i]}// 冒泡排序for( int i = 0; i < (len - 1)/2; i++ ){for( int j = 0, k = (len-1); (j < (len - i)/2 - 1) || ( k >(len - 1)/2 - 1 ); j++, k-- ){if( arr[j] > arr[j+1] ){arr[j] = arr[j] ^ arr[j+1];arr[j+1]= arr[j] ^ arr[j+1];arr[j] = arr[j] ^ arr[j+1];}if( arr[k] < arr[k-1] ){arr[k] = arr[k] ^ arr[k-1];arr[k-1]= arr[k] ^ arr[k-1];arr[k] = arr[k] ^ arr[k-1];}}}// 遍历输出for( int i = 0; i < len; i++ ){printf("%d ", *(arr + i)); // 等价于a[i]}printf("\n");return 0;
}
运行截图
2从键盘输入年、月、日,计算并输出该日是该年第几天
/*************************************************************************> File Name: work12.c> Author: sgc> Description: 从键盘输入年、月、日,计算并输出该日是该年第几天> Created Time: 2024年12月04日 星期三 10时29分46秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义存放每月天数的数组int a[]={ 31,28,31,30,31,30,31,31,30,31,30,31 };// 接收用户输入的年月日份int year, month, day;printf("请输入年.月.日:");scanf("%d.%d.%d", &year, &month, &day);// 判断是否是闰年if( (year%4 == 0 && year%100 != 0)|| year%400 == 0 ) a[1] = 29;// 计算还有多少天for( int i = 0; i < month - 1; i ++ ){day += a[i];}printf("今天是该年的第%d天\n", day);return 0;
}
运行截图
3键盘录入一组数列,求最大数、最小数、均值
/*************************************************************************> File Name: work13.c> Author: sgc> Description: 键盘录入一组数列,求最大数、最小数、均值> Created Time: 2024年12月04日 星期三 10时29分54秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义存放数列的数组int arr[10];printf("请输入(10个):");// 定义最大最小值, 和int max = -2147483648, min = 2147483647, sum = 0;int len = sizeof(arr)/sizeof(arr[0]);// 遍历输入for( int i = 0; i < len ; i++ ){scanf("%d", arr + i);// 判断最大值if(arr[i] > max){max = arr[i];}// 判断最小值if(arr[i] < min ){min = arr[i];}// 累加sum += arr[i];}printf("MAX=%d,MIN=%d,平均值=%d\n", max, min, sum/10 );return 0;
}
运行截图
4从键盘录入一组数列,判断是否是回文,举例:12321,abba,121
/*************************************************************************> File Name: work14.c> Author: sgc> Description: 从键盘录入一组数列,判断是否是回文,举例:12321,abba,121> Created Time: 2024年12月04日 星期三 10时30分03秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 创建一个数组接收字符串char arr[50];printf("请输入:");// %s以字符串形式输入,不需要用循环scanf("%s", arr);// 定义一个用来接收字符串大小的变量int len;// 定义一个标记位int a = 1;for(int i = 0; i < sizeof(arr)/sizeof(char); i++){if ( arr[i] == '\0' ) break;len = i;}for( int i = 0; i < len; i++, len-- ){if( arr[i] != arr[len] ){a = 0;printf("%s不是回文\n", arr);break;}}if(a){printf("%s是回文\n", arr);}return 0;
}
运行截图
5用数组存储10个整型数,通过键盘输入一个数,找出该数在数组中的下标值;
/*************************************************************************> File Name: work15.c> Author: sgc> Description: 用数组存储10个整型数,通过键盘输入一个数,找出该数在数组中的下标值;> Created Time: 2024年12月04日 星期三 10时30分42秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义一个用于查找的数组int arr[10] = {11,12,13,14,15,16,17,18,19,20};// 用于接收用户输入int a;printf("请输入你想查找的值:");scanf("%d", &a);// 定义一个标志位int b = 1;for( int i = 0; i < sizeof(arr)/sizeof*(arr+1); i++ ){if( a == arr[i] ){b = 0;printf("%d的下标是arr[%d]\n", a, i);break;}}if( b ) printf("%d的下标是arr[-1]\n", a);return 0;
}
运行截图
6通过键盘输入 10 个学员成绩, 1)输出不及格学员的成绩和下标。 2)求最高分的下标值 3)求最低成绩的下标值 4)求总成绩及平均成绩
/*************************************************************************> File Name: work16.c> Author: sgc> Description: 通过键盘输入 10 个学员成绩, 1)输出不及格学员的成绩和下标。 2)求最高分的下标值 3)
求最低成绩的下标值 4)求总成绩及平均成绩> Created Time: 2024年12月04日 星期三 10时30分51秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{int a[10] = { 24,60,78,99,64,14,64,78,78,65 };int sum = 0, max = 0, max_1 , min = 100, min_1;for( int i = 0; i < 10; i++ ){if( max < a[i] ){max_1 = i;max = *(a + i);}if( min > *(a + i) ){min_1 = i;min = a[i];}if(a[i] < 60) printf("%d不及格,下标是a[%d] ", a[i], i);sum += a[i];}printf("\n");printf("MAX=%d下标是a[%d],MIN%d下标是a[%d],SUM=%d,平均成绩=%d\n", max, max_1, min, min_1, sum, sum/10);return 0;
}
运行截图
二维数组
1一个二维数组赋了初值,用户输入一个数,在该二维数组中查找。找到则返回行列位置,没找到则提示。
/*************************************************************************> File Name: work21.c> Author: sgc> Description: 一个二维数组赋了初值,用户输入一个数,在该二维数组中查找。找到则返回行列位置,没找到则提示。> Created Time: 2024年12月04日 星期三 10时31分07秒************************************************************************/#include <stdio.h>
#include <string.h>int main(int argc,char *argv[])
{// 定义并初始化一个供查找的数组char arr[3][4] = {11,12,13,14,21,22,23,24,31,32,33,34};// 定义一个输入想要查找的数字int a;printf("请输入:");scanf("%d", &a);// 定义一个标志位,判断是否找到对应的数字int no_a = 1;// 循环遍历数组for( int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++ ){// 循环遍历数组内的数组的元素for( int j = 0; j < sizeof(arr[0])/sizeof(arr[0][0]); j++ ){if( a == arr[i][j] ){no_a = 0;printf("%d的下标是arr[%d][%d]\n", a, i, j );}}}if(no_a) printf("%d的下标是arr[-1]\n", a);return 0;
}
运行截图
2二维整型数组,求所有元素平均值,求每行最大值,求每列最小值。
/*************************************************************************> File Name: work22.c> Author: sgc> Description: 二维整型数组,求所有元素平均值,求每行最大值,求每列最小值。> Created Time: 2024年12月04日 星期三 10时31分14秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义并初始化一个供.查找的数组int arr[3][4] = {11,12,99,14,21,22,23,6,31,32,33,34};// 定义每个元素和的变量int sum = 0, sub1,sub2;// 定义最大最小的变量,并进行赋初值int max, min;// 定义并初始化外层,内层数组的大小int len1 = sizeof(arr)/sizeof(arr[0]),len2 = sizeof(arr[0])/sizeof(arr[0][0]);// 循环遍历数组,最大循环数为行和列中的最大值for( int i = 0; i < ( len1 > len2 ? len1 : len2 ); i++ ){int j;// 定义最大最小的变量,并进行赋初值max = -2147483648, min = 2147483647;// 判断i的值是否越界if( i < len1 ){// 正常遍历数组,找出行中的最大值for( j = 0; j < len2; j++){// 判断是否为行中的最大值if( max < arr[i][j] ){// *(*(arr + i) + j)等价于arr[i][j]max = *(*(arr + i) + j);sub1 = i;sub2 = j;}// 遍历数组的同时进行累加操作sum += arr[i][j];}// 每一行遍历完毕就输出改行最大值printf("第%d行的MAX是%d,下标为arr[%d][%d]\n", i+1, max, sub1, sub2);}// 反向遍历列,每一列遍历完就输出最小值// 此时,j作为行i作为列for( j = len1 -1; j >= 0; j-- ){// 判断是否为列中的最小值if( min > arr[j][i] ){min = arr[j][i];sub1 = j;sub2 = i;}}printf("第%d列的MIN是%d,下标为arr[%d][%d]\n", i+1, min, sub1, sub2);}printf("平均值是%d\n", sum/(len1*len2));return 0;
}
运行截图:
3在行列相等数组计算主对角线元素的和
/*************************************************************************> File Name: work23.c> Author: sgc> Description: 在行列相等数组计算主对角线元素的和> Created Time: 2024年12月04日 星期三 10时31分22秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义一个行列相等的数组int arr[3][3] = { 11,12,13,14,15,16,17,18,19};// 定义一个累和值int sum = 0;// 循环遍历外围数组for( int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++ ){// 循环遍历内层数组for( int j = 0; j < sizeof(arr[0])/sizeof(arr[0][0]); j++ ){// 判断行列下标是否相等if( i == j){// 进行累加sum += arr[i][j];// 一旦进行累加,跳出本次循环break;}}}printf("在行列相等数组计算主对角线元素的和是:%d\n", sum);return 0;
}
运行截图:
两条对角线
/*************************************************************************> File Name: work23.c> Author: sgc> Description: 在行列相等数组计算主对角线元素的和> Created Time: 2024年12月04日 星期三 10时31分22秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义一个行列相等的数组int arr[4][4] = { 11,12,13,2,14,15,16,3,17,18,19,3,13,44,26,13};// 定义一个累和值int sum = 0;// 循环遍历外围数组for( int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++ ){sum += arr[i][i];}for( int j = sizeof(arr[0])/sizeof(arr[0][0])-1, k = 0; j >= 0 ; j--, k++){if( k == j ) break;sum += arr[k][j];}printf("在行列相等数组计算主对角线元素的和是:%d\n", sum);return 0;
}
运行截图
4计算一个矩阵下三角元素的和
/*************************************************************************> File Name: work24.c> Author: sgc> Description: 计算一个矩阵下三角元素的和> Created Time: 2024年12月04日 星期三 10时31分28秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{// 定义一个二维数组,并进行初始化int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};// 累加求和int sum1 = 0, sum2 = 0;int b = sizeof(a[0])/sizeof(a[0][0])-1 ;// 遍历行for(int i = 0; i < sizeof(a)/sizeof(a[0]) ; i++ ){// 遍历列 ,反向遍历// 右下角for(int j = b; j < sizeof(a[0])/sizeof(a[0][0]) ; j++ ){sum1 += a[i][j];}b--;// 左下角for( int j = 0; j <= i; j++ ){sum2 += a[i][j];}}printf("矩阵左下三角元素的和:%d\n右下三角元素的和:%d\n", sum2, sum1);return 0;
}
运行截图:
5电影院为了答谢影迷的支持,在某一排的某一列座位上放置了一个大礼包,放置礼物的位置具有这样的规则(行和列的平方和为开店日期 512(5月12日)); 请设计程序找出大礼包的位置,(假定电影院有20排,每排25个座位)
/*************************************************************************> File Name: work25.c> Author: sgc> Description: 电影院大礼包> Created Time: 2024年12月04日 星期三 10时31分34秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{for( int i = 1; i < 25; i++ ){for( int j = 1; j < 20; j++ ){if(j*j+i*i == 512){printf("第%d排,第%d个座位,即%d行%d列\n换算成数组下标为a[%d][%d]\n", j, i, i, j, i-1, j-1);break;}}}return 0;
}
字符数组
1编写一个程序,读取用户输入的字符串,并将其反转输出。
/*************************************************************************> File Name: work31.c> Author: sgc> Description: 编写一个程序,读取用户输入的字符串,并将其反转输出。> Created Time: 2024年12月04日 星期三 10时31分53秒************************************************************************/#include <stdio.h>
#include <string.h>int main(int argc,char *argv[])
{char a[10];// 键盘输入scanf("%s", a);// 获取字符串大小// 反向遍历for(int i = strlen(a); i >=0; i-- ){printf("%c", a[i]);}printf("\n");return 0;
}
运行截图
2编写一个程序,判断用户输入的字符串是否为回文(即正反读都一样的字符串)。
/*************************************************************************> File Name: work32.c> Author: sgc> Description: 编写一个程序,判断用户输入的字符串是否为回文(即正反读都一样的字符串)。> Created Time: 2024年12月04日 星期三 10时32分00秒************************************************************************/#include <stdio.h>
#include <string.h>int main(int argc,char *argv[])
{char a[20];printf("请输入:");gets(a);// 判断是否是回文的标志位,默认是int flag = 1;int len = strlen(a);for(int i = 0, j = len - 1; i <= j; i++, j-- ){if( a[i] != a[j] ){printf("%s不是回文\n", a);flag = 0;break;}}// 判断是回文if(flag){printf("%s是回文\n", a);}return 0;
}
运行截图
思考题
1.求出一个矩阵的鞍点。鞍点的含义为行上最大同时列上也最大。
/*************************************************************************
> File Name: work41.c
> Author: sgc
> Description: 求矩阵鞍点
> Created Time: 2024年12月04日 星期三 10时32分09秒
************************************************************************/#include <stdio.h>int main(int argc, char *argv[])
{// 定义并初始化一个供.查找的数组int arr[3][4] = {11, 12, 99, 14,21, 22, 23, 6,31, 32, 33, 34};// 定义两个下标int sub1,sub2;// 定义最大的变量int max1, max2;// 定义一个标记位,标记该数是否位鞍点,默认为是int flag = 1;// 定义并初始化外层,内层数组的大小int len1 = sizeof(arr) / sizeof(arr[0]), len2 = sizeof(arr[0]) / sizeof(arr[0][0]);// 循环遍历数组,最大循环数为行和列中的最大值for (int i = 0; i < len1 ; i++){max1 = -2147483648,max2 = -2147483648 ;flag = 1;// 正常遍历数组,找出行中的最大值for (int j = 0; j < len2; j++){// 判断是否为行中的最大值if (max1 < arr[i][j]){// *(*(arr + i) + j)等价于arr[i][j]max1 = *(*(arr + i) + j);sub1 = i;sub2 = j;}else if( max1 == arr[i][j] ){lag = 0;break;}}// 纵向遍历行最大值对应的列for( int k = 0; k < len1; k++ ){// 找出列中的最大值if( max2 < arr[k][sub2]){max2 = arr[k][sub2];sub1 = k;}else if( max2 == arr[k][sub2] ){flag = 0;break;}}// 根据标志位怕判断是否为鞍点if(flag && max1 == max2){printf("该矩阵的鞍点是%d,下标是arr[%d][%d]\n", arr[sub1][sub2], sub1, sub2);}}return 0;
}
运行 截图: