c语言程序设计

c语言程序设计基础

  • C生万物
    • 计算n!
    • 1!+2!+3!+4!+.......n!
    • 在一个有序数组中查找具体的数字n(折半查找)
    • 多个字符从两端移动,向中间汇聚
    • 将字符串输入到数组中
    • 模拟电脑登录(字符串比较函数)
    • 猜数字游戏
    • 求两个数的最大公约数

C生万物

c语言是母体语言,是人机交互接近底层的桥梁。

计算n!

1.循环
	int i;
	int sum=1;
	int num;
	scanf("%d",&num);
	for(i=1;i<=num;i++)
	{
		sum=sum*i;
	}
	printf("%d\n",sum);

2.递归
int p(int num)
{
	if(num==0)
	{
		return 1;

	}
	else
	{
		return num*p(num-1);
	}

}

1!+2!+3!+4!+…n!

1.双重循环
int main()
{
	int i;
	int sum=1;
	int num;
	int count=0;
	int j;
	scanf("%d",&num);
	for(j=num;j>0;j--)
	{
		for(i=1;i<=j;i++)
		{
			sum=sum*i;
		}
		count=count+sum;
		sum=1;//把sum初始化
	}
	
	printf("%d\n",count);

	return 0;


}
2.递归+循环
int p(int num)
{
	if(num==0)
	{
		return 1;

	}
	else
	{
		return num*p(num-1);
	}

}
int main()
{
	int i;
	int sum=0;
	int num;
	scanf("%d",&num);
	for(i=num;i>0;i--)
	{
		sum+=p(i);

	}
	
	printf("%d\n",sum);

	return 0;


}

在一个有序数组中查找具体的数字n(折半查找)

返回下标
#include 
#include 
#include 

int main()
{

	int arr[]={1,2,3,4,5,6,7,8,9,10};
	int num;
	int len;
	int left;//左右查找边界
	int right;
	int mid;
	printf("请输入你要查找的数字");
	scanf("%d",&num);
	//计算数组元素个数
	len=sizeof(arr)/sizeof(arr[0]);//10
    //printf("%d",len);
	left=0;
	right=len-1;
	while(left<=right)
	{
			mid=(left+right)/2;
			if(arr[mid]>num)
			{
				right=mid-1;
				
			}
			else if(arr[mid]<num)
			{
				left=mid+1;
				
			}
			else
			{
				printf("找到了下标为:%d\n",mid);
				break;
			}
	}
	if(left>right)
	{
			printf("查找失败\n");
	}
	return 0;


}

多个字符从两端移动,向中间汇聚

strlen()求字符串长度
int main()
{
	char arr1[]="Welcome to China";
	char arr2[]="################";
	int left =0;
	//strlen()求字符串长度
	int right =strlen(arr1)-1;
	while(left<=right)
	{
		arr2[left]=arr1[left];
		arr2[right]=arr1[right];
		printf("%s\n",arr2);
		left++;
		right--;

	}
	return 0;

}

c语言程序设计_第1张图片

将字符串输入到数组中

一些常用的函数:
1.gets()功能是从输入缓冲区中读取一个*字符串*存储到字符指针变量 str 所指向的内存空间。

# include 
int main()
{
    char str[20] = "\0";  //字符数组初始化\0
    printf("请输入字符串:");
    gets(str);
    printf("%s\n", str);
    return 0;
}
========================

2.getchar(),ch=getchar()
从键盘上读取一个字符, 空格也可以
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF
getchar();//可用于把空格给读取掉 处理‘\n’ 。清除缓冲区空格
3.而scanf("%s",p); *只读取空格之前的*

	char arr[100]="";
	scanf("%s",arr);
	printf("%s\n",arr);

在这里插入图片描述

4.清理缓冲区其他字符

while(temp=getchar()!='\n')
	{
		;
	}

5.输入的时候scanf(“%c”, &a);这里的&不能少
而scanf(“%s”,s);这里不能有&符号
%c与%s的区别
char a;
char b[100];
scanf(“%c”,&a); //只能输入一个字符。
scanf(“%s”,b); //可以输入一串不超过100字符的字符串。

方法:

向字符数组中输入字符串
1.int main()
{
	char arr[100]="";
	gets(arr);
	printf("%s\n",arr);
	return 0;


}
2.int main()
{
	char arr[100]="";
	scanf("%s",arr);//只能获取空格之前的字符串
	printf("%s\n",arr);
	return 0;

}
3.getchar();
int main()
{
	int i=0;
	int j;
	char arr[100]="";
	int  ch;
	while((ch=getchar())!='\n')
	{
		arr[i]=ch;
		i++;
	}
	for(j=0;j<i;j++)
	{
		printf("%c",arr[j]);
	}
	
	return 0;

}

