您的位置:首页 > 其它

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

2011-08-13 22:25 756 查看

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