数组(ppt习题)

导例

问题描述:如何存储和操作某班的c语言考试成绩?

#include <stdio.h>

int main()
{
    int score[10] = {82,76,69,92,53,78,80,88,65,72};
    int i, t;
    for(i = 0; i < 9; i++)  //输出数组中的所有元素
    {
        printf("%d ", score[i]);
    }
    printf("\n");
    
    score[4] = 60;  //更改数组中第五项的乘积
    
    t = score[1];   //交换数组中的第二项和第七项
    score[1] = score[6];
    score[6] = t;
    
    for(i = 0; i< 9; i++)   //重新输出数组中的元素
    {
        printf("%d ", score[i]);
    }
    printf("\n");
    return 0;
}

练习

问题:某电视台要进行一次对该台8个栏目(设相应栏目编号为1~8)的受欢迎情况,共调查了1000位观众。现要求编写程序,输入每一位观众的投票,每位观众只能选择一个最喜欢的栏目投票,统计输出各栏目的得票情况。

#include <stdio.h>

int main()
{
    int prog[9];
    int i, j, n;
    for(i = 1; i <= 8; i++)
    {
        prog[i] = 0;
    }
    for(j = 1; j <= 5; j++)
    {
        printf("请输入最喜欢的栏目编号:");
        scanf("%d", &n);
        prog[n]++;
    }
    for(i = 1; i <= 8; i++)
    {
        printf("%d %d\n", i, prog[i]);
    }
    return 0;
}

将数组当作一个计数器,数组中数字增加的时候可以直接prog[n]++,n对应着需要增加的序号


使用一维数组编程

练习1

问题:定义一个长度是10的数组,输入一个正整数n (1<n≤10),再输入n个整数存入数组,输出平均值(保留2位小数)。

#include <stdio.h>

int main()
{
    int a[10];
    int n, m, i, j;
    float sum = 0, ave;
    scanf("%d", &n);
    
    for(i = 1; i <= 10; i++)
    {
        a[i] = 0;
    }
    
    for(j = 1; j <= n; j++)
    {
        scanf("%d", &m);
        a[j] = m;
        sum = sum + a[j];
    }

    ave = sum / n;
    printf("ave=%.2f\n", ave);
    return 0;
}

练习2

问题:用数组计算fibonacci数列的前10个数,并按每行打印5个数的格式输出。

#include <stdio.h>

int main()
{
    int fib[10];
    int i;
    for(i = 0; i < 10; i++)
    {
        fib[i] = 0;
    }
    fib[0] = 1;
    fib[1] = 1;
    for(i = 2; i < 10; i++)
    {
        fib[i] = fib[i-1] + fib[i-2];
    }
    for(i = 0; i < 10; i++)
    {
        printf("%6d ", fib[i]);
        if((i + 1) % 5 == 0)
        {
            printf("\n");
        }
    }
    return 0;
}

在上述代码中对数组的初始化可以进行简化,在定义的时候直接将Fibonacci数列的前两项输入进去,剩下的项就默认为0。

#include <stdio.h>

int main()
{
    int fib[10] = {1,1};
    int i;

    for(i = 2; i < 10; i++)
    {
        fib[i] = fib[i-1] + fib[i-2];
    }
    
    for(i = 0; i < 10; i++)
    {
        printf("%6d ", fib[i]);
        if((i + 1) % 5 == 0)
        {
            printf("\n");
        }
    }
    return 0;
}

同时要注意在判断每行的个数时要把下角标加1


练习3

问题:输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。

#include <stdio.h>

int main()
{
    int a[5];
    int n, x, i, flag;
    printf("请输入5个整数:");
    
    for(i = 0; i < 5; i++)
    {
        scanf("%d", &n);
        a[i] = n;
    }
    
    printf("请输入一个数:");
    scanf("%d", &x);
    
    for(i = 0; i < 5; i++)
    {
        if(x == a[i])
        {
            printf("%d\n", i);
            flag = 1;
        }
    }
    
    if(flag != 1)
    {
        printf("Not Found\n");
    }
    
    return 0;
}

flag用于记录循环中满足条件的数


