C语言笔记—循环入门题型和猜数游戏

Posted 影中人lx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言笔记—循环入门题型和猜数游戏相关的知识,希望对你有一定的参考价值。

目录

一、对三个数进行排序

方法一:函数

方法二:依次交换数值

方法三:用if语句判断条件

二、最大公约数和最小公倍数

1.最大公约数

        (2)辗转相除法

 2.最小公倍数:

三、年份和日期问题

判断是否是闰年:

 四、素数

 五、几个函数

1.strcmp()

2.rand函数、srand函数和time函数

1.rand函数

2.srand函数

3.time函数和时间戳

六、简单版猜字游戏


一、对三个数进行排序

方法一:函数

#include<stdio.h>
int MAX(int a,int b)
{
    int max=a>b?a:b;
    return max;
}
int MIN(int a,int b)
{
    int min=a<b?a:b;
    return min;
}
int main()
{
    int a=0,b=0,c=0;
    scanf("%d %d %d",&a,&b,&c);
    int max=MAX(MAX(a,b),c);
    int min=MIN(MIN(a,b),c);
    int mid=a+b+c-max-min;
    printf("%d,%d,%d",max,mid,min);
    return 0;
} 

方法二:依次交换数值

#include<stdio.h>
int main()
{
    int a=0,b=0,c=0;
    scanf("%d %d %d",&a,&b,&c);
    if(a<b)
    {
        int tmp=a;
        a=b;
        b=tmp;
    }//a中为a,b中的较大值;
    if(a<c)
    {
        int tmp=a;
        a=c;
        c=tmp;
    }
    if(b<c)
    {
        int tmp=b;
        b=c;
        c=tmp;
    }
    printf("%d %d %d",a,b,c);
    return 0;
}
        

方法三:用if语句判断条件

#include<stdio.h>
int main()
{
    int a=0,b=0,c=0;
    scanf("%d %d %d",&a,&b,&c);
    if(a<b&&b<c)
        printf("%d %d %d",a,b,c);
    if(a<c&&c<b)
        printf("%d %d %d",a,c,b);
    if(b<a&&a<c)
        printf("%d %d %d",b,a,c);
    if(b<c&&c<a)
        printf("%d %d %d",b,c,a);
    if(c<a&&a<b)
        printf("%d %d %d",c,a,b);
    if(c<b&&b<a)
        printf("%d %d %d",c,b,a);
    return 0;
}


二、最大公约数和最小公倍数

1.最大公约数

        求出整数a,b两个数的最大公约数

     (1)方法一:遍历法

        

#include<stdio.h>
int main()
 {
    int a=0,b=0;
    scanf("%d %d",&a,&b);    
    int ret=0;
    if(a>b)
        ret=b;
    else
        ret=a;
    while(1)
    {
        if(n%ret==0&&m%ret==0)
        {
            break;
        }
        else
            ret--;
    }
   prinft("最大公约数是:%d",ret);
   return 0;
  }

        (2)辗转相除法

        辗转相除法也叫做欧几里得法,具体的计算过程如下图:     

#include<stdio.h>
int main()
{
    int a=0,b=0;
    scanf("%d %d",&a,&b);
    if(a<b)
    {
        int tmp=a;
        a=b;
        b=tmp;
    }
    int ret=0;
    while(ret=a%b)
    {
        a=b;
        b=ret;
    }
    printf("最大公约数是:%d",b);
    return 0;
}

 2.最小公倍数:

求两个数的最小公倍数方法比较简单,只需要a*b再除以a,b的最大公约数

#include<stdio.h>
int main()
{
    int a=0,b=0;
    scanf("%d %d",&a,&b);
    int num=b;
    if(a<b)
    {
        int tmp=a;
        a=b;
        b=tmp;
    }
    int ret=0;
    while(ret=a%b)
    {
        a=b;
        b=ret;
    }
    printf("最小公倍数是:%d",a*num/b);
    return 0;
}

三、年份和日期问题

判断是否是闰年:

//求出1000到2000的所有闰年
#include<stdio.h>
#include <stdbool.h>
bool isrun(int n)
 {
    return (n%4==0&&n%400!=0)||(n%400==0);
 }
    
int main()
{
    int i=0;
    for(i=1000;i<=2000;i++)
    {
        if(isrun(i))
        {
            printf("%d ",i);
        }
    }
    return 0;
 }
           

    

//思路是使用Kim larsen公式,也可以使用zelle公式
char * dayOfTheWeek(int day, int month, int year)
{
    if(month==1||month==2)
    {
        month+=12;
        year--;
    }
    int w=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
    char *arr[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
    return arr[w];
}

bool isleapyear(int n)
{
    return (n%4==0&&n%400!=0)||(n%400==0);
}
int strtoint(char*str,int len)//len为传递的字符串的长度
{
    int i=0;
    int sum=0;
    for(i=0;i<len;i++)
    {
        sum=sum*10+(str[i]-'0');
    }
   return sum;
}

int dayofyear(char*date)
{
    int monthday=[31,28,31,30,31,30,31,31,30,31,30,31};
    int year=strtoint(date,4);
    int month=strtoint(date+5,2);
    int dat=strtoint(date+8,2);
    monthday[1]=isleapyear(year)?29:28;
    int allday=0;
    for(int i=1;i<month;i++)
    {
       allday=allday+monthday[i-1];
     }
     alllday=allday+day;
    return allday;
}

 四、素数

判断一素数的个数

//判断100到200之间素数的个数
#include<stdio.h>
#include<math.h>
int main()
{
    int i=0;
    int cnt=0;
    for(i=100;i<201;i++)
    {
        int flag=1;
        int j=0;
        for(j=2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
                flag=0;
                break;
            }
        }
        if(flag==1)
        {
          printf("%d ", i);
          cnt++;
        }
    }
  printf("\\n");
  printf("素数的个数是%d",cnt);
  return 0;
}

