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

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

时间:2024-11-05 21:35:17浏览次数:4  
标签:20 函数 num2 int 写写 第六天 printf 天开 num1

一:字符串相比较

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

  这里就是用到了strcmp这个函数,其实这个函数是让两个字符串同时从左到右转换成ASCLL码,之后两个字符,前面的减去后面的,如果全部减完为0,

  那么证明这两个字符串是相同的。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     char password[100];
 6     int i = 0;
 7     for (i = 0; i < 3; i++)
 8     {
 9         printf("请输入密码:>");
10         scanf("%s", password);
11         // 假设密码是:abcd
12         if ((strcmp(password, "abcd")) == 0) // 这里是字符串的函数,用来比较两个函数,如果比较的两个字符串相等,就返回0
13         {
14             printf("密码输入正确。");
15             break;
16         }
17         else
18         {
19             printf("密码输入错误,请再次输入。");
20         }
21     }
22     if (i == 3)
23     {
24         printf("三次密码均输入错误,退出程序");
25     }
26 
27     return 0;
28 }

二:指针变量的大小

指针变量的大小是根据操作系统多少位决定的!!!

直接看代码

 1 #include <stdio.h>
 2 
 3 void fun(int *a)
 4 {
 5     printf("%zu\n", sizeof(a)); // 这里计算的是指针变量,指针变量是根据系统来分配的
 6                                 // X86是4-----32位,8位一个字节,所以32/8=4
 7                                 // X64是8-----64位,8位一个字节,所以64/8=8,我的电脑是64位的,所以,就是8
 8 }
 9 
10 int main()
11 {
12     int a[10] = {0};
13     printf("%zu\n", sizeof(a));
14     printf("%zu\n", sizeof(a[0]));
15     fun(a);
16     return 0;
17 }

结果就是:

40

4

8

三:rand函数

  rand()函数是c语言里面产生随机变量的函数,但是一直只使用这个的话,产生的随机数的结果都是一样的

  所以怎么解决这个问题呢?

  这里变用到了srand()函数,设置随机数生成器种子的函数srand(),会随机生成种子,用这个函数会产生不同的rand()函数序列,但是就是跟二维矩阵差不多的意思,这个函数也有问题,就是生成的种子也会一样,所以怎么解决生成随机数种子一样的问题呢?

  便用到了这个答案来解决:时间戳----time()函数,这个函数就是会随着时间不断地变化,很好的解决了srand()随机产生种子的问题

  下面就是一个例子:

  题目:做一个小游戏--猜大小。电脑随机出一个随机数(0-100),选择猜大小

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 
 5 void menu()
 6 {
 7     printf("***********************************\n");
 8     printf("*******    1.play game     ********\n");
 9     printf("*******    0.exit          ********\n");
10     printf("***********************************\n");
11     printf("请选择输入的数字:");
12 }
13 
14 void game()
15 {
16     // 生成1~100的随机数
17     // 这里用到了时间戳----配上头文件:time.h
18 
19     int num = 0;
20     int ret = rand() % 100 + 1;//这里
21     printf("这次的随机数是:%d\n", ret);
22     printf("请输入1~100之前的数字.\n");
23 
24     while (1)
25     {
26         scanf("%d", &num);
27         if (num > ret)
28         {
29             printf("猜大了!\n");
30         }
31         else if (num < ret)
32         {
33             printf("猜小了!\n");
34         }
35         else
36         {
37             printf("恭喜你才对了!\n");
38             break;
39         }
40     }
41 }
42 
43 int main()
44 {
45 
46     int num = 0;
47     srand((unsigned int)time(NULL));
48     /* 
49     srand()函数的返回值是:unsigend int 类型,而time()时间戳函数的返回类型是time_t类型,所以需要进行强制转换
50     time()这里面的指针变量是获取的时间,但是也可以设置没有,而指针变量的没有------NULL
51      */
52     do
53     {
54         menu();
55         scanf("%d", &num);
56         switch (num)
57         {
58         case 0:
59             printf("退出游戏!\n");
60             break;
61         case 1:
62             game(); // 猜数字的逻辑
63             break;
64         default:
65             printf("输入错误,请重新选择。\n");
66             break;
67         }
68     } while (num != 0);
69 
70     return 0;
71 }

   还有就是为什么不把这串代码放到game函数里面,srand((unsigned int)time(NULL));

  原因有两点:一:如果你将这行代码放在game()函数里面,意味着每次调用game()函数时,都会重新调用srand()函数来初始化种子,那么生成的随机数种子可能会重复,因为时      间戳可能会是一样的

        二:浪费资源,让系统运行变慢

