C程序(约瑟夫问题、5子棋、发牌、整数转化成2进制,sizeof()问题),打印空心实心菱形

 

1.约瑟夫问题:

#include <stdio.h>

//约瑟夫问题

问题概述:有m个人循环数数,将第n个人打印出来。

int main()

{

       int a[100]={0};

       int m;//总人数

       int n;//第几个人出列

       printf("input m:\n");

       scanf("%d",&m);

       printf("input n:\n");

       scanf("%d",&n);

      

       int i=0;//数组下标

       int k=0;//循环计数器

       int count=m;//记录还剩下几个人

       //先将数组a赋初值

       for (i=0;i<100;i++)

       {

              a[i]=i+1;

       }

       i=0;

       while (count>0)//如果还剩下人

       {

              //数到符合条件的那个人

              for (k=0;k<n;k++)

              {

                     if(i >= m ) i=0;

                     if(a[i++]==0) {k--;}

              }

              //将符合条件的人打印出来

              printf("%d\t",a[i-1]);

              a[i-1]=0;

              count--;

       }

       return 0;

}

 

2.五子棋:

#include <stdio.h>

char c[16][16]={'\0'};

int wflag=0;//胜利或者失败标志,0为失败,1为成功

void hjudge(int h,int l);

void ljudge(int h,int l);

void x1judge(int h,int l);

void x2judge(int h,int l);

void init()//初始化棋盘

{

       int i,j;

       for (i=1;i<16;i++)

       {

              for (j=1;j<16;j++)

              {

                     c[i][j]='#';

              }

       }

}

void pt()//打印棋盘

{

       int i,j;

       printf("  ");

       for(j=1;j<16;j++)

              printf("%x ",j);

       printf("\n");

       for (i=1;i<16;i++)

       {

              printf("%x ",i);

              for (j=1;j<16;j++)

              {

                     printf("%c ",c[i][j]);

              }

              printf("\n");

       }

}

int chartodigi(char c)//将输入的字符坐标转化成相应的数字坐标

{

    if (c<='9' && c>='1')

    {return c-'0';

    }

    if (c<='f' && c>='a')

    {return c-87;

    }

       return 0;

}

 

void play1()//棋盘1放置

{

       char rol='0',col='0';int h=0,l=0;

       while ( 1 )

       {

              fflush(stdin);

              printf("请输入你要输入的位置(*):\n");

              scanf("%c%c",&rol,&col);

              h=chartodigi(rol);l=chartodigi(col);            

              if (c[h][l]=='o' || c[h][l]=='*')

              {printf("你输入的位置已经有棋子了 ,请重新输入(*)!\n"); continue;}

              if (c[h][l]=='#') {c[h][l]='*';break;}

              printf("你输入的位置不对 ,请输入正确的位置(*)[1-9][a-f]\n");

       }    

       hjudge(h,l);ljudge(h,l);x1judge(h,l);x2judge(h,l);

}

void play2()//棋盘2放置

{

       char rol='0',col='0';int h=0,l=0;

       while ( 1 )

       {

              fflush(stdin);

              printf("请输入你要输入的位置(o):\n");

              scanf("%c%c",&rol,&col);

              h=chartodigi(rol);l=chartodigi(col);            

              if (c[h][l]=='o' || c[h][l]=='*')

              {printf("你输入的位置已经有棋子了 ,请重新输入(o)!\n"); continue;}

              if (c[h][l]=='#') {c[h][l]='o';break;}

              printf("你输入的位置不对 ,请输入正确的位置(o)[1-9][a-f]\n");

       }    

       hjudge(h,l);ljudge(h,l);x1judge(h,l);x2judge(h,l);

}

//横判断的标志

void hjudge(int h,int l)

{

       int cnt=0;

       while (c[h][l]==c[h][l-1] && l>=2) l--;

       while (c[h][l]==c[h][l+1] && l<=15) {l++;cnt++;}

       if (cnt>=4)

              wflag=1;

}

//横判竖的标志

void ljudge(int h,int l)

{

       int cnt=0;

       while (c[h][l]==c[h-1][l] && h>=2) h--;

       while (c[h][l]==c[h+1][l] && h<=15) {h++;cnt++;}

       if (cnt>=4)

         wflag=1;

}

//2,4象限判断

void x1judge(int h,int l)

{

       int cnt=0;

       while (c[h][l]==c[h-1][l-1] && h>=2 && l>=2) {h--;l--;}

       while (c[h][l]==c[h+1][l+1] && h<=15 && l<=15) {h++;l++;cnt++;}

       if (cnt>=4)

         wflag=1;

}

//1,3象限判断

void x2judge(int h,int l)

