精华内容
下载资源
问答
  • * C语言程序设计 绵阳师范学院 物理与电子工程学院 郭...1.2 计算机程序结构 1.3 算法及其描述 1.4 C程序基础 1.1 计算机语言 一计算机语言分类 随着计算机软件技术发展十年来计算机语言一百余之多但常用语言
  • 'Next of Page在C语言中,可以用以下几种方式调用函数: 1.函数表达式  函数作表达式中一项出现在表达式中,以函数返回值参与表达式运算。这种方式要求函数是返回值。例如: z=max(x,y)是一个赋值表达式,...
  • C语言实现三

    2018-04-08 22:02:07
    一 要实现三以下个基本功能: 1.初始化棋盘:用空字符初始化 2.打印棋盘:控制打印九宫格来表示棋盘 3.玩家下棋:用X表示玩家棋子 4.电脑随机下棋:随机生成坐标,用0表示玩家棋子 5.判断输赢:...

    一 要实现三子棋有以下几个基本功能:

    1.初始化棋盘:用空字符初始化

    2.打印棋盘:控制打印九宫格来表示棋盘

    3.玩家下棋:用X表示玩家的棋子

    4.电脑随机下棋:随机生成坐标,用0表示玩家的棋子

    5.判断输赢:分为玩家赢,电脑赢,平局,继续游戏四种情况

    二 程序如下:

    1.头文件(函数的声明)

    #define _CRT_SECURE_NO_WARNINGS 1  
    #ifndef  __SANZIQI_H__  
    #define  __SANZIQI_H__  
      
    #define ROW 3  
    #define COL 3  
      
    //初始化  
    void InitBorad(char arr[ROW][COL], int row, int col);  
      
    //显示棋盘  
    void Display(char arr[ROW][COL], int row, int col);  
      
    //电脑走  
    void Computer(char arr[ROW][COL], int row, int col);  
      
    //人走  
    void Player(char arr[ROW][COL], int row, int col);  
      
    //判断是否还有空格  
    int Check_full(char arr[ROW][COL], int row, int col);  
      
    //判断输赢  
    char Is_Win(char arr[ROW][COL], int row, int col);  
      
    #endif  

    2.子程序

     

    
     

     

    
     
    #define _CRT_SECURE_NO_WARNINGS 1  
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <time.h>  
      //初始化  
    void InitBorad(char arr[ROW][COL], int row, int col)  
    {  
        int i;  
        int j;  
        for (i = 0; i < row;i++)  
        for (j = 0; j < col; j++)  
            arr[i][j] = ' ';  
    }  
      
    //显示棋盘  
    void Display(char arr[ROW][COL], int row, int col)  
    {  
        int i;  
        int j;  
        printf("----------\n");  
        for (i = 0; i < row; i++)  
        {  
            printf("|");  
            for (j = 0; j < col; j++)  
            {  
                printf("%2c|", arr[i][j]);  
            }  
            printf("\n----------\n");  
        }  
    }  
      
    //电脑走  
    void Computer(char arr[ROW][COL], int row, int col)  
    {  
        srand((unsigned int)time(NULL)); //产生随机数  
        while (1)  
        {  
            int x = rand() % 3; //产生一个小于3的数  
            int y = rand() % 3;  
            if (arr[x][y] == ' ') //判断这个元素是否为空  
            {  
                arr[x][y] = 'X';  
                break;  
            }     
        }     
    }  
      
    //人走  
    void Player(char arr[ROW][COL], int row, int col)  
    {  
        int x;  
        int y;  
        while (1)  
        {  
            printf("请输入坐标:");  
            scanf("%d%d", &x, &y);  
            x--;  
            y--;  
            if ((0 <= x && x <= row - 1) && (0 <= y && y <= col - 1)) //玩家输入的坐标要在棋盘范围内  
            {  
                if (arr[x][y] == ' ')  
                {  
                    arr[x][y] = 'O';  
                    break;  
                }  
                else  
                {  
                    printf("你输入的下标被占,请重新输入!\n");  
                }  
            }  
            else  
            {  
                printf("越界了,请重新输入!\n");  
            }     
        }  
    }  
      
    //判断是否还有空格  
    int Check_full(char arr[ROW][COL], int row, int col)  
    {  
        int i;  
        int j;  
        for (i = 0; i < row; i++)  
        {  
            for (j = 0; j < col; j++)  
            {  
                if (arr[i][j] == ' ') //判断数组中有没有空格,如果出现一次空格,就已经可以证明数组没满  
                    return 0;  
            }  
        }  
        return 1;  
    }  
      
    //判断输赢  
    char Is_Win(char arr[ROW][COL], int row, int col)  
    {  
        int i;  
        if (Check_full(arr, ROW, COL) == 1) //棋盘满了没有空格,平局  
            return 'Q';  
        for (i = 0; i < row; i++)//某一行连3  
        {  
            if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2])  
            return arr[i][1];  
        }  
        for (i = 0; i < col; i++) //某一列连3  
        {  
            if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])  
            return arr[1][i];  
        }  
        if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]) //右对角线\连3  
            return arr[1][1];  
        if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]) //左对角线/连3  
            return arr[1][1];  
        return ' '; //如果没有判断出谁赢并且棋盘还没满,则继续进行游戏  
    }  

     

     

    3.主函数

     

     

    #define _CRT_SECURE_NO_WARNINGS 1  
    #include <stdio.h>  
    #include <stdlib.h>  
    
    void menu()  
    {  
        printf("**************************************\n");  
        printf("*************** 1.play ***************\n");  
        printf("*************** 0.exit ***************\n");  
        printf("**************************************\n");  
    }  
    void game()  
    {  
        char arr[ROW][COL];  
        InitBorad(arr,ROW,COL);//初始化棋盘  
        //Display(arr, ROW, COL);  
        do{  
            Computer(arr, ROW, COL); //电脑先走  
            Display(arr, ROW, COL); //打印棋盘  
            if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环  
            {  
                break;  
            }  
            Player(arr, ROW, COL); //玩家走  
            Display(arr, ROW, COL); //打印棋盘  
            if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环  
            {  
                break;  
            }  
        } while (Is_Win(arr, ROW, COL) == ' '); //如果棋盘没有满,同时也没有判断出输赢的话,继续执行循环,否则跳出循环  
        if (Is_Win(arr, ROW, COL) == 'O')  
            printf("玩家赢\n");  
        else if (Is_Win(arr, ROW, COL) == 'X')  
            printf("电脑赢\n");  
        else if (Is_Win(arr, ROW, COL) == 'Q')  
            printf("平局\n");  
      
    }  
    int main()  
    {  
        int choose = 0;   
        do{  
            menu();  
            printf("请选择>");  
            scanf("%d", &choose);  
            switch (choose)  
            {  
            case 1:  
                game();  
                break;  
            case 0:  
                printf("退出游戏\n");  
                break;  
            default:  
                printf("输入错误,重新输入!\n");  
            }  
        } while (choose);  
        system("pause");  
        return 0;  
    }  

    运行结果如下:

    展开全文
  • 棋,和五子棋原理是一样,当玩家或者是电脑某一方先将各自三个棋子下成一条线时谁就赢,游戏就会结束。 游戏会结果:电脑赢、玩家赢、平局。在代码中也需要这三情况判定。 要写程序,就要...

    三子棋,和五子棋的原理是一样的,当玩家或者是电脑的某一方先将各自的三个棋子下成一条线时谁就赢,游戏就会结束。

    游戏会有三种结果:电脑赢、玩家赢、平局。在代码中也需要这三种情况的判定。

    要写程序,就要清楚代码需要几个模块,可以分为以下几个:

    1. 棋盘初始化
    2. 电脑、玩家分别走棋
    3. 输赢的判定
    先对头文件定义:

    头文件名 sanziqi.h

    #ifndef __sanziqi_h__
    #define __sanziqi_h__
    
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    
    #define ROW 3 //三横行
    #define COL 3 //三竖行
    
    void InitBoard(char arr[ROW][COL], int row, int col);
    //棋盘初始化
    void DisplayBoard(char arr[ROW][COL], int row, int col);
    //棋盘的展示
    void ComputerMove(char arr[ROW][COL], int row, int col);
    //电脑下棋
    void PlayerMove(char arr[ROW][COL], int row, int col);
    //玩家下棋
    char IsWin(char arr[ROW][COL], int row, int col);
    //判断输赢
    char IsFull(char arr[ROW][COL], int row, int col);
    //判断棋盘是否下满 下满则为平局
    #endif
    下来可以写以上各个需求的具体实现:

    sanziqi.c

    
     #include"sanziqi.h"
    
    void InitBoard(char arr[ROW][COL], int row, int col)
    {
        int i = 0;
        int j = 0;
        for(i = 0;i<row;i++)
            for (j = 0; j < col; j++)
            {
                arr[i][j] = ' ';
            }
            //此处可以用memset函数实现,为展示清楚写成for
    }
    
    void DisplayBoard(char arr[ROW][COL], int row, int col)
    {
        int i = 0;
        for (i = 0; i < row; ++i)
        {
            printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
            if (i != row - 1)
            {
                printf("--- --- ---\n");
            }
        }
        printf("\n");
    }
    void ComputerMove(char arr[ROW][COL], int row, int col)
    {
        printf("computer go\n");
        while(1)
        {
            int x = rand() % row;
            int y = rand() % col;
            if (arr[x][y] == ' ')
            {
                arr[x][y] = 'x';
                break;
            }
        }
    }
    //电脑下棋采用了随机的下法
    
    
    void PlayerMove(char arr[ROW][COL], int row, int col)
    {
        while(1)
        {
            int x, y;
            printf("player go\n");  
            scanf("%d%d", &x, &y);
            if ((1 <= x && x <= 3) && (1 <= y && y <= 3))
            {
                if (arr[x-1][y-1] == ' ')
                {
                    arr[x-1][y-1] = 'O';
                    break;
                }
                else
                {
                    printf("this place have chess\n");
                }
            }
            else
            {
                printf("error place\n");
            }
        }
    }
    
    
    char IsWin(char arr[ROW][COL], int row, int col)
    {
        int i;
        for (i = 0; i < row; i++)
        {
            if ((arr[i][0] == arr[i][1]) && (arr[i][1]==arr[i][2])&&arr[i][0]!=' ')
            return arr[i][1];
        }//行的判断
        for (i = 0; i < col; i++)
        {
            if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && arr[2][i] != ' ')
                return arr[1][i];
        }//列的判断
        if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && arr[1][1] != ' ')
        {
            return arr[1][1];
        }
        if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && arr[2][2] != ' ')
        {
            return arr[2][2];
        }
        //这两个是斜行的判断
        else if (IsFull(arr, row, col) == 1)
        {
            return 'w';
        }
        //平局的返回值
        else
        {
            return ' ';
        }
    }
    
    
    char IsFull(char arr[ROW][COL], int row, int col)
    {
        int i = 0;
        int j = 0;
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                if (arr[i][j] == ' ')
                    return 0;
            }
        }//如果每个位置都不为空,证明已经平局
        return 1;
    }
    
    在实现了各个模块的功能之后,就可以将它们整合在一起。
    如下是main.c
    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    #include"sanziqi.h"
    
    int menu(void)
    {
        int choose;
        printf("----------------------\n");
        printf("--------1.play--------\n");
        printf("--------0.exit--------\n");
        printf("----------------------\n");
        printf("choose:> ");
        scanf("%d", &choose);
        return choose;
    }
    //菜单选择
    
    void game()
    {
        char board[ROW][COL];
        char ret;
        srand((unsigned int)time(NULL));
        InitBoard(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
            while(1)
            {       
                ComputerMove(board, ROW, COL);
                DisplayBoard(board, ROW, COL);
                ret = IsWin(board, ROW, COL);
                if (ret != ' ')
                    break;
    
                PlayerMove(board, ROW, COL);
                DisplayBoard(board, ROW, COL);
                ret = IsWin(board, ROW, COL);   
                if (ret != ' ') 
                    break;  
            } 
            if (ret == 'x')
            {
                printf("computer win\n");
            }
            else if (ret == 'O')
            {
                printf("gamer win\n");
            }
            else if (ret == 'w')
            {
                printf("平局\n");
            }
    }
    
    int main()
    {
        int choose = 0;
        do
        {
            choose = menu();
            switch (choose)
            {
            case 1:
                printf("PLAY\n");
                game();
                break;
            case 0: 
                exit(0);
                break;
            default:
                printf("CHOOSE ERROR\n");
                break;
            }
        } while (1);
        return 0;
        system("pause");
    }

    游戏菜单:
    这里写图片描述

    游戏结果:

    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • C语言编程 授课教师王占骜 第2章 表达式和简单程序设计...操作数Operands 执行某种操作对象 如x5 3表达式Expressions 由一个或多个操作组成的有实际意义 如s=3.1415926*r*r 可以把表达式分为7不同类型 4.优
  • 56.7 几种循环比较 79 6.8 break 和 continue语句 79 6.8.1 break 语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组定义和引用 82 7.1.1 一维数组定义方式 82 7.1.2 一维数组元素引用 ...
  • 56.7 几种循环比较 79 6.8 break 和 continue语句 79 6.8.1 break 语句 79 6.8.2 continue 语句 80 6.9 程序举例 81 7 数组 7.1 一维数组定义和引用 82 7.1.1 一维数组定义方式 82 7.1.2 一维数组元素引用 ...
  • 由于单片机C语言下利用软件延时不容易做到精确定时,所以很多人在编写延时子程序的时候不能好好把握延时具体时间。C语言下,延时程序主要以下几种: 一: void delay(unsigned char...

    用单片机C语言精确延时(定时)的方法

    作者:51hei   来源:原创   点击数:…  更新时间:2009年09月29日   【字体:  

      最近在忙着单片机的项目,偶尔停下来小结了一下最近的收获,还是有不少可贵的收益的。

      本人在闲暇的时候对单片机C语言下的各类延时程序做了下总结。由于单片机C语言下利用软件延时不容易做到精确的定时,所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间。C语言下,延时程序主要有以下几种:

    一:

    void delay(unsigned char k)
    {

     unsigned char i,k;  //定义变量
     for(i=0;i<k;i++);      //for循环语句

    }

    该程序在Keil环境下,会先将C语言转化成汇编语言,那么我们就可以根据汇编语言来计算出精确的时间,转化具体步骤如下:

     CLR A   ;指令1
     MOV R7,A ;指令2  
    LOOP:
       INC R7  ;指令3
       CJNE  R7,k,LOOP    ;指令4

    这里,指令1,指令2和指令3各消耗1个机器周期,指令4消耗两个机器周期(可查此表得知:http://www.51hei.com/mcuteach/1312.html),而在12M的晶振下一个机器周期是1us,在这个过程中,指令1和指令2分别执行1次,即消耗1+1us,而指令3和指令4分别执行了k次,那么这样加起来,这个延时子程序所消耗的具体时间就是t=1+1+(1+2)*k=3k+2us。

    呵呵,这样说来,如果我们定义的k为100的话,这个延时子程序的精确时间就是302us。  

    二:

    void delay(unsigned char i)
    {
    while(--i)
    {;}
    } 

    同样的道理,将其反汇编,可以看到,只有一条语句:DJNZ  i,$;

    该语句消耗2us,一共执行i次,所以总共消耗时间t=i*2us。

    三:

    下面的将形参换为整形int,这样的话,反汇编所执行的语句完全不同,用个具体的数字做例子:

    void delay()
    {
     unsigned int i=10000;
     while(--i)
    ;
    }

    反汇编后:

         4:         unsigned int i=10000;

    C:0x0003    7F10     MOV      R7,#0x10
    C:0x0005    7E27     MOV      R6,#0x27

         5:         while(--i)
         6: ;
    C:0x0007    EF       MOV      A,R7
    C:0x0008    1F       DEC      R7
    C:0x0009    7001     JNZ      C:000C
    C:0x000B    1E       DEC      R6
    C:0x000C    14       DEC      A
    C:0x000D    4E       ORL      A,R6
    C:0x000E    70F7     JNZ      C:0007

    具体计算如下

    1.R7经过10H(16)次循环减为0:
    t1=10H*(1+1+2+1+1+2)
    2.R6经过27H*256次循环减为0:
    t2=27H*256*(1+1+2+1+1+2)+27H*1
    3.最后R7的是变为255,因此还要多出255次的循环:
    t3=255*(1+1+2+1+1+2)
    4.加上之前消耗的2us,总消耗时间:
    T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)
    =2+16*7+39*256*7+39*1+255*7
    =71826us
    大约为72ms吧
    如果定义一个unsigned int i,那么延时计算公式为T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

    关于其他类型的延时程序都可以按照这个方法对时间进行较为精确的计算。

    如果你懒得计算我还给大家推荐一个简单的方法:就是用keil的软件仿真功能来仿真出C语句执行的时间,具体方法可以看这里:http://www.51hei.com/bbs/dpj-4711-1.html

    昨天熬夜整理的,从这个程序中可以看出单片机C语言和汇编语言的一些区别,希望对大家有帮助!

    展开全文
  •  C语言是一计算机程序设计语言,它功能强大,可以用来编写系统软件及应用软件,应用范围很广泛。作为一门计算机编程语言,C语言有自己规范,所以对初学者而言概念比较多、不易理解。  本书分为5篇,共23章,循...
  • C语言笔记

    2018-05-24 16:23:00
    1、子程序里面声明变量,不可以传递给主程序,若要传给主程序,需从堆里开辟空间 malloc 后...2、子程序给主程序传值,以下几种方法 一是return返回值。二是子程序形参采用指针形式,调用完毕后直接修改该...

    1、子程序里面声明的变量,不可以传递给主程序,若要传给主程序,需从堆里开辟空间  malloc  后返回该块地址。(因为子程序里声明的变量在栈区,主程序无法直接使用,子程序一结束就自动释放回收。而malloc开辟的空间则由程序员控制,因此在子程序里开辟的空间,主程序依然可以用。)

    2、子程序给主程序传值,有以下几种方法

    一是return返回值。二是子程序形参采用指针的形式,调用完毕后直接修改该指针指向的地址上的值。

    转载于:https://www.cnblogs.com/zacky/p/9083538.html

    展开全文
  • ATPCS规则体现了一模块化设计思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用一套规则(C51中也类似一套规则)。我感觉比在线汇编功能强大(不用很多忌讳),条理更清楚(很简单的几条规则)。 ATPCS...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    C语言是一结构化程序设计语言,它支持当前程序设计中广泛采用由顶向下结构化程序设计技术。此外,C语言程序具有完善模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力保障。因此,使用C语言...
  • c语言初学者入门讲座

    2009-07-03 16:28:29
    C语言中的函数相当于其它高级语言的子程序。    第十一讲 指针的慨念  指针是C语言中广泛使用的一数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用...
  • 汇编C语言混合编程

    2017-03-04 15:31:04
     ATPCS规则体现了一模块化设计思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用一套规则(C51中也类似一套规则)。我感觉比在线汇编功能强大(不用很多忌讳),条理更清楚(很简单的几条规则)...
  • C语言初学者入门讲座

    2008-10-31 20:01:59
    C语言中的函数相当于其它高级语言的子程序。    第十一讲 指针的慨念  指针是C语言中广泛使用的一数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组...
  • 嵌入式系统是指完成一种或几种特定功能计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域。嵌入式系统受其使用硬件以及运行环境限制,非常注重代码时间和空间效率...
  • 在linux中网络编程中,TCP协议是我们最常用的几种协议之一,今天我们就使用TCP协议实现一个多线程回复程序(echo服务器)。 总来说就是使用C语言,在主线程中socket套接字一直处于监听状态,如果TCP客户端...
  • c语言资料(复习)

    2012-12-09 14:39:56
     任何一棋类游戏其关键是对当前棋局是否正确评分,评分越准确则电脑AI越高。五子棋游戏也是如此,但在打分之前,我们先扫描 整个棋盘,把每个空位从八个方向上棋型填入数组gStyle(2, 15, 15, 8, 2),其中...
  • C语言教程(谭浩强)

    2008-12-16 10:35:00
    C语言的关键字分为以下类: (1)类型说明符 用于定义、说明变量、函数或其它数据结构的类型。如前面例题中用到的int,double等 (2)语句定义符 用于表示一个语句的功能。如例1.3中用到的if else就是条件语句的...
  • ARM汇编语言和C语言混合编程 ATPCS规则体现了一模块化设计思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用一套规则(C51中也类似一套规则)。我感觉比在线汇编功能强大(不用很多忌讳),条理更...
  • 本书集综合性、实用性为一体,是学习C语言的优秀入门教材,在世界范围内广受欢迎,口碑极佳。书中除了讲解C程序设计语言,还广泛介绍了作为一名C程序设计人员应该掌握的必要知识,并提供了大量的实用性很强的编程...
  • //递归赋值右树 bt->rightchild = create(); } //返回根节点 return bt; } /****************************************************************/ /* void InOrder(BinSearchTree ptree) */...
  • 17.3 使用数据流分析结果的几种转换 274 17.3.1 公共表达式删除 274 17.3.2 常数传播 275 17.3.3 复写传播 275 17.3.4 死代码删除 275 17.4 加快数据流分析 276 17.4.1 位向量 276 17.4.2 基本块 276 17.4.3 结点...
  • 17.3使用数据流分析结果的几种 转换 17.3.1公共表达式删除 17.3.2常数传播 17.3.3复写传播 17.3.4死代码删除 17.4加快数据流分析 17.4.1位向量 17.4.2基本块 17.4.3结点排序 17.4.4使用一定值链和定值一...
  • 现代编译原理C语言描述-虎书中文版

    热门讨论 2010-04-11 16:47:52
    17.3 使用数据流分析结果的几种转换 274 17.3.1 公共表达式删除 274 17.3.2 常数传播 275 17.3.3 复写传播 275 17.3.4 死代码删除 275 17.4 加快数据流分析 276 17.4.1 位向量 276 17.4.2 基本块 ...
  • 今天下午考完试后在宿舍看了C语言的第七章内容,数组和字符串的知识,个人觉得这些地方的内容要比前边的有点难度,看起来和理解起来也有点难度,但是看懂了后就会觉得一下豁然开朗,然后会把不太熟悉的地方多看...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 125
精华内容 50
关键字:

c语言的子程序有几种

c语言 订阅