素数判定 埃氏筛选

int countPrimes(int n) 
{
    if (n < 2) 
    {
        return 0;
    }
    int isprime[n];
    memset(isprime,0,sizeof(isprime));
    int cnt=0;
    for(int i=2;i<n;i++)
    {
        if(!isprime[i])//2是偶素数
        {
         cnt++;
         if((long long)i*i<n)
         {
          for(int j=i*i;j<n;j+=i)
          {
            isprime[j]=1;
          }
         }
        }
    }
    return cnt;
 }
         
          

 五、几个函数

1.strcmp()

strcmp函数的作用是比较两个字符串的关系

strcmp函数的返回值有三种情况:大于0,等于0,小于0;

这些函数中的每一个的返回值表示 string1 到 string2 的字典关系。string1 到 string2 的值关系
< 0 string1 小于 string2
0 string1 与 string2 相同
> 0 string1 大于 string2

这里的大小是值字符串的ASCII码值。两个字符串从左到右依次比较每一个字符的ASCII值,直到遇见不同的字符或者'\\0'为止。

#include <string.h>
int main()
{
 int i = 0;
 char password[20] = "";
 for (i = 0; i < 3; i++)
 {
	printf("请输入密码:>");
	scanf("%s", password);
	if (strcmp(password, "123456") == 0)//比较2个字符串是否相等,不能使用==,而应该使用strcmp 
     {                                 //这个函数
		printf("登陆成功\\n");
		break;
	 }
    else
	{
		printf("密码错误\\n");
	 }
	if (i == 3)
    {
	printf("三次密码均错误,退出程序\\n");
	}
	return 0;
}

2.rand函数、srand函数和time函数

1.rand函数

rand 返回一个伪随机数,rand()函数是使用线性同余法做的,它并不是真的随机数,因为其周期特别长,所以在一定范围内可以看成随机的。

rand 函数返回一个范围为 0 到 RAND_MAX 的伪随机整数。 在调用 rand 之前,使用 srand 函数为伪随机数生成器设定种子。

生成[0,1]的随机数

num=rand()/RAND_MAX;

2.srand函数

srand函数的作用是生成随机数的生成种子。种子的任何其他值都将生成器设置为随机起点。 rand 检索生成的伪随机数。 在对 srand 的任何调用之前调用 rand 生成的序列与以 1 传递的种子调用 srand 生成的序列相同。

那我们如何引入一个种子?

3.time函数和时间戳


函数功能: 得到当前日历时间或者设置日历时间。返回值:time 返回以秒为单位的时间。 返回值会转化为一个时间戳。

通俗的讲,时间戳(timestamp)是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。

一般来说,我们会使用time(NULL)或time(0)来表示变化的种子,为unsigned int类型。当我们在不同时刻运行程序时,就会有不同的随机数种子,因此就可以得到不同的结果。如果我们想要生成随机数我们可以使用以下代码

srand((unsign int) time(NULL))
int num=rand()

六、简单版猜字游戏

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("*******************************************\\n");
	printf("*******************************************\\n");
	printf("*******************************************\\n");
	printf("***************     1.play  ***************\\n");
	printf("***************     0.exit  ***************\\n");
	printf("*******************************************\\n");
	printf("*******************************************\\n");
	printf("*******************************************\\n");
}
void play()
{
	int k = rand()%100+1;
	int a = 0;
	printf("这个数字在1到100之间\\n");
	for (int i = 5;i > 0;i--)
	{
		printf("请输入你认为正确的数字:\\n");
		scanf("%d", &a);
		if (a > k)
		{
			printf("这个数字大了\\n");
		}
		else if (a == k)
		{
			printf("恭喜你猜对了\\n");
			printf("真厉害\\n");
			break;
		}
		else 
		{
			printf("这个数字小了\\n");
		}
		if (i - 1 > 0)
		{
			printf("加油!你还有%d次机会\\n", i - 1);
		}
		if (i - 1 == 0)
		{
			printf("很遗憾,机会用光了,请重新开始");
			break;
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));//生成随机时间;
	int input = 0;
	do
   {
		printf("---------------猜数字游戏----------------\\n");
	menu();
	printf("请选择开始游戏:\\n");
	scanf("%d", &input);
	switch(input)
	{
	case 1:
		printf("开始游戏\\n");
		play();
		break;
	case 2:
		printf("退出游戏\\n");
		break;
	default :
		printf("请输入正确的数字:\\n");
		break;
	}
    } while (input);

	return 0;
}

以上是关于C语言笔记—循环入门题型和猜数游戏的主要内容,如果未能解决你的问题,请参考以下文章

C语言写猜数游戏

c语言猜数游戏编程

猜数小游戏代码实现

c语言写猜数游戏,就是那个几A几B的,但改成电脑猜数,就是电脑1抽数字,电脑2猜数字,求AI代码阿

c语言猜数游戏

《C#零基础入门之百识百例》(三十一)方法定义 -- 猜数游戏