模拟电脑登录(字符串比较函数)

功能实现:输入密码 三次不匹配则显示登录失败。
要用到: strcmp(字符数组名1,字符数组名2) ,字符串比较函数。
功能:按照ASCII码顺序比较(对应位置上)(而不是比较两个字符串长度) 两个数组中的字符串,并由函数返回值返回比较结果。

    在VC++6.0下返回值为0,1,-1,具体比较结果如下:
    如果字符串1 = 字符串2,则 strcmp()函数返回值为0;
    如果字符串1 > 字符串2,则 strcmp()函数返回值为1;
    如果字符串1 < 字符串2,则 strcmp()函数返回值为-1。
    在其他编译软件环境下可能返回ASCII值的差。      
#include 
#include 
#include 
int main()
{
	//模拟电脑登录
	int i;
	char password[20]={0};
	for(i=0;i<3;i++)
	{
		printf("请输入密码:》");
		gets(password);
		//两个字符串的比较不能使用等号
		//if(password=="123456")(错误)
		//要使用strcmp()字符串比较函数
		if(strcmp(password,"123456")==0)
		{
			printf("登录成功!\n");
			break;//跳出循环	

		}
		else
		{
			printf("密码错误,请重新输入!\n");
		}
		
		
	}
	if(i==3)
	{
		printf("三次密码均错误,登录失败!\n");
	}
	return 0;
}

猜数字游戏

自动产生1-100之间的小游戏

游戏一直玩,除非主动退出游戏

  • 猜错,告知你猜的数字大/小,继续猜
  • 猜对 ,恭喜你,游戏结束

c语言随机数:
我们一般使用 头文件中的 rand() 函数来生成随机数
它的用法为:

int rand (void);

void 表示不需要传递参数

rand() 会随机生成一个位于 0 ~ RAND_MAX 之间的整数。 RAND_MAX 是
头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C语言标准并没有规定 RAND_MAX的具体数值,只是规定它的值至少为 32767。在实际编程中,我们也不需要知道 RAND_MAX 的具体值,把它当做一个很大的数来对待即可。

#include 
#include 
int main(){
    int a = rand();
    printf("%d\n",a);
    return 0;
}

随机数的本质:
多次运行上面的代码,你会发现每次产生的随机数都一样,这是怎么回事呢?为什么随机数并不随机呢?
实际上,rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”。种子和随机数之间的关系是一种正态分布。
我们可以通过 srand() 函数来重新“播种”,这样种子就会发生改变。srand() 的用法为:

void srand (unsigned int seed);

使用 头文件中的 time() 函数即可得到当前的时间(精确到秒),就像下面这样:

srand((unsigned)time(NULL));
#include 
#include 
int main(){
    srand((unsigned int)time(NULL));//生成随机数之前先播种
    int a = rand();
    printf("%d\n",a);
    return 0;
}

如何生成1-100的随机数呢?

 ret=rand()%100+1;//0-99---->1-100

最终代码实现:

#include 
#include 
#include 
#include 
void menu()
{
	//打印游戏菜单函数
	printf("*******************\n");
	printf("******1.play*******\n");
	printf("******0.exit*******\n");

}
void game()
{
	int ret;
	int guess=0;
	//生成随机数
	//int rand(void);
	//int ret=rand();//产生一个随机数
	srand((unsigned int)time(NULL));//生成随机数之前先播种
	ret=rand()%100+1;//0-99---->1-100
	//猜数字
	while(1)
	{
		printf("请猜数字:>\n");
		scanf("%d",&guess);
		if(guess<ret)
		{
			printf("猜小了\n");
		}
		else if(guess>ret)
		{
			printf("猜大了\n");//提示你猜数字的结果
		}
		else
		{
			printf("猜对了\n");
		}
	}
	
}
int main()
{
	int num;

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d",&num);
		switch(num)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;

		}
	
	}
	while(num);
	
	return 0;
}

求两个数的最大公约数

思路:1.先找到两个数的最小数字作为最大公约数的起始值
2.利用for循环,让改起始值每次减一,依次寻找,能被两者同时整除的数字

int main()
{
	//24 ,18 最大公约数不会超过18
	//先找两个数中最小的数
	int n=0;
	int m=0;
	int max=0;
	int i;
	scanf("%d",&n);
	scanf("%d",&m);
	max=n>m?m:n;//最大公约数先从两个树中的最小数开始
	for(i=max;i>0;i--)//然后依次增一
	{
		if(m%i==0&&n%i==0)//最大公约数的条件
		{
			max=i;
			break;
		}
	}
	printf("最大公约数为:%d\n",max);

	return 0;
}

你可能感兴趣的:(c语言大杂烩,c语言,c++,算法)