9.17 编程练习

关机恶搞代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main() {
    system("shutdown -s -t 60");
    char str[50];

    while(1) {
        printf("enter impig,or your computer will shut down\n");
        scanf("%s",str);
        if(strcmp(str,"impig")==0) {
            system("shutdown -a");
            printf("you are right\n");
            break;
        }
        else {
                printf("give you more cheese\n");
            }
    }
}

扫雷代码

main.c

#include "game.h"


//菜单
void mune() {
    printf("*******************\n");
    printf("***1.play 0.exit***\n");
    printf("*******************\n");
}

//游戏代码
void game() {
char inarr[rows][cols];
    char outarr[rows][cols];
//定义游戏
    intboard(inarr,row,col,'0');
    intboard(outarr,row,col,'*');
//显示游戏
    display(outarr,row,col);

    //生成地雷
    creat(inarr,row,col);

    //找到地雷
    find(inarr,outarr,row,col);

}


//检查玩家是否玩游戏 同时 使得游戏循环
void test() {
    srand((unsigned int ) time(NULL));
    mune();
    printf("choose 1 or 0\n");
    int intput;
    do {
        switch (intput) {
            case 1:
                printf("let us do it\n");
            game();
            break;
                case 0:
                    printf("quit\n");
                 break;
            default:
                printf("please enter 0 or 1\n");
            break;
        }
    } while (intput);
}

int main() {
test();
    return 0;
}

game.h

#define row 9
#define col 9
#define rows row+2
#define cols col+2

#define num 10

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//定义游戏
void intboard(char arr[rows][cols],int row, int col,char set);

//显示游戏
void display(char arr[rows][cols],int row,int col);

//生成地雷
void  creat(char arr[rows][cols],int row,int col);

//找到地雷
void find(char inarr,char outarr,int row,int col);

game.c

#include "game.h"

//定义游戏
void intboard(char arr[rows][cols],int row, int col,char set) {
    for(int i=1;i<=row;i++) {
        for(int j=1;j<=col;j++) {
            arr[i][j]=set;
        }
    }
}

//显示游戏
void display(char arr[rows][cols],int row,int col);
{
    for(int i=0;i<=row;i++) {
        printf("%d",i);
    }
    printf("\n");
    for(int i=1;i<=col;i++) {
        printf("%d",i);
        for(int j=1;j<=row;j++) {
            printf("%c",arr[i][j]);
        }
    }
}

//生成地雷
void  creat(char arr[rows][cols],int row,int col) {
    int count=num;
    while (count) {
        int x=rand()%col+1;
        int y=rand()%row+1;
        if(arr[x][y]=='0') {
            arr[x][y]='1';
        }
        count--;
    }
}

//雷的数量
int find_count(char inarr[rows][cols],int x,int y) {
    int count=0;
    for(int i=1;i<=y+1&&i>=y-1&&i!=y;i++) {
        for(int j=1;j<=x+1&&j>=x-1&&j!=x;j++) {
            count +=inarr[i][j];
            return count-8*'0';
}

        //清除空白
        void clean(char inarr[rows][cols],char outarr[rows][cols],int x,int y) {

            int count=0;
            for(int i=1;i<=y+1&&i>=y-1&&i!=y;i++) {
                for(int j=1;j<=x+1&&j>=x-1&&j!=x;j++) {

                    count= find_count(inarr,j,i);
                    if (count==0) {
                        outarr[j][i]=' ';
                        if (j>=1&&j<=row&&i>=1&&i<=col) {
                            clean(inarr,outarr,j,i);
                        }
                    }
                }
            }
        }

//找到地雷
void find(char inarr[rows][cols],char outarr[rows][cols],int row,int col) {
            int x,y;
            while(1) {
                printf("please enter the position");
                scanf("%d,%d",&x,&y);
                if (x>=1&&x<=col&&y>=1&&y<=row) {
                    if (inarr[y][x]=='1') {
                        printf("game over");
                        break;
                    }
                    else {
                        char outarr[rows][cols];

                        //统计雷的数量
                        int count=find_count(inarr,x,y);
                        outarr[y][x]=count+'0';
                        //清除空白
                        clean(inarr,outarr,row,col);
                        display(outarr,row,col);
                    }
                    else {
                        printf("please enter a number of x or y between 1 and row or col");
                    }
                }
            }
        }

找二进制1的三种解法

法一

#include <stdio.h>
int count(unsigned int a) {
 int count = 0;
while(a>0) {
    if (a&1==1) {
        count++;
    }
    a = a >> 1;
}
    return count;
}
int main() {
    unsigned int a;
    scanf("%d",&a);
    int num=count(a);
    printf("%d",num);
    return 0;
}

法二
#include <stdio.h>
int count(unsigned int a) {
 int count = 0;
while(a>0) {
    if (a%2==1) {
        count++;
    }
    a /=2;;
}
    return count;
}
int main() {
    unsigned int a;
    scanf("%d",&a);
    int num=count(a);
    printf("%d",num);
    return 0;
}

法三

#include <stdio.h>
int count(unsigned int a) {
 int count = 0;
while(a>0) {
    a=a&(a-1);
        count++;
}
    return count;
}
int main() {
    unsigned int a;
    scanf("%d",&a);
    int num=count(a);
    printf("%d",num);
    return 0;
}

找二进制中的不同位的数量

#include <stdio.h>
int count(unsigned int c) {
 int count = 0;
while(c>0) {
    c=c&(c-1);
        count++;
}
    return count;
}  ——>这里的计数函数可以从上面三选一
int compare(int a, int b) {
    int count = a^b;
    return count;
}
int main() {
    unsigned int a;
    unsigned int b;
    scanf("%d %d",&a,&b);
    int c=compare(a,b);
    int num=count(c);
    printf("%d",num);
    return 0;
}
打印二进制的奇数和偶数位
#include <stdio.h>

void print (int m) {
    int i = 0;
    printf ("奇数位:\n");
    for (i = 30; i >= 0; i -= 2) {
        printf ("% d", (m >> i) & 1);
    }
        printf ("\n");
        printf ("偶数位:\n");
        for (i = 31; i >= 1; i -= 2){
            printf ("% d", (m >> i) & 1);
    }
    printf ("\n");
}

int main() {
   int n;
    scanf ("%d", &n);
    print (n);
    return 0;
}
(用移位的方式可以隐形将十进制转二进制,减少操作流程)

用指针打印数组
#include <stdio.h>

int main() {
   int a[]= {1,2,3,4,5};
    int len=sizeof(a)/sizeof(int);

    int *p=&a;
   for(int i=0;i<len;i++) {
       printf("%d",p[i]);
   }
    printf("\n");

    int *q=&a[0];//int *q=a;
    for(int i=0;i<len;i++) {
        printf("%d",*(q+i));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值