c语言是母体语言,是人机交互接近底层的桥梁。
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.双重循环
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;
}
返回下标
#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;
}
一些常用的函数:
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;
}