编程语言讲解(入门级别C语言)

举报
刘斯淇 发表于 2022/04/15 12:56:58 2022/04/15
【摘要】 c/c++算法,C语言笔记,C语言入门教程,计算机语言教程,C/C++开发

函数的递归!!

函数自己调用自己就叫递归!通俗来说:把一个大型复杂的问题层层转化为一个与原问题相似的的规模小的问题求解:随便提一嘴!!!,递归只是把大事化小而已!与循环有差别。

补充:则在C语言中其个位、十位、百位、千位依次这样计算:n/1%10,n/10%10,n/100%10,n/1000%10

递归存在的两个条件:存在限制条件,但满足这个限制条件的时候,递归便不再继续。

每次递归调用之后越来越来接近这个限制条件。

写代码的时候注意:1.不能死递归,都有跳出空间,每次递归逼近跳出条件!

2.递归层次不能太深!

www.stackoverflow.com 号称程序人的百科全书!!!

www.github.com(这网站可以查看资料)

关于冒泡法的使用!

如果要用冒泡法 对N个数进行排序,要进行几轮排序?

总结:冒泡排序法是把N个数通过N-1伦排序,升序排序中大的数往下沉,小的数往上浮,降序排序中小的数往下沉,大的数往上浮!

练习题:打印杨辉三角!

  1. #define MAX  7  
  2. #include<stdio.h>  
  3. int main (){  
  4.     int i ,j,k;  
  5.     int c[MAX][MAX]={0};  
  6.     c[0][0]=1;  
  7.     for(i=1;i<MAX;++i){  
  8.         for(j=1;j<=i;++j){  
  9.             if(j==0||j==MAX-1){  
  10.                 c[i][j]=1;    
  11.             }  
  12.         else    
  13.          c[i][j]=c[i-1][j-1]+c[i-1][j];  
  14.         }  
  15.     }  
  16. for(i=1;i<MAX;i++){  
  17. for (j=1; j<=i;j++)  
  18.     printf("%-3d",c[i][j]);  
  19.     printf("\n");   
  20. }  
  21. return 0;  
  22.    }  

由于一些特殊因素所以不后续将会补上视频递归!!p50-28.51时间记得回顾!!

初见 素组

数组:是一组相同类型元素的集合

数组分:完全初始化,和不完全初始化

注意两者的差异

总结:数组是通过下标来访问的,小标是从零(0)开始的

2.数组的大小可以通过计算来得到!

二维数组在内存里面也是连续存放的!

一行内部连续,跨行也还是连续的!

两个用途:

数组作为函数参数!!

冒泡排序的思想:两两相邻的元素作为比较,并且可能的话需要交换

  1. #include<stdio.h>  
  2. int main(){  
  3.     int i=0;  
  4.     for(i=0;i<sz-1;i++){  
  5.         int j=0;  
  6.     for(j=0;j<sz-1-i;j++){  
  7.         if(arr[j]>arr[j+1]){  
  8.             int tmp=arr[j];  
  9.             arr[j]=arr[j+1];  
  10.             arr[j+1]=tmp;  
  11.         }  
  12.         }  
  13.     }     
  14. }  
  15. }  

数组名就首元素的地址!

1.但是有两个例外sizeof(数组名)——素组名代表整个数组-计算的是整个数组的大小单位是字节!

2.&数组名-数组名表示整个数组-取出的是整个数组的地址.

1.在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志

2021年12月8日; 再次探索函数!函数的的使用方法可以先定义!:

例如:张三(蛋炒饭,20)

我,张三 带饭(蛋炒饭,20)

数组

char ch[5]=={a,b,c} //不完全初始化,剩下的默认为0!

2021.12.9日 关键字:static修饰函数,使得函数只能在自己所在的源文件里面使用,

本质上,static是将函数的 外部连接属性变成了内部连接属性

初涉指针:4.294.196.296BIT

/8=536.870.912byte/1024=524.288kb/1024=512 mb=/1024=0.5gb

指针的大小是相同 !

指针 是用来地址的;

指针需要多大空间,取决于地址的存属需要多大空间!

存放指针数据的内存的大小在同样位数的系统里是相同的,但在不同的系统当中一般是不同的,比如16位,32位,64位系统当中指针内存大小是不一样的

  循环:break;//在While循环中,break用于永久终止循环!

continue的作用的是跳过本次循环continue后边的代码//然后看看后面代码条件执不执行!

循环的建议=不可以在for循环体内修改循环变量,防止for循环失去控制 2.建议for语句的循环 控制变量的取值采用“前闭后开区间”写法!

break;只能跳出一个循环体

例题:在一个有序数组中查找具体的某个数字n---可以使用二分法!也叫折半法

rand函数返回了一个0~32767之间的数字 ;

rand()

        rand()函数是使用线性同余法做的,它并不是真的随机数,因为其周期特别长,所以在一定范围内可以看成随机的。

srand()为初始化随机数发生器,用于设置rand()产生随机数时的种子。传入的参数seed为unsigned int类型,通常我们会使用time(0)或time(NULL)的返回值作为seed。下面我们来进行实验,从而对它进行更深入的感知。

