C语言知识点笔记3

65 阅读1分钟

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

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

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

1🚩 例题1:用函数判断100~200之间的素数:

#include <math.h>
​
int is_prime(int n)
{
    //2~n-1之间的数字
    int j = 0;
    for(j=2;j<=sqrt(n);j++)
    {
        if(n%j==0)
            return 0;
    }
​
    return 1;
}
​
int main()
{
    //100~200之间的素数
    int i = 0;
    int count = 0;
    for(i=100; i<=200; i++)
    {
        //判断i是否为素数
        if(is_prime(i)==1)
        {
            count++;
            printf("%d", i);
        }
    }
    printf("\n count = %d\n",count);
    return 0;
}

2🚩 例题2:用函数判断是不是闰年:

//is_leap_year如果判断是闰年返回1;不是闰年返回0。
//一个函数如果不写返回类型,默认返回int类型int is_leap_year(int n)
{
    if((n%4==0&&n%100!=0) || (n%400=0)) //1、能被4整除且不能被100整除 2、能被400整除
        return 1;
    else
        return 0;
}
​
int main()
{
    int y = 0;
    for(y=1000;y<=2000;y++)
    {
        if(is_leap_year(y)==1)
        {
            printf("%d ",y);
        }
    }
    return 0;
}

3🚩 例题3:写一个函数,实现一个整型有序数组的二分查找:

int binary_search(int a[],int k, int s)
{    
    int left = 0;
    int right = s - 1;
    while(left<=right)
    {
        int mid = (left +right) / 2;
        if(a[mid] > k)
        {
            right = mid - 1;
        }
        else if(a[mid] < k)
        {
            left = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;//找不到了
}
​
int mian()
{    
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int key = 7;
    int sz = sizeof(arr) / sizeof(arr[0]);
    //找到了就返回找到的位置的下标
    //找不到返回-1
    int ret = binary_search(arr, key, sz);
    //数组arr传参,实际传递的不是数组的本身;仅仅传过去了数组首元素的地址
    if(-1 == ret)
    {
        printf("找不到\n");
    }
    else
    {
        printf("找到了,下标是:%d\n",ret);
    }
    return 0;
}

4🚩 例题4:写一个函数,每调用一次这个函数,就会将num的值增加1。

void Add(int *p)
{
    (*p)++;
}
​
int main()
{
    int num = 0;
    Add(&num);
    printf("%d\n", num);//1
​
    Add(&num);
    printf("%d\n", num);//2
​
    Add(&num);
    printf("%d\n", num);//3
    
  return 0;
}

5🚩 例题5(递归):接受一个整型值(无符号),按照顺序打印它的每一位。例如:输入1234,输出 1 2 3 4

void print(unsigned int n)
{
    if(n>9)
    {
        print(n/10);
    }
    printf("%d ", n % 10);
}
​
int main()
{
    unsigned int num = 0;
    scanf("%u", &num);//1234 &u输入无符号整型
    //递归-函数自己调用自己
    print(num);//print函数可以打印参数部分数字的每一位
​
    return 0;
}

6🚩 例题6(递归):编写函数不允许创建临时变量,求字符串的长度

int my_strlen(char* str)
{
    //递归
    if(*str != '\0')
        return 1+my_strlen(str+1);//加1对应下一个字符的地址
    else
        return 0;
}
​
int main()
{
    char arr[] = "bit";
    //['b']['i']['t']['\0']
​
    //模拟实现一个strlen函数
    printf("%d\n", my_strlen(arr));
​
    return 0;
}

7🚩 例题7(递归):计算阶乘

int Fac(int n)
{
    if (n<=1)
        return 1;
    else
        return n*Fac(n-1);
}
​
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fac(n);
​
    printf("%d\n", ret);
    return 0;
}

8🚩 例题8. 求第n个斐波那契数: 1 1 2 3 5 8 13 21 33 55....

int Fib(int n)
{
    //递归可以求解,但是效率太低
    法一:
    if(n<=2)
        return 1;
    else
        return Fib(n-1)+Fib(n-2);
​
​
    法二:
    int a = 1;
    int b = 1;
    int c = 1;
    while(n>2)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}
​
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = Fib(n);
​
    printf("%d\n", ret);
    return 0;
}

9🚩 例题9:计算1/1-1/2+1/3-1/4....+1/99-1/100的值,打印出结果

int main()
{
    int i = 0;
    double sum = 0.0;
    int flag = 1;
    for(i=1;i<=100;i++)
    {
        sum += flag*1.0/i;
        flag = -flag;
    }
    printf("%lf\n",sum);
    return 0;
}

10🚩 例题10:求十个整数中最大值

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int max = arr[0];
    int i = 0;
    for(i=0;i<10;i++)
    {
        if(arr[i]>max)
        {
            max = arr[i];
        }
    }
    printf("%d\n",max);
    
    return 0;
}

11🚩 例题11:输出乘法口诀表

int main()
{
    int i = 1;
    //行数
    for (i=1;i<=9;i++)
    {
        //打印一行
        int j = 0;
        for(j=1; j<=i; j++)
        {
            printf("%d*%d=%-2d",i,j,i*j);
        }
        printf("\n");
    }
    return 0; 
}