【C语言复习】DAY2 循环+条件判断+函数递归(未完待续后续更新 汉诺塔题目一些经典递归题目

学习目标:

  • 复习循环语句
  • 复习条件语句
  • 复习函数
  • 备注:C++库函数说明:cplusplus.com
               C官网:cpppreference.com
               程序员知乎:stackoverflow.com

学习内容:

  1. 掌握while,for ,dowhile()使用方法 ,完成相应题目
  2. 掌握if,switch 使用方法 ,完成相应题目
  3. 掌握函数递归 迭代,完成相应题目
  4. 额外补充知识 getchar,putchar,scanf 以及输入缓冲区

学习时间:

  • 2022/5/28

学习产出:

  • CSDN 技术博客 1 

具体内容:

一.循环案列

1.打印1-100的奇数

short i;
for(i=0;i<100;i++)
{
    if(1 == i%2)
    {
        printf("%d\n",i);
    }

}

2. 使用嵌套循环将“hehe”打印一百次,请判断打印结果,并解释

int i=0;
int j=0;
for(;i<10;i++)
{
    for(;j<10;j++)
    {
        printf("hehe\n");
    }
}

          结果只打印10个hehe,因为外循环第一次进入时 i=0,外循环第二次进入时i=1,此时内循环中的j 已经在上次循环中自增到10,所以只打印10个hehe

3. 第二题的变种,解释结果

int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x,y++)
{
	printf("hehe\n");
}
		

 打印两次hehe,因为for 进行一次时 已经 开始一圈 自增 和x++没有区别

4.面试题 请问下面循环了多少次

int i = 0;
int j = 0;
for (i = 0, j = 0; i = 0; i++, j++)
{
	i++;
}

   0次,i=0 ,即将0传入for的条件判断语句,条件为假 跳出循环

5.n的阶乘

int i=0;
int n=0;
int sum=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
    sum=i*sum;
   
}
 printf("%d的阶乘为:",sum);

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

int i;
int temp=1;
int sum=0;

for (i = 1; i <= 10; i++)
{
	temp *= i;
	sum +=temp;

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

7.输入周几 判断是工作日还是休息日

int day;
scanf("%d",&day);
switch(day)
{
    case1:
    case2:
    case3:
    case4:
    case5:
        printf(“今天是工作日”);break;
    case6:
    case7:
        printf(“今天是休息日”);break;
}

二.函数案例

        1.学会查找库函数的使用说明

                     //C++库函数说明:cplusplus.com
                    // C官网:cppreference.com
                    // 程序员知乎:stackoverflow.com

                参考使用说明 使用strcpy

                 1.1strcpy函数

char arr []="MUJI";
char arr2[]="########";
strcpy(arr2,arr1);
//说明:arr2是目标,arr1是源头,将源头 拷贝到 arr2。形参是char指针类型,而数组名就是数组第一个元素的地址,所以不用加入&取地址
printf("%s\n",arr2);

    2.函数的调用 

                分为传值调用,传址调用            

//传值调用
swap1(int a,int b)//函数将a和b交换
{
    int temp=0;
    temp=a;
    a=b;
    b=temp;

}
int main()
{
    int a=1;
    int b=2;
    swap1(a,b);
    printf("a:%d\n,b:%d\n",a,b);

    return 0;
}

   发现 a和b并没有交换,是因为 在main里使用swap1 传入实参时,会开辟新的内存空间 给swap1使用,swap1里的空间 的ab会在 调用完函数后销毁,并不会干扰到main里面的 ab空间存放的值; 而传址就很好的解决这个问题,使用指针指向存放ab的地址.

//传址调用
swap2(int *a, int *b);
{
    int temp=0;
    temp=*a;
    *a=*b;
    *b=*a;
}
int main()
{
    int a=1;
    int b=2;
    swap2(&a,&b);
    printf("a:%d,b:%d\n",a,b);
}

3.函数的递归

        3.1理论:程序自身调用自身, 函数的递归 作为一种算法,极大减少了代码量

         3.2递归常见的错误

              无条件递归或者栈区对放不下时 就会导致栈溢出,所以一定要加入 递归后越来向 结束递归的条件接近,且不能存放的递归数据过大;

                 //栈区被消耗干,会跳出错误,stack overflow,即栈溢出

                //栈区:存放局部变量,函数形参,由编译器自动分配释放

                //堆区:动态开辟的内存,一般由程序员释放

                //静态区:存放全局变量 static修饰的变量,程序结束后系统自动释放

                //文字常量区:常量字符,程序结束后系统自动释放

                //程序代码区:存放函数体的二进制代码

4.递归练习

        4.1接受一个无符号整型值,按照顺序打印每一位,如输入1234,输出 1 2 3 4

        

int print(int num)
{

    if(num>9)
    {
       print(num/10);
    }
    printf("%d",num%10);//%10是留下最后一位
    

}

int main()
{
    unsigned int num=0;
    scanf("%d",&num);
    print(num);


}

    4.2 编写函数来计算 字符串长度,不允许使用编写临时变量

         

my_lenstr(char *str)
{
    if(*str!='\0')
    {
       return 1+my_lenstr(str+1);
        
    }
    else
    {
        return 0;
    }

}


int main()
{    
    char arr[]='bit';
    
    
    printf("%d",my_lenstr(arr));
    
    return 0;
}

    //

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值