strlen:

strlen()[计算字符串的长度]是一种函数。'\0’作为终止符;2.strlen()[计算字符串的长度]是一种函数。'\0’作为终止符;其参数必须是字符型指针(char*)。头文件为#include

system:可以理解为一个清除或者终止代码!

C语言的魔法!!

代码吃力正常!

1.总结

2.代码模仿+上思考 ,然后放一边,不是照着抄没有用!,然后脱离别人的代码进行思考开始入手。

3.入手代码题:把代码想成一个简单的问题,想出解决方案,转换成代码(这一步需要语法);

4.模仿的方式:模仿很重要思考,入手C+primer plus 课后习题加上思考,把别人的代码想明白放在一边(不是照抄,而是放在一边,凭着自己的理解自己思考的结果去写代码,写不下去再回去看看作者的代码,这才能用好模仿!!!!!

代码调制: 感受代码的调试,感受他的执行

函数返回类型的地方写出:void,表示这个函数不返回任何值,也不需要返回

                                 C语言中strlen函数功能及用法

用法:#include

功能:计算字符串s的(unsigned int型)长度

return的用法

在有反回值的方法中,返回方法指定类型的值,同时结束方法执行;

也可以用在返回值为void的方法中,用来终止方法运行;

return是使整个函数返回的

小结:

1) 函数名+括号:fn1()==return后面的值

2) 所有函数默认返回值为:未定义

3) return后面任何代码都不执行了

斐波那契数列的概念

    它的规律是:这个数列从第 3 项开始,每一项都等于前两项之和

在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),显然,斐波那契数列是一个线性递推数列

  1. int F(int n) //斐波那契数列函数 递归形式  
  2.   
  3. {  
  4. if(n == 0) //初始化  
  5.   
  6. return 0;  
  7.   
  8. if(n == 1 || n == 2)  
  9.   
  10. return 1;  
  11.   
  12. return F(n-1) + F(n-2); //如果n != 1 && n != 2 进行递归运算  
  13.   
  14. }  
  15.   
  16. int main()  
  17.   
  18. {  
  19. int t,n;  
  20.   
  21. scanf("%d",&t);  
  22.   
  23. while(t--)  
  24.   
  25. {  
  26. scanf("%d",&n);  
  27.   
  28. printf("%d\n", F(n));  
  29.   
  30. }  
  31.   
  32. return 0;  
  33.   

函数

  1、一个源程序由多个函数组成。

  2、C程序的执行从main()函数开始;

  3、所有函数都是平行的;

  4、函数分类;可以分为标准和自定义,还可以分为有参函数和无参函数。

函数定义的一般形式:

2、预定义标识符

预定义标识符在c语言中也有特定的含义,但可以用作用户标识符,预定义标识符分为两类:

(1)、库函数名字,比如(printf,scanf,sin,isdigit等) (2)、编译处理命令名,比如(define,include)

                               C语言的关键字

2.1 定义

关键字就是C语言提供的有特殊含义的符号,也叫做“保留字”

C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static

3 标识符

3.1 定义

标识符就是在程序中自定义的一些符号和名称。要跟关键字区分开来:关键字是C语言默认提供的符号,标识符是程序员自定义的.

3.2 作用

标识符,从字面上理解就是用来标识某些东西的符号,标识的目的就是为了将这些东西区分开来

其实,标识符的作用就跟人类的名字差不多,为了区分每个人,就在每个人出生的时候起了个名字

C语言是由函数构成的,一个C程序中可能会有多个函数,为了区分这些函数,就给每一个函数都起了个名称。函数的名称就是标识符的一种。除了函数,变量的名称也是标识符

3.3 命名规则

只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成

严格区分大小写,比如test和Test是2个不同的标识符

不能以数字开头

不可以使用关键字作为标识符

如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):firstName、myFirstName,或者使用下划线_来连接:first_name、my_first_name

3.4 常见错误

fromNo12 from#12 标识符中不能使用#符号

my_Boolean my-Boolean 标识符中不能使用“-”符号,应使用下划线“_”代替

Obj2 2ndObj 标识符不能使用数字开头

myInt int “int”是内建关键字

jack_rose jack&rose 符号“&”不能出现在标识符中

GUI G.U.I 标识符内部需要出现“.”分隔符

C语言的常量——不能改变的量

注意!如果有使用VS2019的编译器记得加上     #define _CRT_SECURE_NO_WARNINGS .1          

C语言的基础:定义变量变量由一个类型声明符加一个或多个变量名

int a; // a是int类型的变量

double b=1.0; //b是double类型的变量,赋1.0为初值

char c, d; // c, d是char类型的变量

变量有两种类型:

字符串的用法:

标识符:

标识符是C程序的最基本组成部分,例如:变量名称、函数名称、数据类型等等,都是一个标识符。标识符的要求是:必须由字母(区分大小写)、数字、下划线组成。而且,标识符的第一个字符不可以是数字。例如:

abc --- 合法

_abc123 --- 合法

abc555 --- 合法

123abc --- 非法

abc$!! --- 非法

在C语言中,大写字母和小写字母被认为是不同的字符,所以,ABC与abc表述的标识符是不一样的。