练习4

问题:输入n(n<10),再输入n个数。(1) 输出最小值和它所对应的下标 (2) 将最小值与第一个数交换,输出交换后的n个数。

#include <stdio.h>

int main()
{
    int a[9] = {0};
    int n, min, i, t, x;
    printf("请输入一个小于十的数:");
    scanf("%d", &n);
    min = a[0];

    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        if(min > a[i])
        {
            min = a[i];
            x = i;
            printf("最小值为%d, 下标为%d\n", min, x);
        }
    }

    t = a[x];
    a[x] = a[0];
    a[0] = t;

    for(i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

练习5

问题:输入一个正整数n(1<n<=10),再输入n个整数,将它们存入数组a中,再输入一个整数x,然后在数组a中查找与x相同的元素。如果找到,输出x在数组a中对应元素的最小下标,如果没有找到,输出相应信息。

#include <stdio.h>

int main()
{
    int a[10] = {0};
    int n, x, i, flag;
    printf("请输入一个在2-10之间的正整数:");
    scanf("%d", &n);
    printf("请输入%d个数:", n);

    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    printf("请输入一个数:");
    scanf("%d", &x);

    flag = 0;
    for(i = 0; i < n; i++)
    {
        if(x == a[i])
        {
            flag = 1;
            break;
        }
        else
        {
            flag = 0;
        }
    }
    
    if(flag == 1)
    {
        printf("%d:a[%d]\n", x, i);
    }
    else
    {
        printf("%d:not found\n", x); 
    }
    return 0;
}

练习6

问题:输入一个正整数n (1<n<=10),再输入n个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。

#include <stdio.h>

int main()
{
    int a[10] = {0};
    int n, min, max, t, u, i, x, y;
    
    printf("请输入一个在2-10之间的整数:");
    scanf("%d", &n);
    printf("请输入%d个整数:", n);


    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    min = a[0];     //(1)
    max = a[n-1];   //(1)
    x = 0;          //(2)
    y = n-1;        //(2)

    for(i = 0; i < n; i++)    
    {   
        if(min > a[i])
        {
            min = a[i];
            x = i;
        }
        if(max < a[i])
        {
            max = a[i];
            y = i;
        }
    }

    t = a[0];
    a[0] = a[x];
    a[x] = t;

    u = a[n-1];     //(3)
    a[n-1] = a[y];
    a[y] = u;

    for(i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

注:

  1. 在(1)的两行要放在给数组输入数据之后,因此跟第一段循环和第二段循环只能分开编写
  2. 在(2)的两行要注意事先对索引进行定义,否则如果出现最小值在第一位或者最大值在最后一位的情况的时候,程序跳过内部的if循环,则x与y便没有了定义。
  3. 在(3)的位置要注意数组的最后一位是输入的数组个数-1,即数组若有n位,则最后一位应为a[n-1]

选择排序法

利用数组给一串数进行从小到大的排序可以利用选择排序法。

选择排序法:

(1)  n个数 (a[0]~a[n-1]) 中找最小数,与 a[0] 交换 (2)  n-1个数 (a[1]~a[n-1]) 中找最小数,与 a[1] 交换                  …… (n-1) 2个数 (a[n-2]~a[n-1]) 中找最小数,与 a[n-2] 交换

因此,n个数需要选择排序n-1次

流程图:

代码:

#include <stdio.h>

int main()
{
    int a[1000] = {0};
    int n, k, i, index, t;
    printf("请输入需要排序的数量:");
    scanf("%d", &n);
    printf("请输入需要排序的数组:");
    
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    for(k = 0; k < n - 1; k++)
    {
        index = k;
        for(i = k + 1; i < n; i++)  //(1)
        {
            if(a[i] < a[index])
            {
                index = i;
            }
        }
        if(index != k)
        {
            t = a[index];
            a[index] = a[k];
            a[k] = t;
        }
    }

    for(i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}

整个代码的逻辑分为两步。首先外循环是选择排序法整体需要进行的次数,即n-1次。其次内循环是找到最小值所在的角标,内循环找最小值角标的代码值得注意。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值