Day7、彩票算法、可变长数组、二位数组

编写程序产生一组彩票(彩票里包含7个随机数,每个随机数在1到32之间)

产生完彩票后把彩票里的数字显示在屏幕上(不允许彩票里出现重复数字)

  1#include<stdio.h>

  2#include<time.h>

  3int main(){

 4     int num=0,cnt=0;

 5     int arr[7]={0};

 6     srand(time(0));

 7     do{

 8         arr[cnt]=rand()%36+1;//把新数字记录在所有有效数字的后面

 9        for(num=0;num<=cnt-1;num++){

 10            //   把新数字和前面已经得到的数字逐个对比

 11            if(arr[cnt]==arr[num]){

 12            //新数字和某个之前数字一样

 13            break;

 14            }

 15        }

 16        if(num==cnt){

 17            //新数字有效

 18            cnt++;

 19        }

 20    }while(cnt<7);

 21    for(num=0;num<=6;num++){

 22        printf("%d ",arr[num]);

 23     }

24     printf("\n");

 25    return 0;

 26 }             

练习:用户输入7个数字,判断有几个数字中奖

  1 #include<stdio.h>

  2 #include<time.h>

  3 int main(){

  4    int n=0,num=0;

  5    int num1=0,cnt=0;

  6    int arr[7]={0};

  7    int ayy[7]={0};

  8    srand(time(0));

  9    do{

 10        arr[cnt]=rand()%36+1;//把新数字记录在所有有效数字的后面

 11        for(num=0;num<=cnt-1;num++){

 12             //  把新数字和前面已经得到的数字逐个对比

 13            if(arr[cnt]==arr[num]){

 14            //新数字和某个之前数字一样

 15            break;

 16            }

 17        }

 18        if(num==cnt){

 19            //新数字有效

 20            cnt++;

 21        }

 22    }while(cnt<7);

 23    for(num=0;num<=6;num++){

 24        printf("%d  ",arr[num]);

 25     }

 26    printf("\n");

 27

 28    printf("请输入7个数字:\n");

 29    for(num=0;num<=6;num++){

 30        scanf("%d",&ayy[num]);

 31     }

 32    for(num=0;num<=6;num++){

 33        // 每次循环处理计算机生成彩票的一个数字

 34        for(num1=0;num1<=6;num1++){

 35            //把用户输入彩票中的每个数字和计算机生成彩票中的某个数字依次对比

 36            if(arr[num]==ayy[num1]){

 37                 break;

 38            }

 39        }

 40        if(num1<=6){

 41             //如果匹配上,就把统计个数加一

 42            n++;

 43        }

 44     }

 45    printf("有%d个数中奖\n",n);

 46    return 0;

 47 }

自己写的::

  1 #include<stdio.h>

  2 #include<time.h>

  3 int main(){

  4    int cnt=0;

  5    int i=0,j=0,n=0;

  6    int arr[7]={0},input[7]={0};

  7    srand(time(0));

  8    do{

  9        arr[cnt]=rand()%36+1;

 10        for(i=0;i<=cnt-1;i++){

 11            if(arr[i]==arr[cnt]){

 12                 break;

 13            }

 14        }

 15        if(i==cnt){

 16            cnt++;

 17        }

 18    }while(cnt<7);

 19    for(i=0;i<=6;i++){

 20        printf("%d\t",arr[i]);

 21     }

 22    printf("\n请输入7个数:\n");

 23    for(i=0;i<=6;i++){

24        scanf("%d",&input[i]);

 25        }

 26    for(i=0;i<=6;i++){

 27        for(j=0;j<=6;j++){

 28            if(arr[i]==input[j]){

 29                 break;

 30            }

 31         }

 32        if(j<=6){

 33            n++;

 34        }

 35     }

 36    printf("中奖了%d个数\n",n);

 37    return 0;

 38 }

验证身份证

把身份证前17个数位和下面17个数字对应位置相乘

