【c语言数组精选代码题】
c语言数组精选代码题
- 四、数组
- 4.1逆序数组
- 4.2最值交换
- 4.3数组排序
- 4.4统计数字频次
- 4.5输出矩阵
- 4.6矩阵运算
- 4.7找字符串索引
- 4.8找字符串索引
- 4.9统计字母频次
- 4.10最长字符串🚀
- 4.10字符串比较
- 4.12字符串的插入🚀
- 4.13字符串的删除🚀🚀
👍链接: 书接上会,精选基础c语言代码
四、数组
4.1逆序数组
#include <stdio.h>
int main()
{
int n,temp,i,j;
int a[10];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0,j=n-1;i<=j;i++,j--){
temp=a[i],a[i]=a[j],a[j]=temp; //两值交换,三个变量实现
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
tips:双指针交换法,一个从前遍历,一个从后遍历,这样不回溯。
4.2最值交换
#include <stdio.h>
int main()
{
int N,temp,max=0,min=0;
int i;
int a[10];
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&a[i]); //给数组赋值
if(a[min]>a[i]){ //找最小值索引
min=i;
}
}
temp=a[0];a[0]=a[min];a[min]=temp; //最小值与第一个元素交换
for(i=0;i<N;i++){ //找最大值索引
if(a[max]<a[i]){
max=i;
}
}
temp=a[N-1];a[N-1]=a[max];a[max]=temp; //最大值与最后一个元素交换
for(i=0;i<N;i++){
printf("%d ",a[i]);
}
return 0;
}
注意长度位N的数组,最后一个元素下标是N-1
4.3数组排序
#include <stdio.h>
#define N 100
//冒泡排序
void bubbleSort(int arr[], int n){
int i,j,temp;
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
temp=arr[j],arr[j]=arr[j+1],arr[j+1]=temp;
}
}
}
}
int main() {
int arr[N];
int i = 0;
char ch;
// 读取输入数据,以回车结束
while(scanf("%d%c",&arr[i],&ch)==2){
i++;
if(ch=='\n'){
break;
}
}
// 调用冒泡排序函数
bubbleSort(arr, i);
// 输出排序后的结果
for (int j = 0; j < i; j++) {
printf("%d ", arr[j]);
}
return 0;
}
注意:学习如何实现输入回车时结束循环!定义数组时,数组大小不能用变量!函数定义不能嵌套,要在main函数外面定义。
//简单选择排序
void selectionSort(int arr[], int n) {
int i, j, min_idx, temp;
for (i = 0; i < n - 1; i++) {
min_idx = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
// 直接插入排序函数
void insertionSort(int arr[], int n) {
int i, j, key;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 将大于key的元素向后移动
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
4.4统计数字频次
#include <stdio.h>
#define MAX_N 1000
int main() {
int n;
int arr[MAX_N];
int count[MAX_N] = {0}; //计数的东西一定要初始化,此时数组的1000个元素都为0
int i, j;
scanf("%d", &n);
// 读取整数序列
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 统计每个整数出现的次数
for (i = 0; i < n; i++) {
count[arr[i]]++;
}
// 找出出现次数最多的整数及其出现次数
int max = 0;
int max_index = 0;
for (i = 0; i < n; i++) {
if (count[i] > max) {
max= count[i];
max_index = i;
}
}
// 输出结果
printf("%d %d\n", max_index,max);
return 0;
}
统计频率的思路:
对于 arr 数组中的每一个元素 arr[i],将其作为 count 数组的下标。
每次遇到一个整数,就将 count 数组中对应下标的元素值加 1。例如,如果 arr[i] 的值是 5,那么 count[5] 的值就会加 1。这样,count 数组中每个下标位置的值就代表了该下标对应的整数在整数序列中出现的次数。
注意:存在一个潜在问题,它假设输入的整数范围在 0 到 MAX_N - 1 之间。若输入的整数超出这个范围,会引发数组越界错误。
🎈第二个方法:
#include <stdio.h>
int main() {
int N, i, j;
scanf("%d", &N);
int arr[N], counter[N];
for (i = 0; i < N; i++)
scanf("%d", &arr[i]); //输入
for (i = 0; i < N; i++)
counter[i] = 0; //初始化
for (i = 0; i < N; i++)
for (j = 0; j < N; j++) //统计频次
if (arr[i] == arr[j])
counter[i]++;
int maxIndex = 0;
for (i = 1; i < N; i++)
if (counter[i] > counter[maxIndex])
maxIndex = i; //找出现次数最多的元素
printf("%d %d", arr[maxIndex], counter[maxIndex]);
return 0;
}
思想就是暴力。虽然有重复统计,但是先统计那个数的个数肯定比后面再出现这个数统计数大
4.5输出矩阵
#include <stdio.h>
int main() {
int m, n;
scanf("%d %d", &m, &n);
int matrix[m][n];
// 赋值
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
matrix[i][j] = i + j;
// 输出
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", matrix[i][j]); // 这里%4d保证每个数占4位右对齐
}
printf("\n");
}
return 0;
}
如果编程语言环境不支持使用变量定义数组(比如在 C 语言的一些较老的编译器中不支持 C99 标准下的变长数组特性),可以使用动态内存分配的方式来实现类似功能。
#include <stdio.h>
#include <stdlib.h>
int main() {
int m, n;
scanf("%d %d", &m, &n);
// 动态分配二维数组的内存
int **matrix = (int **)malloc(m * sizeof(int *));
for (int i = 0; i < m; i++) {
matrix[i] = (int *)malloc(n * sizeof(int));
}
// 赋值
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
matrix[i][j] = i + j;
}
}
// 输出
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", matrix[i][j]);
}
printf("\n");
}
// 释放动态分配的内存
for (int i = 0; i < m; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
也可以直接定义一个大点的二维数组a[20][20]
4.6矩阵运算
#include <stdio.h>
int main() {
int n,i,j;
scanf("%d", &n);
int matrix[10][10];
for (i = 0; i < n; i++) //比较老的编译器也不支持在for循环里定义变量int i=0;
for (j = 0; j < n; j++)
scanf("%d", &matrix[i][j]);
int sum = 0;
for ( i = 0; i < n; i++) {
for ( j = 0; j < n; j++) {
//舍去副对角线、最后一列和最后一行的元素
if (i != n-1 && j != n-1 && i+j != n-1) {
sum += matrix[i][j];
}
}
}
printf("%d", sum);
return 0;
}
4.7找字符串索引
#include <stdio.h>
int main() {
int i=0, index=-1;//初始化假设没找到,设为-1
char c; //存放用户指定字符
char s[81]; //多一位放字符串结尾标志符
scanf("%c", &c);
getchar(); //接收用户上一次输入敲击的回车
gets(s);
//逐一遍历查找
while(s[i] != '\0') {
if(s[i] == c)
index = i;
i++;
}
if(index == -1)
printf("Not Found");
else
printf("index = %d",index);
return 0;
}
4.8找字符串索引
#include <stdio.h>
int main() {
int i = 0;
char ch[101];
while ((ch[i] = getchar()) != '#') {
if (ch[i] >= 'a' && ch[i] <= 'z') {
ch[i] -= 32;
}
if (ch[i] >= 'A' && ch[i] <= 'Z') {
ch[i] += 32;
}
i++;
}
while (i >= 0) {
putchar(ch[i]);
i--;
}
return 0;
}
4.9统计字母频次
#include <stdio.h>
#define MAX_N 128
int main() {
int i=0;
char str[81],ch;
int count[MAX_N] = {0}; //计数的东西一定要初始化,此时数组的128个元素都为0
gets(str); //有空格不能用scanf
ch=getchar();
// 统计每个整数出现的次数
while(str[i]!='\0'){
count[str[i]]++;
i++; //忘了它会是死循环
}
printf("%d\n",count[ch]);
return 0;
}
gets()函数会读入空格 ,但不会读入回车。在输入时,它以回车键作为输入结束的标志,具体说明如下:
读入空格:gets()函数用于从标准输入设备(通常是键盘)读取字符串。与scanf()函数不同,gets()把空格视为字符串的一部分,可以读取包含空格的字符串, 直到遇到回车键才停止读取。
输入结束条件:当用户按下回车键时,gets()认为输入结束。不过,回车键产生的换行符不会被存储在字符数组中,而是被替换为字符串结束标志’\0’ 。gets()
函数会消化掉回车键。当你输入字符串并按下回车键后,gets()
会读取除回车键之外的字符序列存入指定的字符数组,然后自动在读取内容末尾添加字符串结束符'\0'
,回车键产生的换行符不会被留在字符数组里 ,相当于被gets()
处理掉了。
scanf函数读入字符串时遇到空格、制表符(\t)或换行符(\n)就会结束读入。
4.10最长字符串🚀
#include <stdio.h>
#include <string.h>
int main(){
int n, i, j, counter = 0, maxlength = 0;
char str[81], result[81]; //k用于存放最长的字符串
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%s", str);
getchar();
//统计字符长度
for(j = 0; str[j] != '\0'; j++)
counter++;
if(maxlength < counter){
maxlength = counter;
strcpy(result, str); //复制str字符串到result中
}
counter = 0; //重置为空以便接收下一个字符
}
printf("The longest is: %s",result);
}
不必把n个字符串都保存下来再统一比较,仅需通过循环,每次两两比较就可以。
4.10字符串比较
#include<stdio.h>
int main(){
int result, i = 0;
char s1[101], s2[101];
gets(s1); gets(s2);
while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0'){
i++; //逐个比较
}
//两个字符串完全相等
if(s1[i] == '\0' && s2[i] == '\0'){
result = 0;
}
//s1和s2的第i个字符出现了不同
else
result = ( s1[i] - s2[i] ) > 0 ? 1 : -1;
printf("%d",result);
return 0;
}
这就是实现了strcmp函数的功能!
4.12字符串的插入🚀
#include <stdio.h>
#include <string.h>
int main() {
char str1[201], str2[101];
int pos;
gets(str1);
gets(str2);
scanf("%d", &pos);
//改为物理索引
pos--;
// 拼接字符串
int len1 = strlen(str1);
int len2 = strlen(str2);
//先把pos后的元素后移
for (int i = len1; i >= pos; i--) {
str1[i + len2] = str1[i];
}
//插入
for (int i = 0; i < len2; i++)
str1[pos + i] = str2[i];
printf("%s", str1);
return 0;
}
注意:注意位置和下标的区别
4.13字符串的删除🚀🚀
#include <stdio.h>
#include <string.h>
int main() {
char str[101], subStr[101];
gets(str);
gets(subStr);
int start = 0; //从原字符串start的位置开始匹配
int len = strlen(str);
int subLen = strlen(subStr);
// 删除指定字符串
while(start <= len - subLen) {
//比较是否有匹配的字串
int found = 1;
for (int i = 0; i < subLen; i++) {
if (str[start + i] != subStr[i]) {
found = 0;
break;
}
}
if (found) { //如果found为1则代表匹配到了子串
//用后面部分覆盖子串
for (int i = start + subLen; i < len; i++) {
str[i - subLen] = str[i];
}
//注意要减少原串的长度
len = len - subLen;
}
else
start++;
}
str[len] = '\0'; // 添加字符串结束符
printf("%s", str);
return 0;
}