首页 > 其他分享 >重温c语言之,7天开整,就是随便的写写,第七天

重温c语言之,7天开整,就是随便的写写,第七天

时间:2024-11-06 20:41:55浏览次数:1  
标签:10 函数 int 写写 num str printf 天开 第七天

一:素数又见素数

  但这次不一样,这次需要用到函数,利用函数来将素数区分出来,直接上代码

 1 #include <stdio.h>
 2 #include<math.h>
 3 int prime_num(int num)
 4 {
 5     for (int i = 2; i < sqrt(num); i++)
 6     {
 7         if (num % i == 0)
 8         {
 9             return 0;
10         }
11     }
12     return 1;
13 }
14 
15 int main()
16 {
17     int num = 0;
18     printf("请随机写一个数字.\n");
19     scanf("%d", &num);
20     if ((prime_num(num)) == 1)//其实这里可以不用写等于的,因为在判断里面,非0为true,0为false
21     {
22         printf("这个数字是素数:%d\n", num);
23     }
24     else
25     {
26         printf("这个数字不是素数:%d\n", num);
27     }
28     return 0;
29 } 

  我这里用到了sqrt()这个函数,因为在这里面,偶数是不能当素数的,所以直接就是更加高效的进化程序

二:这里是强调函数的高内聚低耦合的观点

  题目:写一个函数,判断一年是否是闰年,打印1000~2000之间的闰年

  直接上代码:

 1 #include <stdio.h>
 2 int leap_year(int year)
 3 {
 4     if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
 5     {
 6         return 1;
 7     }
 8     else
 9     {
10         return 0;
11     }
12 }
13 int main()
14 {
15     for (int i = 1000; i < 2000; i++)
16     {
17         if (leap_year(i))
18         {
19             printf("%d ", i);
20         }
21     }
22 }

  这个直接让判断闰年函数功能变得单一,不去依赖其他函数,自己就可以完成功能,这里我没有在这个函数内部输出闰年,因为可能下一次的时候,我不想输出,我只想判断,那我就用不了这个函数的功能,如果让这个函数变得单一的话,那我所有的想用到这个判断是否是闰年相关的地方,我都可以用到这个函数

 

三:函数

  1、函数可以嵌套调用,但不能嵌套定义

  2、函数递归

  题目是:

  接收一个整形值,按照顺序打印每一位
  //例如:
  //输入:1234 输出: 1 2 3 4

  先直接上代码,

 1 #include<stdio.h>
 2 void print(unsigned int num) {
 3     if (num > 9) {
 4         print(num / 10);
 5     }
 6     printf("%u ", num%10);
 7 }
 8 
 9 //递归的实现
10 int main()
11 {
12     //%d打印有符号的整数,包括正负数
13     //%u打印无符号的整数
14     unsigned int num1 = 0;
15 
16     scanf("%u", &num1);//1234
17     //1 2 3 4 
18 
19     print(num1);
20     return 0;
21 }

  一开始我还没有真正明白这体式什么意思,知道我知道了这个题目:递归,是吧大的问题化成小的问题,就比如这个

  这里就是从键盘上面收到:1234,而我们想要的结果是:1 2 3 4 ,那怎么解决呢?

  这个时候我们想到了:求余运算,它能展现想要的位置上的数字,那这个输出的递归函数该怎么理解呢?

  键盘先输入:1234,计算机收到了数字,随着程序的运行,把1234这个数字转入到了print()递归函数中,之后因为这个数字要大于9(为什么是9呢?因为想要个位上的数字,求余10就可以得出个位上的数字,所以要把十位以上的数字全部去除),之后就是数字大于9,

  开始了第一次print()递归函数重运行,这个时候传入的数字是:123,因为里面的数字是:先进行num/10运算再输入的,123>9,

  所以第二次运行print()递归函数重运行,这个时候传入的数字是:12,方法同上:123/10=12,12>9

  最后一次运行print()函数,这个时候传入的数字是:1,12/10=1,1<9,所以这里运行printf(),1%10=1 ,并输出:1 ,屏幕上有:1 

  再倒回来,输出printf()函数,12%10=2,并输出:2 ,屏幕上有:1 2 

  再次倒回来,运行printf()函数,123%10=3,并输出:3 ,屏幕上有:1 2 3 

  最后,再次运行printf()函数,1234%10=4,并输出:4,屏幕上有:1 2 3 4 

  最终的屏幕上显示:1 2 3 4 

  

  如果这里不写if(num>9),则会造成栈溢出,因为每一次函数调用,都会在栈区申请空间

  所以递归存在限制条件,当满足这个限制条件的时候,递归不再继续;每次递归调用之后,越来越接近这个条件

  if(num>9)                            num/10

 

 

  再来一题:编写函数不允许创建临时变量,求字符串长度

 

  先来个创建临时变量的:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int my_strlen(char* str) {
 4     int cout = 0;//计数,临时变量
 5     while (*str != '\0') {
 6         cout++;
 7         str++;
 8     }
 9     return cout;
10 }
11 int main()
12 {
13     char arr[] = "abc";
14     int len = my_strlen(arr);
15     printf("%d\n", len);
16 }

 

  再来个不创建临时变量的(用到了函数递归):

 1 #include<stdio.h>
 2 #include<string.h>
 3 int my_strlen(char* str) {
 4     if (*str != '\0') {
 5         return 1 + my_strlen(str+1);
 6     }
 7     else
 8     {
 9         return 0;
10     }
11 }
12 int main()
13 {
14     char arr[] = "abc";
15     int len = my_strlen(arr);
16     printf("%d\n", len);
17 }

  my_strlen("abc");
  1 + my_strlen("ab");
  1 + 1 + my_strlen("a");
  1 + 1 + 1 + my_strlen("");

  这个就用到了调用,这里为什么是str+1,而不是str+4/str+8呢,因为是str是一个指针变量,操作系统根据自身多少位来分配给指针变量多少字节,用来存放指针所指向的地址的,这里是不会变动的。

  而str+1是因为str这个指针变量所指向的数据类型是char,是占1个字节,所以才+1,往后移动1个字节;如果是int,则+4,往后移动4个字节

 

