登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习笔记] 数组使用练习

[复制链接]
发表于 2018-1-28 19:24:18 | 显示全部楼层 |阅读模式
学习笔记
学习科目: C语言
学习安排: 明天把数组结束,开始指针的学习
开始时间: 2018-01-28
结束时间:
这是一个简单的数组使用练习
主要基于之前的练习中的乱数生成
题目要求
投100000次(两颗)骰子的点数相加,并统计和次数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
    srand(time(0));
    int i;
    int a[12]={0};
    for(i=0;i<100000;i++){
        int dice1,dice2;
        dice1=rand()%6+1;
        dice2=rand()%6+1;
        int j=dice1+dice2;
        a[j-1]++;
    }
    for(i=1;i<12;i++)
        printf("%d:%d\n",i+1,a[i]);
    return 0;
}

练习2
让用户输入6个整数,并且通过查询得到相应位置数据的大小
#include<stdio.h>

int main()
{
    int i,n[6];
    for(i=0;i<6;i++){       //输入
        printf("%d:",i+1);
        scanf("%d",&n[i]);
    }
    while(1){                    //查询
        printf("Q:");
        scanf("%d",&i);
        if(i==0)
            break;                //当查询为0时推出
        printf("%d\n",n[i-1]);
    }
    return 0;
}


练习3
让使用者输入10个数字,并输入上限和下限,输出剩余数字,要求可以输出无限次,当输入0 0时结束
#include<stdio.h>

int main(){
    int i,a[10];
    for(i=0;i<10;i++){         //输入10个数字
        printf("%d:",i+1);
        scanf("%d",&a[i]);
    }
    int max,min;
    while(1){
        printf("请输入上限:");
        scanf("%d",&max);
        printf("请输入下限:");
        scanf("%d",&min);
        if(max==0&&min==0){  //上限下限都是0的时候退出
            break;
        }
        for(i=0;i<10;i++){
            if(a[i]<min||a[i]>max){  //(之前的笔记中应该有continue和break)跳过不在范围内的数字,当然也可以用 if述句
                continue;
            }
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    return 0;
}


练习4
输出范围内数字的最大值
#include<stdio.h>
int Max(int,int);

int main()
{
    int i,a[10];
    int l=0;
    for(i=0;i<10;i++){         //还是输入十个数字
        printf("%d:",i+1);
        scanf("%d",&a[i]);
    }
    while(1){
        printf("请输入上限:");
        int max;
        scanf("%d",&max);
        if(max==0)                  //输入0为上限时结束循环
            break;
        for(i=0;i<10;i++){
            if(max<a[i])
                continue;
            l=Max(l,a[i]);            //将较大的一个数赋给l,循环一下l就是最大值了
        }
        printf("%d\n",l);
    }
    return 0;
}

int Max(int a,int b){
    if(a>=b){
        return a;
    }else
    return b;
}


练习5
查询范围内接近的数
#include<stdio.h>
#include<stdlib.h>//整数的绝对值abs在C语言中的头文件是这个,浮点数好像是math.h

int main()
{
    int i,a[10];
    int l=0;
    for(i=0;i<10;i++){
        printf("%d:",i+1);
        scanf("%d",&a[i]);
    }
    while(1){
        printf("请输入一个数字:");
        int number;
        scanf("%d",&number);
        if(number==0)
            break;
        for(i=0;i<10;i++){
            if( abs(number-a[i])<abs(number-l))   //先假定l=0是最接近的,然后逐一的排除,当然这么做有一点风险,就是万一0是最接近的又不在数组中,那输出的结果就是错的
                l=a[i];
        }
        printf("最接近这个数的是%d\n",l);
    }

    return 0;
}


练习6
统计数据段内数据出现的次数,1~10,11~20,.....90~100然后用*画柱状图
#include<stdio.h>

int main()
{
    int i,a[10],j;
    for(i=0;i<10;i++){
        printf("%2d(1~100):",i+1);
        scanf("%d",&a[i]);
    }
    for(i=0;i<10;i++){
        printf("%3d0:",i+1);        //printf有一个特殊功能,在%和d之间输入一个数字可以使输出的字符具有相应的长度,用于对齐。这里%3d输出的就会是有三个长度的字符
        for(j=0;j<10;j++){
            if((a[j]-1)/10==i)         //数组在使用的时候最需要注意的就是下标是从0开始的a[0],还有不可以超出范围,不然计算机会随便给你一个数
                printf("*");
        }
        printf("\n");
    }

    return 0;
}


练习7
找出众数
#include<stdio.h>

int main()
{
    int i,a[10]={0};
    printf("输入十个0~9之间的数:\n");
    for(i=0;i<10;i++){
        int number;
        scanf("%d",&number);
        a[number]++;                  //这里的数组是计次用,不用于存放输入的值
    }
    int j,n=-1;
    for(j=0;j<10;j++){
        if(n<a[j]||(n==a[j]&&i<j)){
            n=a[j];
            i=j;
        }
    }
    printf("%d",i);

    return 0;
}


练习8
产生1到10不重复的10个随机数,就是1到10乱序
这个练习我写了一种方法,每次都只有第一个数和后面的重复,检查了一个半小时,愣是没检查出来,最后放弃了
然后换了一种写法,唉,心痛
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
    srand(time(0));
    int a[10]={0};
    int i,j;
    for(i=0;i<10;i++){
        do{
            a[i]=rand()%10+1;    //这种写法是当后来的数与之前的数重复的时候,重新读取一次,难点就在于如何判断是否与之前的的数字重复,这边用的是do-while循环
            for(j=0;j<i;j++){
                if(a[i]==a[j]){
                    break;
                }
            }
        }while(j!=i);
        printf("%d ",a[i]);
    }
    printf("ok");

    return 0;
}


这题还有一种写法,是参考别人的
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
    srand(time(0));               
    int a[10];                             //先把一到十排好序
    int i;
    for(i=0;i<10;i++){
        a[i]=i+1;
    }
    for(i=0;i<10;i++){
        int j=rand()%(10-i)+i+1; //随机产生一个从 i  到10-i 的数把它和第 i 个数换一下位置
        int t=a[i];                         //就是从没有读取过的数中随机读取一个数,然后把它往前堆
        a[i]=a[j];
        a[j]=t;
        printf("%d ",a[i]);
    }
    printf("ok");

    return 0;
}

今天的练习有点多,还有一些就不写出来了,最后这一题,我之前的写法检查花了我一个多小时,伤不起,闪人,学单片机去

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表