四:goto函数

  这个函数不能跨越函数进行使用,比如在main里面使用goto()函数,如果其外部有一个自己命名的函数,之后运行goto()函数,就跳不过去

  这个函数主要运用场景:多层循环嵌套,跳不出来,便可以用goto()函数来进行break,从而直接免除死循环的危险

  例如:

    

 1 #include <stdio.h>
 2 
 3 int main() {
 4     int i, j;
 5     int found = 0; // 用于标记是否找到特定条件,以便退出循环
 6 
 7     // 外层循环
 8     for (i = 0; i < 5; ++i) {
 9         // 内层循环
10         for (j = 0; j < 5; ++j) {
11             if (i * j > 10) {
12                 found = 1; // 找到特定条件
13                 goto end_loops; // 使用goto退出循环
14             }
15         }
16     }
17 
18 end_loops:
19     if (found) {
20         printf("特定条件满足,退出循环。\n");
21     } else {
22         printf("循环正常结束。\n");
23     }
24 
25     return 0;
26 }

五: 函数

  形参---实参

    先看代码

 1 #include <stdio.h>
 2 
 3 void swap(int num1, int num2)
 4 {
 5     int mid = 0;
 6     mid = num1;
 7     num1 = num2;
 8     num2 = mid;
 9 }
10 
11 // 当实参传递给形参时,形参是实参的一份临时拷贝
12 // 对形参的修改不会影响到实参
13 
14 int main()
15 {
16     // 交换两个整数
17     int num1 = 0;
18     int num2 = 0;
19     scanf("%d %d", &num1, &num2);
20     printf("%d %d\n", num1, num2);
21     swap(num1, num2);
22     printf("%d %d\n", num1, num2);
23     return 0;
24 }

结果:(假设输入:20 45)

  20 45

  20 45--------值传递

  为什么都一样呢,因为,在main函数里面,变量num1和num2创建了属于他们两个单独的地址,当程序运行到swap函数()的时候,程序给这个swap()函数内部的num1和num2变量重新整了一份新的空间来存放数据,所以这个swap()函数内部空间再怎么变化,都与主函数main()函数无关,就像我在代码里面所说的一样,实参传递给形参的时候,形参是实参的一份临时拷贝,形参的改变不会影响到实参

  那怎么改变使其影响到呢?

  这里便运用到了指针变量,利用指针变量传递地址,来改变原本值的变化,直接看代码

 1 #include<stdio.h>
14 void swap(int *pn1, int *pn2)
15 {
16     int mid = *pn1;
17     *pn1 = *pn2;
18     *pn2 = mid;
19 }
20 
21 int main()
22 {
23     int num1 = 0;
24     int num2 = 0;
25     scanf("%d %d", &num1, &num2);
26     printf("%d %d\n", num1, num2);
27     swap(&num1, &num2);
28     printf("%d %d\n", num1, num2);
29     return 0;
30 }

这里的结果就是:(输与上面一样:20 45)

  20 45

  45 20------地址传递