{

       int cnt=0;

       while (c[h][l]==c[h-1][l+1] && h>=2 && l<=15) {h--;l++;}

       while (c[h][l]==c[h+1][l-1] && h<=15 && l>=2) {h++;l--;cnt++;}

       if (cnt>=4)

         wflag=1;

}

int main()

{

       init();pt();

       int cnt1=0;int cnt2=0;

       while(1)

       {

              if(wflag==0) {play1();cnt1++;pt();}

              if(wflag==0) {play2();cnt2++;pt();}

              if(wflag==1) break;

       }

       if (cnt1>cnt2)

       {

              printf("* win!\n");

       }

       else

       {

              printf("o win!\n");

       }

   return 0;

}

3.发牌:

              #include <stdio.h>

#include <time.h>

#include <stdlib.h>

int main()

{

       char c[13]={'0','A','2','3','4','5','6','7','8','9','J','Q','K'};//13张牌,0代表10

       char huase[4]={'@','#','$','&'};

       int  b[4][13]={0};//此数组表示此牌是否发出

       int num;//输入你要发牌的数量

       printf("input num:\n");

       scanf("%d",&num);

       scanf("%*[^\n]");

       scanf("%*c");

       int pstyle=0;//牌的花色,分别用@ # $ &表示

       int pcnt=0;//牌的大小

       while (num>0)

       {

              srand(time(NULL));//在程序中只用一次即可

              pstyle=rand()%4;//pstyle的选择有 0 1 2 3 ,分别代表不同的花色。

              pcnt=rand()%13;

              if(b[pstyle][pcnt]==0)

              { printf("%c%c\t",huase[pstyle],c[pcnt]);b[pstyle][pcnt]=1;num--;}

       }

       return 1;

}

4.数据转化成2进制:

#include <stdio.h>

//将一个数转化成二进制。并将它的二进制输出

int main()

{

       unsigned int u=0x80000000;

       int x;

       printf("input x:\n");

       scanf("%d",&x);

       int i;

       for(i=0;i<32;i++)

       {

              if(x&u) printf("1");

              else    printf("0");

              u=u>>1;

       }

       printf("\n");

       return 1;

}

5.sizeof()问题:

http://blogold.chinaunix.net/u/20828/showart_438003.html

#include <stdio.h>

#include <stddef.h>//offsetof()所在的头文件

//结构体中的sizeof是将每个成员都取其中的最大的sizeof来分配,当结构体中包含有另外一个结构体时,是将这个结构体打散来看的。可以理解为把它打开来求取其sizeof

struct S1

{

    double c;

    int i;

};

struct S2

{

       int i;

       S1 s1;

    char c;  

};

int main()

{

       S1 s1 = { 'a', 0xFFFFFFFF };

      printf("sizeof(S1)=%d\n",sizeof(S1));//16  . pack后为12

       printf("sizeof(S2)=%d\n",sizeof(S2));//32   . pack后为18

       printf("offsetof(S2)=%d\n",offsetof(S2,c));//24,求在S2中c的地址偏移量  . pack后为16

       return 0;

}

sizeof有两个原则,一个是就每个变量而言,它的地址是占位符的宽度的倍数。另一个就整体而言,总体的sizeof要是所有变量的最长宽度的倍数(在unix下最长宽度默认为4,若超过4,以4为准,在windows下默认为8.).

sizeof(一个空的结构体)在不同的平台下是不同的,在unix下是0 ,在windows下是1。

有一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令。它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关。#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么
该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,
公式如下:
offsetof( item ) = min( n, sizeof( item ) )

再看示例:
#pragma pack(push)  // 将当前pack设置压栈保存
#pragma pack(2) // 必须在结构体定义之前使用
结构体定义
#pragma pack(pop) // 恢复先前的pack设置

注:void pt(int a[],int n) 在此函数中的sizeof(a)=4.因为此时并不知道a这个数组有多少个元素,所以a只是代表指向数组的指针,故为4.但是要在知道元素个数的情况下,比如int a[9],此时sizeof(a)=36.

6.打印空心实心菱形

#include "stdafx.h"
#include <iostream.h>

#define  IABS(x) ( (x)>0? (x):(-x))
void pt1(int size)  //打印实心菱形
{
 for (int i=-size;i<=size;i++ )
 {
  for (int j=-size;j<=size;j++ )
  {
   if(IABS(i)+IABS(j)<=size)
    cout<<"*";
   else
    cout<<" ";
  }
  cout<<endl;
 }
}
void pt2(int size)//打印空心菱形
{
 for (int i=-size;i<=size;i++ )
 {
  for (int j=-size;j<=size;j++ )
  {
   if(IABS(i)+IABS(j)==size)
    cout<<"*";
   else
    cout<<" ";
  }
  cout<<endl;
 }
}
int main()
{
 pt1(5);
 pt2(5);
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值