C语言知识点笔记2(例题合集)

185 阅读3分钟

C语言知识点笔记2(例题合集)

此笔记是我考研备考专业课期间听课的一些C语言知识点混记,可能会有一点乱,有需要的朋友们可以翻阅一下,有利于巩固C语言知识点!

本集为例题合集,推荐大家认真看完并上机敲一下

1🚩 例题1:问循环几次?

int main()
{
    int i = 0;
    int k = 0;
    for(i=0,k=0;k=0;i++,k++)
        k++;
    return 0;
}
结果:循环0次;k=0,0为假赋值给k,判断为假直接跳出

2🚩 例题2:计算n的阶乘

int main()
{    
    int i = 0;
    int n = 0;
    int ret = 1;
    scanf("%d", &n);
    for(i=1;i<=n;i++)
    {
        ret *= i;
    }
    printf("%d\n",ret);
    return 0;
}

3🚩 例题3:计算1!+2!+3!+...+10!

int main()
{    
    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;
​
    法一:
    for(n=1;n<=10;n++)
    {
        ret = 1;//计算n的阶乘之前,把ret初始为1
        for(i=1;i<=n;i++)
            {
                ret *= i;
            }
        sum += ret;
    } 
    printf("%d\n",sum);   
    return 0;
​
    法二:简化版
    //2!=2*1
    //3!=3*2!
    //4!=4*3!
    for(n=1;n<=10;n++)
    {
        ret *= n;
        sum += ret;
    }
    printf("%d\n",sum);
    return 0;
}

4🚩 例题4:在一个有序数组中查找具体的某个数字

int main ()
{    
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int k = 7; //要查找的数字
    //在arr这个有序的数组中查找k(7)的值
    int sz = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
​
    int left = 0;//第一个元素下标
    int right = sz-1;//最后一个元素下标
​
    while(left<=right)
    {
        int mid = (left + right) / 2;
        if(arr[mid] < k)
        {
            left = mid +1;
        }
        else if(arr[mid] > k)
        {
            right = mid -1;
        }
        else
        {
            printf("找到了:%d\n",mid);
            break; 
        }    
    }
    if(left > right)
    {
        printf("找不到了\n");
    }
    return 0;
}

5🚩 例题5:编写代码,演示多个字符从两端移动,向中间汇聚 (这题很有意思,大家可以上机试一下)

#include <stdio.h>
#include <string.h>
#include <windows.h>int main()
{
    char arr1[]="welcome to bit!!!!!!";
    char arr2[]="####################";
    int left = 0;
    int right = 0;
    int right = strlen(arr1)-1;//数组长度减1就是最后一项的下标
​
    while(left<=right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n",arr2);
        sleep(1000);//睡眠一秒  出现一步步渐变效果
        system("cls");//清空屏幕  清除上一次输出的语句
        left++;
        right--;
    }
    printf("%s\n",arr2);
    return 0;
    /*显示为####################逐渐从两边变换,最后变换为welcome to bit!!!!!!*/
}

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

#include <string.h>
//strlen strcmp等字符串函数调用的头文件int main()
{
    int i = 0;
    //假设正确的密码是字符串"123456"
​
    char password[20]={0};
    for(i=0;i<3;i++)
    {
        printf("请输入密码:>");
        scanf("%s",password);  // password是数组名,不需要取地址
        //if(password == "123456")  写法错误-两个字符串比较,不能使用==,应该使用strcmp
        if(strcmp(password,"123456")==0)//strcmp比较字符串
        {
            printf("登录成功\n");
            break;
        }
        else
        {
            printf("密码错误,重新输入!\n");
        }
    }
    if(i==3)
        printf("三次密码均错误,退出程序\n");
    return 0;
}

7🚩 例题7:猜数字游戏实现 (1.自动产生一个1-100之间的随机数 2.猜数字 a.猜对了,就恭喜你,游戏结束 b.你猜错了,会告诉猜大了还是猜小了,继续猜,直到猜对 3、游戏可以一直玩,除非退出游戏)

#include <stdlib.h>
//rand、srand函数调用
#include <time.h>
//time函数调用void menu()
{
    //菜单
    printf("*************************\n");
    printf("******** 1.play  ********\n");
    printf("******** 0.exit  ********\n");
    printf("*************************\n");
}
​
void game()
{
    //猜数字游戏的实现
​
    //1.生成随机数
    //rand函数返回了一个0-32767之间的数字
​
    int ret = rand()%100+1; //%100的余数是0-99,然后+1,范围就是1-100
​
    //2.猜数字
    int guess = 0;
    while (1)
    {
        printf("请猜数字:>");
        scanf("%d",&guess);
        if (guess < ret)
        {
            printf("猜小了\n");
        }
        else if (guess > ret)
        {
            printf("猜大了\n");
        }
        else 
        {
            printf("恭喜你,猜对了\n");
            break;
        }
    }
}
​
int main()
{
    int input = 0;
    //时间-时间戳
    //srand函数是随机数发生器的初始化函数
    srand((unsigned int)time(NULL)); //time为int型 (unsigned int)进行强制转换
​
    do
    {
        menu();//打印菜单
        printf("请选择:>");
        scanf("%d",&input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
            break;
        }
    }while (input); //当input等于0时结束 不再循环
    return 0;
}

8🚩 例题8.给定两个数,求这两个数的最大公约数

方法一:
int main()
{
    int m = 0;
    int n = 0;
    scanf("%d%d", &m, &n);//如24 18 这两个数的最大公约数不会超过18
    int max = 0;
    //假设最大公约数就是m和n的较小值
    if (m>n)
        max=n;
    else 
        max=m;
    while (1)
    {    
        if (m%max==0 && n%max==0)//两数都能整除
        {
            printf("最大公约数就是:%d\n",max);
            break;
        }
        max--;
    }
    return 0;
}
方法二:
辗转相除法
int main()
{
    int m = 0;
    int n = 0;
    scanf("%d%d", &m, &n);
    int t = 0;
    while (t=m%n)//m比n大
    {
        m = n;
        n = t;
    }
    printf("最大公约数: %d\n",n);
    //最小公倍数 = m*n/最大公约数;
    return 0;
}
    

9🚩 例题9:打印1000年~2000年之间的闰年

int main()
{
    int y=0;
    int count = 0;//打印次数
    for(y=1000;y<=2000;y++)
    {
        //判断y是不是闰年(两种方法)
        //1.被4整除且不能被100整除是闰年
        //2.能被400整除是闰年
​
        if(y%4==0)
        {
            if(y % 100 !== 0)
            {
                printf("%d ",y);
                count++;
            }
        }
        if(y%400==0)
        {
            printf("%d ",y);
            count++;
        }//也可以直接写为 if(((y%4==0) && (y%100!=0)) || (y%400==0))
    }
    printf("\n count = \n",count);
    return 0;
}

10🚩 例题10:打印100~200之间的素数 (素数-质数-只能被1和它本身整除)

#include <math.h>
#include <stdio.h>
​
int main()
{
    int i = 0;
​
    //sqrt - 是开平方函数 - 引用头文件为math.h
​
    for(i = 101; i <= 200; i += 2)//最简算法
    {
        //判断i是否为素数
        //用2~i-1之间的数字去除以i,看能不能整除
​
        int j = 0;
        int flag = 1;//假设i就是素数
        for(j=2; j <= sqrt(i);  j++)
        {
            if(i%j==0)
            {
                flag = 0;//不是素数
                break;
            }
        }
        if(flag == 1)
        {
            printf("%d ", i);//素数
        }
    }
    return 0;
}