六:素数

  题目:打印100~200之间的素数

  (先讲一下什么是素数:除了1与其本身,不能被其他数整除的整数叫素数,例如:2,3,5,7,11等等)

  直接上代码:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int count = 0;
 5     for (int i = 100; i < 200; i++)
 6     {
 7         int flag = 0;
 8         for (int j = 2; j < i; j++)
 9         {
10             if (i % j == 0)
11             {
12                 flag = 1;
13                 break;
14             }
15              else
16             {
17                 printf("%d ", i);
18                 count++;
19                 break;
20             } 
21            
22     }
23     printf("count=%d\n", count);
24 
25     return 0;
26 }

  我这里就是出现了一个明显的错误,我当时没有想到,后来才明白的,这个是内部循环每次都会除,当一开始的时候,不能被整除的话,可能直接就退出循环了,就比如105,这个就不是素数,因为一开始不能被2整除,但是一眼就可以看出来,105%5=0,这个是我一开始没有想到的,后来借鉴了csdn,知道了整一个标志位,直接看标志位来确认这一整个循环是否全部完成,最终的结果来看是否是素数,直接上代码

 1 // 题目:打印100~200之间的素数(素数,除了1和它本身不能被其他数整除的数字,例如2、3、5、7等等)
 2 #include <stdio.h>
 3 int main()
 4 {
 5     int count = 0;
 6     for (int i = 100; i < 200; i++)
 7     {
 8         int flag = 0;
 9         for (int j = 2; j < i; j++)
10         {
11             if (i % j == 0)
12             {
13                 flag = 1;
14                 break;
15             }
16         }
17         if (flag == 0)
18         {
19             printf("%d ", i);
20             count++;
21         }
22     }
23     printf("count=%d\n", count);
24 
25     return 0;
26 }

  这里我才知道这样,内循环全部完整的运行以便才能算是,计算出是否完全是素数

 

 

 

注:现在已老实,求放过,随心所感笔记,就是随便写写

 

标签:20,函数,num2,int,写写,第六天,printf,天开,num1
From: https://www.cnblogs.com/xiejinghao/p/18528044

相关文章

  • 重温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开始的三:数组可以先不在【】这里面填写多少,但是需......
  • 代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的
    1.leetcode242.有效的字母异位词题目链接:242.有效的字母异位词-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词哔哩哔哩bilibili自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对......
  • java游戏第六天——总结
    开始我们先在这里创建五个java文件,后面创建一个文件夹存储图片,我就按照这几个文件作用展开描述bg.javapackagecommon;importcommon.game_pic;importjava.awt.Color;importjava.awt.Graphics;publicclassbg{ publicvoidpaintself(Graphicsg) { g.drawIm......
  • 代码随想录算法训练营第六天| leetcode242.有效的字母异位词、leetcode349.两个数组的
    1.leetcode242.有效的字母异位词题目链接:242.有效的字母异位词-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili自己的思路:首先就是对字符串进行分开成一个一个单独的字母,然后使用列表存储这些数据,再对......
  • SQL专项练习第六天
            Hive在处理不同数据需求时的灵活性和强大功能,包括间隔连续问题的处理、行列转换、交易数据查询、用户登录统计以及专利数据分析等方面。本文将介绍五个Hive数据处理问题的解决方案,并通过实际案例进行演示。        先在home文件夹下建一个hivedata......
  • 代码随想录算法训练营第六天|242.有效的字母异位词 ● 349. 两个数组的交集 ● 202.
    ​学习链接:https://programmercarl.com/哈希表理论基础.html学习笔记:遇到“要判断一个值是否在集合中出现过”的问题时,可以考虑hash表。hash表的形式包括数组、set、dict。当数的位数比较统一、或比较小,可用数组,快;当数的位数可变,可用set;当要同时考虑数的下标和值,可以用dict。......
  • 代码随想录算法训练营第六天|Day6哈希表基础
    242.有效的字母异位词题目链接/文章讲解/视频讲解:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html思路1.暴力的解法,两层为循环,很明显时间复杂度是O(n^2)。boolisAnagram(char*s,char*t){if(......