数组练习题

1.打印X图案

  • if ((i == j) ||( i + j == n - 1))

  • 循环打印了一个行和列相同的数组

  • 当i==j的时候 打印正斜线

  • i+j==n-1的时候打印反斜线

cpp 复制代码
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        for (int i = 0; i < n; i++)  //外循环为行
        {
            for (int j = 0; j < n; j++) //内循环为列
            {
                if (i == j || i + j == n - 1)
                    //最关键的地方,正斜线为[i][i]处是*, 反斜杠为[i][n-1-j]处是*,一行打印1个或2个*
                    printf("*");
                else
                    printf(" ");
            }
            printf("\n"); //打印完一行,换行
        }
    }
    return 0;
}
复制代码

2.打印空心正方形

用于判断当前打印的位置是否应该是星号 * 的条件。具体来说,if(i==0||i==n-1||j==0||j==n-1) 这个条件判断的逻辑是:

  • i==0:判断当前行是不是第一行(因为行计数从0开始)。

  • i==n-1:判断当前行是不是最后一行。n-1 是最后一行的行索引。

  • j==0:判断当前列是不是第一列。

  • j==n-1:判断当前列是不是最后一列。

如果这四个条件中的任何一个为真,说明当前的 (i, j) 位置位于正方形的边缘(要么是顶部,底部,左侧或右侧边界)。因此,在这些位置上应该打印一个星号 * 。如果这个条件不成立,那么说明当前位置在正方形的内部,应该打印空格 。这种设计确保了正方形的边缘由星号构成,而内部为空。

cpp 复制代码
//打印空心正方形
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        for (int i = 0; i < n; i++)  //外循环为行
        {
            for (int j = 0; j < n; j++) //内循环为列
            {
                if ((i == 0 || i == n - 1) ||( j == 0 || j == n - 1))//找规律
                    printf("* ");
                else
                    printf("  ");
            }
            printf("\n");
        }
    }
}
​

3.数组转置

  • 将数组的行和列调换
cpp 复制代码
//数组转置
int main() {
    int i = 0;
    int j = 0;
    int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    for (i = 0; i < 3; i++) {
        for ( j = 0; j <3 ; j++)
        {
            printf("%d", arr[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++)
        {
            printf("%d", arr[j][i]);
        }
        printf("\n");
    }
​
    
}

4.逆序输出

cpp 复制代码
#include<stdio.h>
void Reverse(int arr[], int sz) {
    int l = 0;                   //左下标,从0开始
    int r = sz - 1;              //右下标,从数组最后一项开始
    while (l < r) {              //交换数字,直到左下标大于右下标
        int tmp = 0;
        tmp = arr[l];
        arr[l] = arr[r];
        arr[r] = tmp;
        l++;
        r--;
    }
}
int main() {
    int arr[10] = {0};
    for (int i = 0; i < 10; i++) {
        scanf("%d ", &arr[i]);
    }
    int sz = sizeof(arr) / sizeof(arr[0]);
    Reverse(arr, sz);                  //逆序
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
}
复制代码

5.有序序列合并

  • 描述

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

数据范围: 1≤𝑛,𝑚≤1000 1≤n ,m ≤1000 , 序列中的值满足 0≤𝑣𝑎𝑙≤30000 0≤val≤30000

  • 输入描述:

输入包含三行,

第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。

第二行包含n个整数,用空格分隔。

第三行包含m个整数,用空格分隔。

  • 输出描述:

输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

cpp 复制代码
int main()
{
    int n = 0;
    int m = 0;
    int arr1[1000] = {0};
    int arr2[1000] = {0};
    //输入n和m
    scanf("%d %d",&n,&m);
    int i = 0;
    int j = 0;
    //输入两个升序序列
    for(i=0; i<n; i++)
    {
        scanf("%d",&arr1[i]);
    }
    for(i=0; i<m; i++)
    {
        scanf("%d",&arr2[i]);
    }
    //合并有序序列并输出
    i=0;j=0;
    while(i<n && j<m)
    {
        if(arr1[i] < arr2[j])   ///拿arr1中的元素逐个与arr2中的第一个元素比较,小的输出在前
        {
            printf("%d ",arr1[i]);
            i++;
        }
        else
        {
            printf("%d ",arr2[j]); //如果arr2中小的话输出arr2
            j++;
        }
    }
    
   //判断尚未遍历完的数组是否需要打印输出
    if(i==n && j<m)
        for(;j<m;j++)
            printf("%d ",arr2[j]);
    else
        for(;i<n;i++)
            printf("%d ",arr1[i]);
    return 0;
}

6.计算平均值

  • 编写一个程序,从用户输入中读取10个整数并存储在一个数组中。然后,计算并输出这些整数的平均值
cpp 复制代码
int main() {
    int arr[10] = { 0 };
    int i = 0;
    int sum = 0;
    printf("请输入10个整数\n");
    for (i = 0; i < 10; i++) {
        scanf("%d",&arr[i]);
        sum += arr[i];
    }
    float average = (float)sum / 10;
    printf("平均数为:%.2f\n", average);
}

7.交换数组

cpp 复制代码
#include <stdio.h>
​
// 定义一个常量来表示数组的大小
#define ARRAY_SIZE 5
​
// 函数定义:交换两个数组的内容
void swapArrays(int arr1[], int arr2[], int size) {
    for (int i = 0; i < size; i++) {
        // 使用临时变量进行值的交换
        int temp = arr1[i];
        arr1[i] = arr2[i];
        arr2[i] = temp;
    }
}
​
int main() {
    // 定义两个数组A和B,并初始化它们的内容
    int arrayA[ARRAY_SIZE] = { 1, 2, 3, 4, 5 };
    int arrayB[ARRAY_SIZE] = { 6, 7, 8, 9, 10 };
​
    // 输出交换前的数组内容
    printf("交换前的数组A:");
    for (int i = 0; i < ARRAY_SIZE; i++) {
        printf("%d ", arrayA[i]);
    }
    printf("\n");
​
    printf("交换前的数组B:");
    for (int i = 0; i < ARRAY_SIZE; i++) {
        printf("%d ", arrayB[i]);
    }
    printf("\n");
​
    // 调用函数进行数组内容的交换
    swapArrays(arrayA, arrayB, ARRAY_SIZE);
​
    // 输出交换后的数组内容
    printf("交换后的数组A:");
    for (int i = 0; i < ARRAY_SIZE; i++) {
        printf("%d ", arrayA[i]);
    }
    printf("\n");
​
    printf("交换后的数组B:");
    for (int i = 0; i < ARRAY_SIZE; i++) {
        printf("%d ", arrayB[i]);
    }
    printf("\n");
​
    return 0;
}
​
相关推荐
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
ChoSeitaku7 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
DdddJMs__1357 小时前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
娃娃丢没有坏心思7 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
ahadee9 小时前
蓝桥杯每日真题 - 第11天
c语言·vscode·算法·蓝桥杯
No0d1es10 小时前
2024年9月青少年软件编程(C语言/C++)等级考试试卷(九级)
c语言·数据结构·c++·算法·青少年编程·电子学会
Che3rry10 小时前
C/C++|关于“子线程在堆中创建了资源但在资源未释放的情况下异常退出或挂掉”如何避免?
c语言·c++
kuiini12 小时前
C 语言学习-02【编程习惯】
c语言·学习
木辛木辛子12 小时前
L2-2 十二进制字符串转换成十进制整数
c语言·开发语言·数据结构·c++·算法