标识符

在编程过程中,经常需要定义一些符号来标记一些名称,如变量名、方法名、参数名、数组名等,这些符号被称为标识符。在 C语言中标识符的命名需要遵循一些规范。

规范:

1.标识符只能由字母、数字和下划线组成。

2.标识符不能以数字作为第一个字符。

3.标识符不能使用关键字。

4.标识符区分大小写字母,如 add、Add和 ADD是不同的标识符。

5.尽量做到“见名知意”,以增加程序的可读性,如用age表示年龄等。

6.ANSIC中没有规定标识符的长度,但建议标识符的长度不超过 8 个字符。

7.在上面的规范中,除了6和7外,其他的命名规范都是必须要遵守的,否则程序就会出错。

为了让大家对标识符的命名规范有更深刻地理解,接下来列举一些合法与不合法的标识符,具体如下:

下面是一些合法的标识符: 下面是一些不合法的标识符:

area 3a

DATE ab.c

_name long

lesson_1 abc#zz

                                     函数的递归!!

函数自己调用自己就叫递归!通俗来说:把一个大型复杂的问题层层转化为一个与原问题相似的的规模小的问题求解:随便提一嘴!!!,递归只是把大事化小而已!与循环有差别

 小练习:从键盘上输入10个数,求其平均值:

  1. #include <stdio.h>  
  2. void main(){   
  3.     int  a,i,sum=0;                   
  4.     float ave;;                    
  5.     for(i=0;i<10;i++){  
  6.           scanf("%d",&a);   
  7.           sum+=a;  
  8.     }  
  9.     ave=(float)sum/10;  
  10.     printf("ave = %f\n", ave);   
  11. }  

练习题:对指针数组中N个指针元素进行大小排序

  1. void sort(int* p,int lenth)  
  2. {  
  3.     int temp;  
  4.     //用指针对数组进行从小到大的排序  
  5.     for (int i=0;i<lenth;i++)  
  6.     {  
  7.       for(int j=i;j<lenth;j++)  
  8.       {  
  9.         if (*(p+i)>*(p+j+1))  
  10.         {  
  11.             temp=*(p+j+1);  
  12.             *(p+j+1)=*(p+i);  
  13.             *(p+i)=temp;  
  14.         }  
  15.       }  
  16.     }  
  17.     for (int k=0;k<lenth;k++)  
  18.     {  
  19.         printf("%d ",*(p+k));  
  20.     }  
  21. }  
  22. void main()  
  23. {  
  24.     int arr[10]={4,2,8,11,3,6,9,33,23,15};    
  25.     sort(arr,sizeof(arr)/sizeof(arr[0]));  
  26. }  

题目2. 输入一个圆半径r,当r>0时,计算并输出圆的面积和周长,否则,输出提示信息。

  1. #include <stdio.h>  
  2.    #define PI 3.14   
  3. int main(voi    d)  
  4. double  r ,area , girth;    
  5.  printf("please input r:\n");  
  6.  scanf("%lf",&r);  
  7.      if (r>=0)                          
  8.           { area =PI*r*r;  
  9.            girth =2*PI*r ;  
  10.             printf("the area is %.2f\n", area);   
  11. printf("the girth is %.2f\n", girth);}  
  12. else    
  13. printf("Input error!\n");   
  14. return 0;  
  15.  }  

从键盘输入n个数存放在数组中,将最小值与第一个数交换,输出交换后的n个数。

  1. #include <stdio.h>  
  2. int main(void){  
  3.       int i,n,iIndex,temp;  
  4.       int a[10];  
  5.       printf("Enter n: ");  
  6.       scanf("%d", &n);  
  7.       printf("Enter %d integers:\n ");  
  8.         for(i=0;i<n;i++)  
  9.           scanf("%d", &a[i]);  
  10.       iIndex=0;  
  11.       for(i=1;i<n;i++){  
  12.          if(a[i]<a[iIndex])      iIndex=i;  
  13.        }  
  14.      temp=a[0];a[0]=a[iIndex];a[iIndex]=temp;  
  15.      for(i=0;i<n;i++)  
  16.        printf("%5d", a[i]);  
  17.      printf("\n");  
  18.      return 0;  

方法二:

  1. #include<stdio.h>  
  2.    
  3. int comp(int arry[], int n)  
  4. {  
  5.     int i,index,temp;  
  6.     printf("为数组赋值:\n");  
  7.     for(i=0;i<n;i++)  
  8.     {       scanf("%d",&arry[i]);  
  9.     }  
  10.     for(i=1,index=0;i<=n-1;i++)  
  11.     {   if(arry[i]<arry[index])  
  12.         {   index=i;  
  13.         }  
  14.     }  
  15.     temp=arry[0];arry[0]=arry[index];arry[index]=temp;  
  16.     for(i=0;i<n;i++)  
  17.         {           printf("%d  ",arry[i]);           
  18.         }  
  19.     return 0;  
  20. }  
  21. main()  
  22. {   int n;  
  23.     int a[10];  
  24.     printf("为n赋值:\n");  
  25.     scanf("%d",&n);  
  26.     comp(a,n);}  
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。