7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2

然后把所有乘积求和

用求和结果除以11取余

用这个余数到下面11个数字里挑

1,0,X,9,8,7,6,5,4,3,2

这个挑出来的数就是身份证最后一位的内容

  1 #include<stdio.h>

  2 int main(){

  3    int i=0,sum=0;

  4    int card[17]={0};

  5    char arr1[]={'1','0','x','9','8','7','6','5','4','3','2'};

  6    int arr[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

  7    printf("请输入你的身份证前17位:\n");

  8    for(i=0;i<=16;i++){

  9        scanf("%d",&card[i]);

 10     }

 11    for(i=0;i<=16;i++){

 12        sum+=arr[i]*card[i];

 13     }

 14    printf("最后一个数字应该是:%c\n",arr1[sum%11]);

 15    return 0;

 16 }

数组名称不可以代表存储区

数组名称代表数组里第一个存储区地址

可以对数组名称进行sizeof计算,结果是整个数组包含的总字节个数

  1 #include <stdio.h>

  2 int main(){

  3    int arr[5]={0};

  4    printf("arr地址是%p\n",arr);

  5    printf("&arr[0]地址是%p\n",&arr[0]);

  6    printf("sizeof(arr)是%d\n",sizeof(arr));

  7    return 0;

  8 }

arr地址是0xbf9c483c

&arr[0]地址是0xbf9c483c

sizeof(arr)是20

C99规范里允许声明数组时使用变量表示数组里的存储区个数,这种数组叫变长数组

如果程序多次运行,则每次运行时数组里包含的存储区个数都可能不同

在一次运行过程中数组里包含的存储区个数不会改变

  1 #include<stdio.h>

  2 int main(){

  3    int size;

  4    printf("请输入一个整数:");

  5    scanf("%d",&size);

  6    int arr[size];   // 变长数组

  7    printf("sizeof(arr)是%d\n)",sizeof(arr));

  8    return 0;

  9 }

可以使用sizeof关键字计算变长中的总字节个数

数组是一块连续的内存存储空间

数组名对应该内存存储空间的首地址

  1 #include<stdio.h>

  2 int main(){

  3     int arr[2]={0}

  4     scanf("%d",arr);   错误的写法

  5     scanf("%d",&arr[0]);  arr[0]地址里写入数据

  6     printf("%p\n",&arr[0]);  打印arr[0]的地址

  7     printf("%p\n",arr);     打印arr数组的首地址,结果同上

  8     printf("%d\n",arr[0])   打印arr[0]存储区里的数据

  9 }

 

变长数组不可以初始化

编写程序产生一组彩票,长度由用户给定,不能重复

  1 #include<stdio.h>

  2 #include<time.h>

  3 int main(){

  4    int i=0,num=0,tmp=0;

  5    printf("请输入彩票的个数:");

  6    scanf("%d",&num);

  7    int arr[num];

  8    srand(time(0));

  9    

 10    do{

 11        arr[tmp]=rand()%36+1;

 12        for(i=0;i<=tmp-1;i++){

 13            if(arr[tmp]==arr[i]){

 14                 break;

 15            }

 16        }  

 17        if(i==tmp){

 18            tmp++;

 19        }

 20     }while(tmp<num);

 21    

 22    for(i=0;i<=num-1;i++){

 23        printf("%d  ",arr[i]);

24    }

 25    printf("\n");

 26    return 0;

 27 }

多维数组除了可以表示多个存储区以外,还可以表示这些存储区的分组情况

已为数组不能表示存储区的分组情况

最常见的多维数组是二维数组,它只表示存储区的一次分组情况

声明二维数组的时候需要提供两个整数,第一个整数表示分组个数,第二个整数表示每组存储区个数

二维数组通常不会作为整体使用,一次只会使用其中某个存储区

二维数组名称和两个下标就可以用来表示其中某个存储区。第一个下标表示分组编号(组下标),第二个下标表示分组内存储区的编号(组内下标)

组下标范围从0开始到分组个数减一为止

组内下标范围从0开始到组内存储区个数减一为止

  1 #include<stdio.h>

  2 int main(){

  3    int arr[3][2];

  4    int row=0,col=0,tmp=0;

  5    for(row=0;row<=2;row++){

  6        for(col=0;col<=1;col++){

  7            arr[row][col]=tmp;

  8             tmp++;

  9        }

 10     }

 11    for(row=0;row<=2;row++){

 12        for(col=0;col<=1;col++){

 13            printf("%d ",arr[row][col]);

 14        }

 15        printf("\n");

 16     }

 17    return 0;

 18 }

可以把二维数组当作一维数组进行初始化int arr[3][2]={0,1,2,3,4,5};

可以把初始化数据进行分组,每组初始化数据用来初始化一组存储区

intarr[3][2]={{0,1},{2,3},{4,5}};

如果可以根据初始化数据的个数计算出分组个数,就可以省略二维数组声明的分组个数

二维数组名称也可以代表数组里第一个存储区的地址,且名称不能代表存储区,所以不能被赋值

二维数组可以使用sizeof进行计算,结果是二维数组所包含的的总字节个数

  1 #include<stdio.h>

  2 int main(){

  3    int arr[3][2]={0};

  4    printf("arr是%p\n",arr);

  5    printf("&arr[0][0]是%p\n",&arr[0][0]);

  6    printf("sizeof[arr]是%d\n",sizeof(arr));

  7    return 0;

  8 }

arr是0xbfcedb68

arr[0][0]是0xbfcedb68

sizeof[arr]是24

二维数组名称可以和一个下标配合使用,这个下标当做组下标看待。这个写法表示下标代表组中第一个存储区的地址。

例如:printf("arr[1]是%p",arr[1]);  =====  printf("&arr[1][0]是%p\n",&arr[1][0]);

这种写法可以当作一维数组看待,这个一维数组里包含下标代表组中所有存储区

printf("sizeof(arr[1])是%d\n",sizeof(arr[1]));

sizeof(arr[1])是8

 

练习:打印

1 1 1 1 2

4 0 0 0 2

4 0 0 0 2

4 0 0 0 2

4 3 3 3 3

/*
    二维数组练习
*/
#include <stdio.h>
int main() {
    int map[5][5] = {0};
    int num = 0, num1 = 0, cur_row = 0, cur_col = 0, step_row = 0, step_col = 1, tmp_row = 0, tmp_col = 0;
    for (num = 1;num <= 4;num++) {
        for (num1 = 0;num1 <= 3;num1++) {
            map[cur_row][cur_col] = num;  //把当前位置填好数字
            //计算移动一步后的位置
            tmp_row = cur_row + step_row;
            tmp_col = cur_col + step_col;
            if (tmp_row < 0 || tmp_row > 4 ||
                tmp_col < 0 || tmp_col > 4) {
                //需要重新计算移动后的位置
                if (step_row == 0 && step_col == 1) {
                    //向右改向下
                    step_row = 1;
                    step_col = 0;
                }
                else if (step_row == 1 && step_col == 0) {
                    //向下改向左
                    step_row = 0;
                    step_col = -1;
                }
                else if (step_row == 0 && step_col == -1) {
                    //向左改向上
                    step_row = -1;
                    step_col = 0;
                }
                else {
                    //向上改向右
                    step_row = 0;
                    step_col = 1;
                }
                tmp_row = cur_row + step_row;
                tmp_col = cur_col + step_col;
            }
            //用计算出来的新位置替换原来的位置
            cur_row = tmp_row;
            cur_col = tmp_col;
        }
    }
    for (num = 0;num <= 4;num++) {
        for (num1 = 0;num1 <= 4;num1++) {
            printf("%d", map[num][num1]);
        }
        printf("\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值