标签:10,函数,int,写写,num,str,printf,天开,第七天
From: https://www.cnblogs.com/xiejinghao/p/18529334

相关文章

  • 重温c语言之,7天开整,就是随便的写写,第六天
    一:字符串相比较题目:编写代码实现,模拟用户登录情景,并且只能登录3次。(只允许输入3次密码,密码正确则提示输入成功,如果三次都输入错误,则退出程序)这里就是用到了strcmp这个函数,其实这个函数是让两个字符串同时从左到右转换成ASCLL码,之后两个字符,前面的减去后面的,如果全部减......
  • 重温c语言之,7天开整,就是随便的写写,第五天
    一:库函数---printf()这个函数printf()的返回值是int,这个函数竟然有返回值,值的多少是取决于输出的内容有多少个字符二:循环1、for循环这个循环中,如果判断的地方省略的话,这个循环就是永远成立(恒成立),1for(;;)这样的话,就会无线循环下去--------(弊端1)......
  • 重温c语言之,7天开整,就是随便的写写,第三天+第四天版
    一:指针1、关于指针的含义---粗略例如:inta=10;int*p=&a;这里的*,是说明p是指针变量,int说明p是指向的对象是int类型的*p=20,这里的*是解引用符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象2、关于指针的大小......
  • 重温c语言之,7天开整,就是随便的写写,第二天
    一:操作符除法:如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3;如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础数据类型包含下的)完整的商(包含小数部分的):例如:7/2.0=3.500000;如果想要在pr......
  • 重温c语言之,7天开整,就是随便的写写,第一天
    一:转义字符\t是一个字符,在printf里面,只占一个位置;其他什么的抽象字符,用一个'\'+抽象字符就可以出现;\ddd这个是8进制的,可以转成10进制的,之后参考ASCLL码表即可二:枚举类型的函数与数组一样,有下标,都是从0开始的三:数组可以先不在【】这里面填写多少,但是需......
  • Java面对对象第七天(实训学习整理资料(六)Java中的面向对象(oop))
    目录1、定义2、类与对象的关系3、类中的构造方法(1)特点(2)作用4、对象中的内存结构5、this关键字6、代码块(1)构造代码块(2)局部代码块(3)静态代码块7、匿名对象8、类加载机制(classLoader)9、成员变量和局部变量10、面向对象的三大特性(1)封装性(2)继承性1--定义2--构建......
  • java 基础 实训第七天
    Java(OOP)其他知识1、static(静态)      被static修饰的成员(属性,方法),称为静态成员也叫类成员。他们是在类加载时完成   初始化。而且静态成员可以在没有创建对象时直接通过类就可以访问。      类成员也属于所有对象共享的成员。      静态变......
  • 代码随想录算法训练营第七天|LeetCode 344.反转字符串、LeetCode 541.反转字符串Ⅱ、
    LeetCode 344.反转字符串题目链接:LeetCode344.反转字符串文章链接:代码随想录题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示......
  • 代码随想录第七天
    454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,......
  • 代码随想录算法训练营第七天|leetcode454.四数相加II、leetcode383. 赎金信 、leetcod
    1leetcode454.四数相加II题目链接:454.四数相加II-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,map使用有技巧!LeetCode:454.四数相加II_哔哩哔哩_bilibili自己的思路:第一反应就是暴力搜索,一层一层for循环来完成,就是会超时1.1自己的代码纯纯暴力搜索classSolutio......