三.C语言练习(1)

1.计算n的阶乘


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d",&n);
for(i=1;i<=n;i++)
 {
  ret=ret*i;
 }
printf("ret=%d\n",ret);
return 0;
}

运行结果:输入一个数后按下回车便会开始计算阶乘(但是不能太大了,因为创建的是整型变量)

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

2.计算1!+2!+3!+...+10!


#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for(n=1;n<=10;n++)
 {
  ret = 1;//将ret初始化,否则会保留上次循环的值导致计算结果错误
  for(i=1;i<=n;i++)
   {
    ret=ret*i;
   }
  sum=sum+ret;
 }
printf("sum=%d\n",sum);
return 0;
}

运行结果:sum=4037913

-- -- -- -- -- -- -- -- -- --

对于两层for循环可以优化一下


#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for(n=1;n<=10;n++)
 {
  ret=ret*n;
  sum=sum+ret;
 }
printf("sum=%d\n",sum);
return 0;
}

运行结果:sum=4037913

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

2.在一个有序数组中查找具体的某个数字n。


#include <stdio.h>
int main()
{
int k = 7;
int arr[] = {1,2,3,4,5,6,7,8,9};
//写一个代码,在有序数组中找到7
int i = 0;
int sz=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<sz;i++)
 {
  if(k==arr[i])
   {
    printf("找到了,下标是:%d\n",i);
    break;
   }
 }
if(i==sz)
 {
  printf("找不到\n");
 }
return 0;
}

运行结果:找到了,下标是:6

(把int k = 7改成比9大的数则会打印找不到)

-- -- -- -- -- -- -- -- -- --

学习使用二分查找算法来实现


#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;
int sz =sizeof(arr)/sizeof(arr[0]);//计算元素个数
int left = 0;//左下标
int right = sz-1;//右下标
while(left<=right)//如果左边的数已经大于右边的数说明要找的数不在数组中——跳出循环
 {
  int mid = (left+right)/2;//4除5就是4,因为mid是int类型
  if(arr[mid]>k)
   {
    right=mid-1;//如果right比k大,说明k在1~5之间,mid-1赋给right变成新的右下标
   }             //一次筛选一半,效率比for循环遍历效率更高
else if(arr[mid]<k)
 {
  left=mid-1;
 }
else
 {
  printf("找到了,下标是:%d\n",mid);
  break;
 }
}
if(left>right)
 {
  printf("找不到\n");
 }
return 0;
}       

运行结果:找到了,下标是:6

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

4.编写代码:演示一段字符从两边开始逐渐显示出来


#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "welcome to learn C language";
char arr2[] = "###########################";
int left = 0;
int right = strlen(arr1)-1;
//int reght = sizeof(arr1)/sizeof(arr[0])-2也可以
//减去2是因为sizeof计算大小是会把'\0'也算进去
//思路是创建两个数组,用上一个数组给下一个数组赋值
while(left<=right)//在left<=right的条件下才会继续赋值
 {
  arr2[left]=arr1[left];
  arr2[right]=arr1[right];
  printf("%s\n",arr2);
  //赋值一次,休息一秒
  Sleep(1000);//要引用头文件windows.h,括号中时间的单位是ms(毫秒)
  system("cls");//执行系统命令的一个函数,要引用头文件stdlib.h
  //cls——清空屏幕
  left++;
  right--;
 }
printf("%s\n",arr2);
return 0;
}

运行结果:"welcome to learn C language"逐渐由"###########################"演变出来

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

5.编写代码实现模拟用户登录,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
    int i = 0;
    char password[20] = "0";
    for (i = 0; i < 3; i++)
    {
        printf("请输入密码:>");
        scanf("%s", &password);
        if (strcmp(password, "123456") == 0)
  //不能写if(password==123456)
  //==不能用来比较两个字符串是否相等,应该使用一个字符串函数——strcmp——string compare——字符串比较函数
  //若password与“123456”不相等,strcmp会返回一个非0的数
  //(password>123456是大于零的数,字符比较的详细内容以后会提及)
        {
         
            printf("登录成功\n");
            break;
        }
        else
        {
            printf("密码错误\n");
        }
    }
    if (i == 3)
    {
        printf("三次密码均输入错误,退出程序\n");
    }
    return 0;
}

运行结果:

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

二分查找算法

二分査找也称折半査找,其优点是查找速度快,缺点是要求所要査找的数据必须是有序序列

该算法的基本思想是将所要査找的序列的中间位置的数据与所要査找的元素进行比较,如果相等,则表示査找成功,否则将以该位置为基准将所要査找的序列分为左右两部分

假设要找37,其中mid是中间元素。因为37<54,所以37一定在6~37(54的前一个)之间,此时mid变成12;又因为12<37,所以37一定在12(6的后一个)~37之间,就这样一次缩小一半的查找范围了,最终找到目标数字

-- -- -- -- ---- -- -- -- ---- -- -- -- ---- -- -- -- ---- -- -- -- --

Sleep函数的详细介绍

system函数的详细介绍

strcmp函数的详细介绍

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世长老

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值