• C语言--汇总


       1 一、四个月的课程体系
       2     1、语言基础
       3         1、c语言10day
       4         2、oc语言(真正开发语言)6day
       5         3、foudation(库)
       6     2、iOS 核心编程
       7         1、视图层(如何做QQ的样子,手势、动画)
       8     3、iOS 高级编程
       9         1、系统服务
      10         2、网络编程
      11     4、游戏开发
      12         1、学习C ++(主要用来开发游戏)可以跨平台
      13         2、cocos2d-x
      14         3、swift语言以及iOS8开发
      15  二、什么是ios开发
      16       1.移动便携式开发:android 和 iOS
      17        2.iOS开发(iOS程序员、iOS软件工程师)
      18        3.android 和 iOS区别
      19                 a.     iOS基于unix,安全稳定。android基于linux的虚拟机,安全性低
      20                  b.    iOS强大的sdk、开发工具,不开源,apple公司,App             Store(08年上线),高端用户使用
      21      android开源,google公司,googleplay应用商店,各种用户人群,
      22 三、ios开发环境
      23  1.mac操作系统
      24      1)操作系统os:管理硬件资源和软件资源
      25      2)macos:apple公司,自我封闭
      26      3)iOS:设备:iPhone(2007年1月9日),iPod,touch,iPad,      apple tv
      27 2. 布局:菜单栏、桌面、dock(快捷键)
      28 3.格式化u盘:磁盘工具——ms-dos(fat)
      29 4.软件安装
      30       1、*.dmg(setup.exe虚拟光驱)
      31       2、*.app(绿色软件)直接安装
      32       3、直接从app store
      33  5.pwd、cd、is命令
      34   1、操作计算机的两种方式
      35             a.图形化操作方式(操作直观)
      36             b.命令行的操作方式(操作便捷,节约资源)
      37   2、操作命令(终端快捷操作)
      38      a.ls命令(查看当前文件夹下的文件或者子目录)
      39      b.pwd(查看当前操作目录)
      40      c.cd+空格+子目录名称(切换子目录)
      41      d.cd+空格+..(退回上一级目录)
      42      e.clear清除屏幕信息
      43      f.mkdir+空格+文件夹(创建一个目录)
      44      g.rm+空格-f空格  删除
      45 3.相对路径和绝对路径(路径两种表达方式)
      46   1./代表硬盘根目录(/uses/tarena/doc)
      47   2.相对路径:相当于当前操作状态下的文件(或目录)的位置
      48   3.绝对路径:根据硬盘根目录开始,文件(或目录)的位置
      49 4.文件夹的创建与查看
      50 
      51 12.31
      52 c语言(1973年贝尔实验室)
      53     1.四大部分:中央处理器(控制器、运算器)、存储器、输入设          备、输出设备    (1946年,冯诺依曼)
      54     2.计算机语言分类
      55    机器语言、汇编语言、高级语言
      56     3.编程:自己有个想法,通过计算机语言使计算机理解,并帮我  们实现。
      57 一、c语言执行步骤:
      58    一.编辑程序
      59          1.编写c语言的代码,保存在扩展名.c的文件中,源文件。
      60          2.编写代码有三种方式:
      61                   a.vi命令方式系统自带
      62                   b.ultraedit网络下载
      63                   c.xcode网络下载
      64   二.编译(gcc  文件名.c)
      65       将c语言转换成计算机识别的代码
      66   三.运行(./a.out)
      67        经过编辑、连接之后,源程序文件就可以生成可执行文件
      68 * vi的使用-补充(c语言快捷键):shift+“:”进入编辑功能
      69    wq退出
      70    “i”insert进入编辑模式
      71 四.xcode简单的使用
      72 1.创建项目
      73 2.创建一个osx—command line Tool
      74 3.main.c进行编程
      75 4. 菜单栏product编译-run执行
      76 5.改字体(苹果-第二个prefer..偏好设置-第五个改字体)
      77 五.#include指令
      78    1.在编译之前做的事情
      79    2.相当于复制操作
      80    3.加载系统提供的标准函数库
      81 *“”是加载系统自定义功能
      82  《》是加载系统功能
      83 六.变量
      84     1.数据类型:字符型char、整数型int、浮点型float/double、指  针、结构、联合等类型。
      85     2.语法格式:变量类型  变量名=初始化值
      86     3.保存运算中临时的值,number1=10赋值,可以多次赋值,但只会保留最后一次的值(右—左)
      87     4.变量命名:a.必须以字母或下划线开头
      88                        b.包含字母、下划线或数字(不要出现空格)
      89                        c.不能与关键字冲突
      90                        d.大小写敏感的
      91                        e.长度一般不会限制,但会被编辑器截断
      92 
      93 *变量放在等号左边就是存值操作,变量放在等式右边就是取值操作 i=10(存),j=i(取).把右面的赋值给左边的,从右向左
      94 
      95 1.4
      96 数据类型和变量赋值
      97 1.整数类型
      98charint)小数类型(floatdouble  99          a.有符号类型(整数、负数、0)范围   ( -128~127 100                *所占存储空间的第一位为符号位。
     101                *二进制符号位,最左边0+,1代表负数
     102          b.无符号整型(整数、0)(0~255256
     103          c.有符号的整型(int,4个字节 )(-2^31~2^31-1 104      *Byte、KB、MB、GB、TB、PB(1024 105      如:1KB=1024B
     106     超出最大值从最小值开始运算
     107     超出最小值从最大值开始运算
     108   d.有符号的短整型(short int,2字节)
     109   e.有符号的长整型(long int,8字节)
     110   f.有符号的长长整型(long long int 111   g.无符号的整型(unsigned int,4字节)
     112   h.无符号短整型(unsigned  short int,2字节)
     113   i.无符号长整型(unsigned  long int,8字节)
     114   j.无符号长长整型(unsigned  long long  int,8字节)
     115 2.进制
     116    a.十进制%d(0-9)逢十进一
     117    b.八进制%o(0-7)逢八进一
     118    c.十六进制%x(0-9ABCDEF)逢十六进一
     119    d.二进制(01)逢二进一
     120            int i=11 //十进制
     121            int i=011 //八进制
     122            int i=0x11 //十六进制
     123 *c语言不能使用二进制
     124      1.十进制转换二进制(除二取余,将余数从下向上读出)
     125 举例:
     126 32/2=17……0
     127 17/2=8……1
     128 8/2=4……0
     129 4/2=2……0
     130 2/2=1……0
     131 1/2=0……1
     132 将余数从下向上读出:100010
     133 
     134      2.二进制数转化成十进制数(按权相加)
     135   0       1     0    1    1    1  0   1位(从右向左)93
     136 128   64   32  16   8    4  2   1权
     137 举例:
     138 1001110
     139 0*2^0=0
     140 1*2^1=2
     141 1*2^2=4
     142 1*2^3=8
     143 0*2^4=0
     144 0*2^5=0
     145 1*2^6=64
     146 得出的值相加=0+2+4+8+0+0+64=78
     147      3.十进制数转换成八进制数、十六进制数
     148    方法:辗转相除,从下向上取余
     149 34/8=16……6
     150 16/8=2……0
     151 2/8=0……2
     152 从下向上对应的八进制数:206
     153      4.八进制数、十六进制数转换成十进制数
     154    方法:按权相加法
     155 6*8^0=6
     156 0*8^1=0
     157 2*8^2=128
     158 按权相加:=134
     159      5.二进制数转换成八进制数
     160    方法:从最后一位开始,每三位二进制数,相当于一个八进制数。前面不足3为补0
     161 举例:100  010=42
     162 6.二进制转换成十六进制数
     163    方法:每四位,不足补0
     164 举例:0010  0010->22
     165 3.字符(%c)
     166  1.通过数值直接赋值  2.通过字符直接赋值
     167 *.2f保留两位有效数字
     168 4.变量:临时保存数据,数据的容器
     169    常量:不可改变的值(具体的数值)
     170    字面值:不可改变的值,就是数值(字符、数值)
     171   *变量=字面值(常量)数据
     172 
     173 练习题:
     174 C语言中整数-8在内存中存储形式是:     原码->反码->补码(只有负数存的是补码)(2个字节=16位)
     175 A)1111111111111000             B)1000000000001000
     176 C)0000000000001000             D)1111111111110111
     177 
     178 一、知识点
     179    一.scanf(“%d”,&i);&取地址
     180 
     181 例题:
     182 1.输入两个数,并输出两个数
     183 #include <stdio.h>
     184 
     185 int main(int argc, const char * argv[])
     186 {
     187     int i=0,j=0;
     188   
     189     printf("pelease input a number:");
     190     scanf("%d",&i);
     191     printf("pelease input nest number:");
     192     scanf("%d",&j);
     193     printf("i=%d
    j=%d",i,j);
     194     return 0;
     195 
     196 }
     197 
     198 2.输入两个数,求其面积、周长、和
     199 int main(int argc, const char * argv[])
     200 {
     201     int i=0,j=0,sum=0,mj=0,zc=0;
     202     printf("pelease input a number:");
     203     scanf("%d",&i);
     204     printf("pelease input nest number:");
     205     scanf("%d",&j);
     206     mj=i*j;
     207     zc=(i+j)*2;
     208     sum=i+j;
     209     printf("面积=%d
    周长=%d
    和=%d
    ",mj,zc,sum);
     210     return 0;
     211 }
     212 
     213 3.输入两个数求和、差、积、商
     214 int i = 0 , j = 0;
     215     //输入函数 要依赖于变量 要临时保存在键盘上输入的数据
     216     //程序会发生阻塞状态
     217     //友好性差 配合输出语句结合使用
     218     printf("please input first Number:
    ");
     219     scanf("%d",&i);//&得到变量在内存中的地址,将键盘上输入的数据保存在变量中
     220     printf("please input second Number:
    ");
     221     scanf("%d",&j);
     222     //输出函数
     223     printf("i:%d
    ",i);
     224     printf("j:%d
    ",j);
     225     
     226     int sum = 0;//求和
     227     int sub = 0;//求差
     228     int mul = 0;//求积
     229     int div = 0;//求商
     230     sum = i+j;
     231     sub = i-j;
     232     mul = i*j;
     233     div = i/j;//整数相除取整数部分
     234     printf("sum:%d
    ",sum);
     235     printf("sub:%d
    ",sub);
     236     printf("mul:%d
    ",mul);
     237     printf("div:%d
    ",div);
     238     return 0;
     239 结果:
     240 please input first Number:
     241 45
     242 please input second Number:
     243 2
     244 i:45
     245 j:2
     246 sum:47
     247 sub:43
     248 mul:90
     249 div:22
     250 
     251 
     252 4.数据类型省略写法
     253 int main(int argc, const char * argv[])
     254 {
     255     signed int i=0;//有符号整型 可以省略signed
     256     unsigned int i2=0;//无符号整型
     257     short i3=0;//有符号短整型 可以省略 int 关键字
     258     unsigned short i4=0;//
     259     long i5=0;//有符号长整型 可以省略int
     260     unsigned long i6=0;
     261     long long i7=0;//长长整型 可以省略signed 和int 关键字
     262     unsigned long long i8=0;//
     263     
     264     return 0;
     265 }
     266 知识点 
     267 二、进制转换
     268 
     269 5.输入一个数,分别以十进制、八进制、十六进制输出变量
     270 int main(int argc, const char * argv[])
     271 {
     272     int i,j,k;
     273     printf("输入:");
     274     scanf("%d%d%d",&i,&j,&k);
     275     printf("i=%d j=%o k=%x
    ",i,j,k);//分别以十进制%d、八进制%o、十六进制%x输出变量
     276     return 0;
     277 }
     278 6.十进制、八进制、十六进制之间的转换
     279 int i=11,j=011,k=0x11;
     280     printf("i=%d j=%o k=%x
    ",i,i,i);//分别以十进制、八进制、十六进制输出变量
     281     printf("i=%d j=%o k=%x
    ",j,j,j);
     282     printf("i=%d j=%o k=%x
    ",k,k,k);
     283     return 0;
     284  结果:i=11 j=13 k=b
     285       i=9 j=11 k=9
     286       i=17 j=21 k=11
     287 
     288 7.制表符(	)  空3个字符,一个汉字
     289 printf("1234567890123456
    ");
     290     printf("helloword!
    ");
     291     printf("hello	word!
    ");
     292     
     293     return 0;
     294 结果
     295 1234567890123456
     296 helloword!
     297 hello   word!
     298 
     299 8.整型数据溢出
     300 //数据溢出
     301     int i = 2147483647;//999 + 1
     302     int j = i + 1;//超出最大值从最小值开始运算
     303     int k = -2147483648;
     304     int l = k - 1;//超出最小值从最大值开始运算
     305     printf("j:%d
    ",j);
     306     printf("l:%d
    ",l);
     307     return 0;
     308 结果:
     309 j:-2147483648
     310 l:2147483647
     311 
     312 9.浮点型(float:%f  double: %lf)
     313     float f = 3.1415926;//100
     314     double d = 3.1415926;//200
     315     float f2 = d;//100 = 200
     316     //%.2f保留两位有效数字
     317     printf("float:%.2f
    ",f);
     318     printf("double:%lf
    ",d);
     319     return 0;
     320 结果:
     321 float:3.14
     322 double:3.141593
     323 
     324 知识点
     325 三、sizeof:计算存储空间的大小,单位:字节
     326 sizeof()对应的数据类型是 long unsigned int ->%ld
     327 
     328 10.sizeof所占空间大小
     329 int i = 10;
     330     long l = 20l;
     331     long long ll = 30ll;
     332     char c = 10;
     333     
     334     float f = 10.1f;
     335     double d = 10.1;
     336     long double ld = 10.1l;
     337     //求出某种类型或变量或字面值(常量)或表达式所占内存空间大小
     338     //一定注意 变量的空间一定要大于字面值的空间,否则“可能”出现数据问题。
     339     unsigned long int length = sizeof(d=20.1); //sizeof()不负责计算表达式的值
     340     printf("d:%lf
    ",d);
     341     printf("length:%lu
    ",length);
     342 结果:
     343 d:10.100000
     344 length:8
     345 知识点
     346 四、运算符
     347 
     348 11.优先级与结合性
     349       int i = 3+4*5;
     350     printf("i:%d
    ",i);
     351     int i2 = 3/2;//整数相除 结果还是整数
     352     double d = 3.0/2;//如果相除时,有小数,则结果为小数
     353     printf("i2:%d
    ",i2);
     354     printf("d:%lf
    ",d);
     355     
     356     //取余运算符%
     357     int i3 = -5%2;
     358     printf("i3:%d
    ",i3);
     359     
     360     //向0取整
     361     int i4 = -5/2;
     362     printf("i4:%d
    ",i4);
     363     
     364     //符号问题
     365     int i5 = -5/-2;//与数学中的符号相同
     366     printf("i5:%d
    ",i5);
     367     int i6 = 5%-2;//与前面的数字的符号相同
     368     printf("i6:%d
    ",i6);
     369 结果:
     370 i:23
     371 i2:1
     372 d:1.500000
     373 i3:-1
     374 i4:-2
     375 i5:2
     376 i6:1
     377 
     378 12.例题:输入一个秒数 求时分秒
     379     int inputSecond = 0;
     380     printf("请输入一个秒数:
    ");
     381     scanf("%d",&inputSecond);
     382     
     383     int hour=0,minute=0,second=0;
     384   
     385    //hour = inputSecond/3600;
     386    //minute = (inputSecond-hour*3600)/60;
     387    //second = inputSecond -hour*3600 - minute*60;
     388   
     389     hour = inputSecond/3600;
     390     minute = inputSecond%3600/60;
     391     second = inputSecond%60;
     392     
     393     printf("input的秒数=%d时%d分%d秒
    ",hour,minute,second);
     394 
     395 结果:
     396 请输入一个秒数:
     397 3666
     398 input的秒数=1时1分6秒
     399 
     400 13.自增自减运算符
     401     int i = 10;
     402     //i++;//自增1 i = i + 1;
     403     i--;//自减1 i = i - 1;
     404     printf("i:%d
    ",i);
     405     
     406     int j = 10;
     407     //int k = ++j;//前缀表达式 先自增 再运算(赋值)
     408     int k = j++;//后缀表达式 先运算 后自增
     409     printf("k:%d
    ",k);
     410     
     411     i = 10;
     412     k=++i+(++i)+i++;
     413     printf("k:%d
    ",k);
     414     return 0;
     415 结果:
     416 i:9
     417 k:10
     418 k:35
     419 14.关系运算符
     420     int i = 10;
     421     int j = 20;
     422     //>、<、>=、<=、==、!= 关系
     423     printf("i>j:%d
    ",i>j);//0 不成立
     424     printf("i<j:%d
    ",i<j);//1 成立
     425     printf("i==j:%d
    ",i==j);//0
     426     printf("10>20:%d
    ",10>20);
     427     printf("10.1>20.1:%d
    ",10.1>20.1);
     428     printf("10.1>20:%d
    ",10.1>20);
     429     printf("'A'>'B':%d
    ",'A'>'B');//ASC码
     430     printf("'A'<'B':%d
    ",'A'<'B');
     431 结果:
     432 i>j:0
     433 i<j:1
     434 i==j:0
     435 10>20:0
     436 10.1>20.1:0
     437 10.1>20:0
     438 'A'>'B':0
     439 'A'<'B':1
     440 15.练习题:
     441 用户从控制台输入一个年龄,由程序判断该年龄是否大于18岁,结果输出1为真,0为否
     442    int age = 0;
     443     printf("请输入一个年龄:
    ");
     444     scanf("%d",&age);
     445     printf("age>18:%d
    ",age>18);
     446 结果:
     447 请输入一个年龄:
     448 45
     449 age>18:1
     450 16. 布尔类型(bool 451 C99 版本新添加的数据类型 逻辑值类型bool类型
     452     #include <stdbool.h> 头文件
     453     bool flag = false;//true 1 false 0
     454     printf("flag:%d
    ",flag);
     455 结果:0
     456 知识点
     457 五、if语句条件分支语句    if…else    ifelse if
     458 
     459 //条件 关系表达式
     460 //逻辑值 真 (1 true 或 非0) 假(0 false)
     461 1.if 语句书写有三种形式
     462     //普通语句(大括号可以省略)只会执行一条语句
     463     if(true) printf("congratulation!");
     464 区别
     465   1. //普通语句(大括号可以省略)没有括号,只会执行一条语句
     466     if(true)
     467         printf("congratulation!");
     468     
     469         printf("congratulation!");
     470 
     471 
     472   2.//复合语句  要么多执行 要么都不执行 把多条语句变成一个整体
     473     if(true){
     474         printf("congratulation!");
     475     
     476         printf("congratulation!");
     477     }
     478 
     479   3.//空语句
     480     if(age>18);
     481 
     482 2.if…else
     483 int age = 18;
     484     
     485     if (age>=18) {
     486         printf("你已经成年了!
    ");
     487     }else{
     488         printf("你还未成年!
    ");
     489     }
     490 结果:你已经成年了!
     491 
     492 3. ifelse ifelse
     493  if(表达式1)语句1;
     494 else if(表达式2) 语句2;
     495 else if(表达式3) 语句3;
     496         ……
     497 else 语句5;
     498 执行方式从头开始判断真假
     499 
     500 17.练习 输入小写字母 得到相应的大写字母
     501 char ch;
     502     printf("shuru");
     503     scanf("%c",&ch);
     504     if(ch>=97){
     505         ch=ch-32;得到大写字母
     506         printf("=%c",ch);
     507     
     508     }else{
     509         ch=ch+32;得到小写字母
     510         printf("=%c",ch);
     511     }
     512     return 0;
     513 18.输入一个分数,判断这个分数是否及格?
     514    int score = 0;
     515     printf("请输入一个分数:
    ");
     516     scanf("%d",&score);
     517   
     518      if (score>=90) {
     519      printf("您的分数是优秀
    ");
     520      }
     521      else if(score>=60){
     522      printf("您的分数是及格
    ");
     523      }
     524      else{
     525      printf("您的分数是不及格
    ");
     526      }
     527 结果:
     528 请输入一个分数:
     529 95
     530 您的分数是优秀
     531 19.输入一个分数,得到相应的级别
     532     int score=0;
     533     printf("input:");
     534     scanf("%d",&score);
     535     if(score>100) printf("GO OUT !!!");
     536     else if(score>=90) printf("A");
     537     else if(score>=80) printf("B");
     538     else if(score>=60) printf("C");
     539     else printf("D");
     540     return 0;
     541 20.else if和if 比较
     542 else if 相当于过一个十字路口:一次判断,多种选择
     543 但是if 相当于过多个十字路口:多次判断
     544 1.一次判断 多种选择 只会选择其一执行(满足条件)
     545     int score = 0;
     546     printf("请输入一个分数:
    ");
     547     scanf("%d",&score);   
     548     if (score>=60) {
     549      printf("60
    ");
     550      }else if (score>=70){
     551      printf("70
    ");
     552      }else{
     553      printf("else
    ");
     554      }
     555 结果:
     556 请输入一个分数:
     557 90
     558 60
     559 2.多次判断 多次执行(满足条件)
     560    int score = 0;
     561     printf("请输入一个分数:
    ");
     562     scanf("%d",&score);
     563      if (score>=60) {
     564      printf("if 60
    ");
     565      }
     566      if (score>=70) {
     567      printf("if 70
    ");
     568      }
     569 结果:
     570 请输入一个分数:
     571 80
     572 if 60
     573 if 70
     574 3.if在大括号里如果满足条件依次执行
     575     int score = 0;
     576     printf("请输入一个分数:
    ");
     577     scanf("%d",&score);
     578      if (score>=60) {
     579       printf("if 60
    ");
     580          printf("if 70
    ");}
     581 
     582 结果:
     583 请输入一个分数:
     584 80
     585 if 60
     586 if 70
     587 21.逻辑运算符(&&、|| 588     int i=0,j=10;//逻辑与短路(短路与)
     589     if((1!=1)&&(i=10))//若第一个表达式的值为假,后面的表达式不再计算
     590     printf("i=%d",i);
     591     //短路或  若第一个表达式值为真,后面的表达式不再计算
     592     if((1==1)||(j=20))
     593     {
     594         printf("j=%d",j);
     595     }
     596     return 0;
     597 结果:
     598 i:0
     599 j:1
     600 22.取地址&与寻址运算符*
     601     int i = 30;
     602     
     603     int* p = &i;//得到变量在内存中位置
     604     printf("p:%p
    ",p);
     605     
     606     //通过寻址运算符 根据地址直接操作内存
     607     //
     608     printf("内存中的数据:%d
    ",*p);
     609     //
     610     *p = 40;
     611     printf("i:%d
    ",i);
     612     
     613     
     614 结果:
     615 p:0x7fff5fbff70c
     616 内存中的数据:30
     617 i:40
     618 
     619 作业
     620 
     621 1.输入一个年份,求该年一共有多少天。
     622     int year;
     623     printf("请输入年份:
    ");
     624     scanf("%d",&year);
     625     if(year%400==0||((year%4==0)&&(year%100!=0)))
     626         {printf("366天
    ");}
     627     else{printf("365天
    ");}
     628 结果:
     629 请输入年份:
     630 2005
     631 365天
     632 老师的程序: int days=365+(year%400==0||((year%4==0)&&(year%100!=0)))
     633 
     634 2.输入一个年份,输入一个月份,求该月有多少天?
     635    //1.输入年份
     636     int year = 0;
     637     printf("请输入年份:
    ");
     638     scanf("%d",&year);
     639     //2.输入月份
     640     int month = 0;
     641     printf("请输入月份:
    ");
     642     scanf("%d",&month);
     643     //3.判断不同的月份 天数是不一样的
     644     //1 3 5 7 8 10 12 31天
     645     //4 6 9 11 30天
     646     //2 闰年 29天 平年28天
     647     int days = 0;//用来保存所求天数
     648     if (month==4||month==6||month==9||month==11) {
     649         days = 30;
     650     }else if (month==2){
     651         days = 28 + ((year%400==0)||(year%4==0 && year%100!=0));
     652     }else{
     653         days = 31;
     654     }
     655     //4.输出天数
     656     printf("year:%d month:%d days:%d
    ",year,month,days);
     657 结果:
     658 请输入年份:
     659 2005
     660 请输入月份:
     661 12
     662 year:2005 month:12 days:31
     663 3.准备回家过年了,交通工具,通过输入工资,
     664 小于1300(最低工资),程序要报错,工资大于10000
     665 坐飞机回家,如果大于5000,就坐火车回家,如果大于
     666 3000,就坐汽车回家。大于1500,就骑自行车回家,都
     667 不满足,步行。
     668     int i=0;
     669     printf("请输入工资:");
     670     scanf("%d",&i);
     671     if(i>=10000)
     672         printf("飞机
    ");
     673     else if(i>=5000)
     674         printf("火车
    ");
     675     else if(i>=3000)
     676         printf("汽车
    ");
     677     else if(i>=1500)
     678         printf("自行车
    ");
     679     else if(i<1300)
     680         printf("程序报错
    ");
     681     else
     682         printf("步行
    ");
     683 
     684 4.通过键盘输入4个值,求4个值中的最大值,最小值,和。
     685     //1.输入4个值
     686     int num1=0,num2=0,num3=0,num4=0;
     687     int sum = 0;
     688     printf("请输入第一个数:
    ");
     689     scanf("%d",&num1);
     690     sum+=num1;
     691     printf("请输入第二个数:
    ");
     692     scanf("%d",&num2);
     693     sum+=num2;
     694     printf("请输入第三个数:
    ");
     695     scanf("%d",&num3);
     696     sum = sum + num3;
     697     printf("请输入第四个数:
    ");
     698     scanf("%d",&num4);
     699     sum = sum + num4;
     700     //2.求最大值 算法(逻辑)
     701     int max = num1;//标尺
     702     if (num2>max) {max = num2;}
     703     if (num3>max) {max = num3;}
     704     if (num4>max) {max = num4;}
     705     printf("max:%d
    ",max);
     706     //求最小值
     707     int min = num1;//标尺
     708     if (num2<min) {min = num2;}
     709     if (num3<min) {min = num3;}
     710     if (num4<min) {min = num4;}
     711     printf("min:%d
    ",min);
     712 
     713     //3.求最小值
     714     //4.求和
     715     //sum = sum + num3; 累加
     716     //sum += num3;累加 但效率更高 (编译原理)
     717     //sum = num1+num2+num3+num4;
     718     printf("sum:%d
    ",sum);
     719 结果:
     720 请输入第一个数:
     721 8
     722 请输入第二个数:
     723 6
     724 请输入第三个数:
     725 5
     726 请输入第四个数:
     727 9
     728 max:9
     729 min:5
     730 sum:28
     731 
     732 知识点
     733 六、运算符
     734 
     735 23.赋值运算符
     736 int i = 20;
     737     int j = 10;
     738     int k = 15;
     739     int l = 0;
     740     l = (i = (j = (k = 5)));//从右向左运算的 右结合
     741     printf("i:%d j:%d k:%d l:%d
    ",i,j,k,l);
     742 结果:i:5 j:5 k:5 l:5
     743 
     744 1.按位异或操作
     745     printf("5&3:%d
    ",5&3);   //0000 0101
     746     int i = 5;            //0000 0011
     747     printf("~5:%d
    ",~i);
     748     int j = 3;
     749     printf("5^3:%d
    ",i^j);//按位异或操作
     750 结果:
     751 5&3:1
     752 ~5:-6
     753 5^3:6
     754 
     755 2.调换两个值(^ 756     int l = 5;
     757     int r = 4;
     758     printf("调换前: l:%d r:%d
    ",l,r);
     759     l^=r;//l=l^r;
     760     r^=l;//r=r^l;
     761     l^=r;//l=l^r;
     762     /*
     763     int temp = 0;//中间临时变量 桌
     764     temp = l;
     765     l = r;
     766     r = temp;
     767      */
     768     printf("调换后: l:%d r:%d
    ",l,r);
     769 
     770 结果:
     771 调换前: l:5 r:4
     772 调换后: l:4 r:5
     773 
     774 3.按位左移 按位右移 标识一些有规律的数据
     775     int i2 = 1;
     776     //数据(二进制数)<<(左移)移动位数
     777     //0000 0001 <<1 0000 0010
     778     printf("i2<<1:%d
    ",i2<<1);
     779     //0000 0001 <<2 0000 0100
     780     printf("i2<<2:%d
    ",i2<<2);
     781 结果:
     782 i2<<1:2
     783 i2<<2:4
     784 
     785 4.多目运算符
     786     int i = 10;
     787     int j = 20;
     788     char c ;
     789     c = i<j?'a':'b';
     790     printf("c:%c
    ",c);
     791 结果:c:a
     792 
     793 24.重构利用多目运算符,输入字符 如果大写 转换小写 如果小写 转换大写
     794     char ch;
     795     char ch2;
     796     printf("请输入一个字符:
    ");
     797     scanf("%c",&ch);
     798     //2.判断 大->小 小->大
     799     //ch2 = (ch>='A' && ch<='Z')?ch+('a'-'A'):ch-('a'-'A');
     800     //多目运算符的嵌套
     801     /*
     802      条件表达式?表达式1:表达式2;
     803      条件表达式?(条件表达式?表达式1:表达式2):表达式2;
     804      */
     805     ch2 = (ch>='A' && ch<='Z')?ch+('a'-'A'):(ch>='a'&&ch<='z')?ch- ('a'-'A'):'?';
     806     printf("ch:%c->ch2:%c
    ",ch,ch2);
     807 结果:
     808 请输入一个字符:ch:a->ch2:A
     809 
     810 知识点
     811 七、swich语句
     812 25.输入一个小写的数字 输出相应的大写数字 1-> 813     //1.输入一个小写数字
     814     int number = 0;
     815     printf("请输入一个小写的数字:
    ");
     816     scanf("%d",&number);
     817     //2.根据不同的值进行不同的处理(条件分支)
     818     
     819     switch (number) {
     820         case 1:
     821             printf("");
     822             break;//终止switch语句继续执行
     823         //case 'a':printf("A
    ");
     824         case 2:
     825             printf("");
     826             break;
     827         case 3:
     828             printf("");
     829             break;
     830         default:printf("您输入的数据有误!
    ");
     831             break;
     832     }
     833 结果:
     834 请输入一个小写的数字:
     835 2
     836  837 
     838 26.重构成绩等级制输入分数求级别
     839     int score = 0;
     840     printf("请输入一个分数:
    ");
     841     scanf("%d",&score);
     842     //2.求相应的级别
     843     //100/10 10 95/10 9 90/10 9
     844     switch (score/10) {
     845         case 10:
     846         case 9:printf("A
    ");break;
     847         case 8:
     848         case 7:printf("B
    ");break;
     849         case 6:printf("C
    ");break;
     850         default:printf("D
    ");
     851             break;
     852 结果:
     853 请输入一个分数:
     854 90
     855 A
     856 27.重构等级制度输入一个分数级别
     857     //二、输入一个分数级别
     858     //求分数的范围 A "您的分数范围是90~100"
     859     //1.输入一个级别
     860     char level;
     861     printf("请输入一个分数的级别:
    ");
     862     scanf("%c",&level);
     863     //2.根据级别求分数范围
     864     /* if分支语句
     865     if (level=='A'||level=='a') {
     866         printf("分数的范围是90~100
    ");
     867     }else if (level=='B'||level=='b'){
     868         printf("分数的范围是70~90
    ");
     869     }else if (level=='C'||level=='c'){
     870         printf("分数的范围是60~70
    ");
     871     }else{//E
     872         printf("分数的范围是0~60
    ");
     873     }*/
     874     
     875     //switch语句
     876     switch (level) {
     877         default:
     878             printf("0~60
    ");
     879             break;
     880         case 'B':
     881         case 'b':printf("70~90
    ");break;
     882         case 'C':
     883         case 'c':printf("60~70
    ");break;
     884         case 'A':
     885         case 'a':printf("90~100
    ");break;
     886 结果:
     887 请输入一个分数的级别:
     888 a
     889 90~100
     890 28.switch练习
     891 //1.输入数字
     892     int number = 0;
     893     printf("==================
    ");
     894     printf("1.显示全部记录
    ");
     895     printf("2.查询登录记录
    ");
     896     printf("3.退出
    ");
     897     printf("==================
    ");
     898     printf("请输入你需要的功能:
    ");
     899     scanf("%d",&number);
     900     //2.根据不同数字 进行不同处理
     901     switch (number) {
     902         case 1:
     903             printf("执行显示全部记录
    ");
     904             break;
     905         case 2:
     906             printf("执行查询登录记录
    ");
     907             break;
     908         case 3:
     909             printf("退出系统
    ");break;
     910         default:
     911             printf("您输入的数据有请误!
    ");
     912             break;
     913     }
     914 结果:
     915 ==================
     916 1.显示全部记录
     917 2.查询登录记录
     918 3.退出
     919 ==================
     920 请输入你需要的功能:
     921 2
     922 执行查询登录记录
     923 
     924 知识点
     925 八、for   循环
     926 
     927 1.for循环
     928     //0 1 2 3 4 5 6 7 8 9
     929     //循环语句 重复的执行一段代码
     930     for (int i = 0; i<10; i++) {
     931         //循环体
     932         printf("跑了第%d圈
    ",i);
     933     }
     934     
     935     //可以省略表达式1 可以放到其它位置 可能会出现问题
     936     //可以省略表达式2 默认值是1 不可以放到其它位置
     937     //可以省略表达式3 可以放到其它位置 但必须放在循环体的最后一条件语句
     938     //三个表达式都可以省略
     939     /*
     940     for (int i=0;i<10;i++) {
     941         printf("Hello
    ");
     942     }
     943     */
     944 结果:
     945 跑了第0圈
     946 跑了第1圈
     947 跑了第2圈
     948 跑了第3圈
     949 跑了第4圈
     950 跑了第5圈
     951 跑了第6圈
     952 跑了第7圈
     953 跑了第8圈
     954 跑了第9圈
     955 
     956 
     957 
     958 29.循环作业
     959 
     960 1.重构字母转换(if语句)(逻辑运算符)
     961 大写—>小写,小写—>大写,不是字母—>您输入的数据有误
     962 
     963 2.求1-100的和1+2+3+5.....=5050
     964     //求(输出)1到100的和。
     965     //1.拿1~100数
     966     //表达式1 循环标识
     967     //表达式2 循环条件
     968     //表达式3
     969    
     970     int sum = 0;
     971     for (int i = 1; i<=100; i++) {
     972         //printf("i:%d
    ",i);//循环体
     973         sum=sum+i;//累加求和
     974     }
     975     //2.求和
     976     printf("sum:%d
    ",sum);
     977 结果:sum:5050
     978 
     979 3.输出1到100直间的奇数(不能被2整除的是奇数)
     980 4.输出1到100之间的偶数(能被2整除的是偶数)
     981     for (int i = 1; i<=100; i++) {
     982         //2.根据条件取得的数
     983         if(i%2==0){
     984             printf(“偶数:%d
    ”,i);
     985         }
     986     }
     987    
     988     /*也可以用这样的办法求
     989     for (int i = 1; i<=100; i=i+2) {
     990         printf("i:%d
    ",i);
     991     }
     992     */
     993 
     994 5.重构求10个数的最大值、最小值、和
     995     int num = 0;
     996     int sum = 0;
     997     
     998     printf("请输入第1个数:
    ");
     999     scanf("%d",&num);
    1000     int max = num;//标尺
    1001     int min=num;
    1002     sum = sum + num;//求和
    1003     for (int i = 1; i<4 ; i++) {
    1004         printf("请输入第%d个数:
    ",i+1);
    1005         scanf("%d",&num);
    1006         sum = sum + num;//求和 求累"积"?
    1007         //求最大值 求最小值?
    1008         if (num>max) {
    1009             max = num;
    1010         }
    1011         if (num<min) {
    1012             min = num;
    1013         }
    1014     }
    1015     printf("sum:%d
    ",sum);
    1016     printf("max:%d
    ",max);
    1017     printf("max:%d
    ",min);
    1018 结果:
    1019 请输入第1个数:
    1020 50
    1021 请输入第2个数:
    1022 60
    1023 请输入第3个数:
    1024 40
    1025 请输入第4个数:
    1026 10
    1027 sum:160
    1028 max:60
    1029 max:10
    1030 6.在键盘上输入一个数(任意正整数),求该数的长度
    1031 1233  45674
    1032     int i=0,c;
    1033     printf("请输入:
    ");
    1034     scanf("%d",&c);
    1035     while(c)
    1036     { c=c/10;
    1037         i++;}
    1038         printf("长度为:%d
    ",i);
    1039 结果:
    1040 请输入:
    1041 123456
    1042 长度为:6
    1043 
    1044 7.打印水仙花数,水仙花数是一个3位数100—999,每个位的数值的立方刚好是这个数的本身。
    1045 153=1*1*1+5*5*5+3*3*3,求水仙花数有哪些
    1046     int i;
    1047     int a,b,c;
    1048     
    1049     for(i=100;i<1000;i++){
    1050     a=i/100;
    1051     b=i%100/10;
    1052     c=i%10;
    1053     {if(i==a*a*a+b*b*b+c*c*c)
    1054     
    1055         printf("%d
    ",i);}}
    1056 结果:
    1057 153
    1058 370
    1059 371
    1060 407
    1061 知识点
    1062 九、while循环
    1063 /* 标准的while循环
    1064     //int i = 0;//表达式1 循环标识
    1065     //在while循环中 表达式2是不可以省略的
    1066     while (i<10) {//表达式2 循环条件
    1067         printf("Hello
    ");
    1068         //i++;//表达式3 循环规律
    1069     }
    1070      */
    1071     //通过while循环的使用 只关注条件
    1072     /*
    1073     while (1<10) { //表达式2 循环条件
    1074         printf("hello
    ");
    1075     }*/
    1076     
    1077     //while循环的使用
    1078     int num = 1;//保存用户输入的数据
    1079     int count1 = 0;//统计正数有多少个
    1080     int count2 = 0;//统计负数有多少个
    1081     while (num!=0) {  遇到0就停止循环
    1082         printf("执行循环体
    ");
    1083         printf("请输入一个数:
    ");
    1084         scanf("%d",&num);
    1085         printf("您输入的数为:%d
    ",num);
    1086         //判断是正数还是负数
    1087         if (num>=0) {//正数
    1088             count1++;
    1089         }
    1090         if (num<0) {//负数
    1091             count2++;
    1092         }
    1093     }
    1094     printf("正数有:%d个
    ",count1++);
    1095     printf("负数有:%d个
    ",count2++);
    1096     
    1097     printf("程序结束!
    ");
    1098     //多次输入一个数,只要不为0,就一直输入,统计
    1099     //输入的数,有多少个是正数,有多少个是负数。
    1100 结果:
    1101 执行循环体
    1102 请输入一个数:
    1103 60
    1104 您输入的数为:60
    1105 执行循环体
    1106 请输入一个数:
    1107 -60
    1108 您输入的数为:-60
    1109 执行循环体
    1110 请输入一个数:
    1111 0
    1112 您输入的数为:0
    1113 正数有:2个
    1114 负数有:1个
    1115 程序结束!
    1116 
    1117 知识点
    1118 十、随机数
    1119 #include <stdio.h>
    1120 //1.导入头文件
    1121 #include <time.h>
    1122 #include <stdlib.h>
    1123 #include <stdbool.h>
    1124 int main(int argc, const char * argv[])
    1125 {
    1126     /*
    1127     int i = 200;
    1128     char c;
    1129     //类型转换 int->char
    1130     c = (char)i;//告诉其它程序员 类型转换 有风险
    1131     */
    1132     //2.使用函数 (unsigned)将有符号->符号
    1133     srand((unsigned)time(0));//种子
    1134     //0~21亿
    1135     //0~9 %10
    1136     //0~99 %100
    1137     //1~100 %100+1
    1138     int num = rand()%100+1;//随机数
    1139     //printf("num:%d
    ",num);
    1140     bool isFlag = false;//标识是否猜正确
    1141     int inputNum = 0;//输入一个数
    1142     int count = 0;//统计猜数次数
    1143     while (!isFlag) {
    1144         printf("请输入您猜的数:
    ");
    1145         scanf("%d",&inputNum);
    1146         count++;
    1147         //判断
    1148         if (inputNum==num) {
    1149             printf("您猜对了!
    ");
    1150             isFlag = true;
    1151             printf("您一共猜了%d次!
    ",count);
    1152         }else{
    1153             printf("请继续猜!
    ");
    1154             if (inputNum>num) {
    1155                 printf("您上次输入的数大了
    ");
    1156             }else{
    1157                 printf("您上次输入的数小了
    ");
    1158             }
    1159         }
    1160     }
    1161 结果:
    1162 请输入您猜的数:
    1163 60
    1164 请继续猜!
    1165 您上次输入的数小了
    1166 请输入您猜的数:
    1167 80
    1168 请继续猜!
    1169 您上次输入的数大了
    1170 请输入您猜的数:
    1171 70
    1172 请继续猜!
    1173 您上次输入的数大了
    1174 请输入您猜的数:
    1175 65
    1176 请继续猜!
    1177 您上次输入的数小了
    1178 请输入您猜的数:
    1179 69
    1180 您猜对了!
    1181 您一共猜了5次!
    1182 
    1183 知识点
    1184 十一、do…while循环
    1185 //表达式1 循环标识 就算条件不成立 至少执行一次
    1186     int i = 20;
    1187     do {
    1188         printf("HelloWorld
    ");//循环体
    1189         i++;//表达式3
    1190     } while (i<10);//表达式2 循环条件
    1191     /* 第一次循环不会进行判断
    1192      do{
    1193      }while(表达式2)
    1194      */
    1195     /* 三个循环的区别
    1196         for循环可以直接确定循环的次数
    1197         while循环关注循环的条件
    1198         do...while循环 第一次循环不会进行判断,每次判断的是下一次循环是否执行
    1199      */
    1200     //重构猜数练习
    1201 结果:HelloWorld  (先执行do循环体的结果)
    1202 
    1203 2.练习
    1204 模拟输入用户名密码(数字),设置一个数据库(模拟数据写死)中用户名密码(123,456),匹配则显示登录成功(则循环停止),否则登录失败,重新登录。
    1205 
    1206 #include <stdio.h>
    1207 int main(int argc, const char * argv[])
    1208 {
    1209     //1.模拟输入用户名密码(数字)
    1210     int username = 0;//用户名
    1211     int password = 0;//密码
    1212     //2.设置一个数据库(模拟数据写死)中用户名密码(123,456)
    1213     int d_username = 123;
    1214     int d_password = 456;
    1215     //3.匹配则显示登录成功(则循环停止),否则登录失败,重新登录。
    1216     //a.输入数据
    1217     do{
    1218         printf("输入用户名:
    ");
    1219         scanf("%d",&username);
    1220         printf("请输入密码:
    ");
    1221         scanf("%d",&password);
    1222     }while ( !(username==d_username && password==d_password) );
    1223     printf("登录成功!
    ");
    1224     //用户名和密码 都相同 登录成功
    1225     //(username==d_username && password==d_password)
    1226 或(同时使用break和continue)
    1227 
    1228 //1.模拟输入用户名密码(数字)
    1229     int username = 0;//用户名
    1230     int password = 0;//密码
    1231     //2.设置一个数据库(模拟数据写死)中用户名密码(123,456)
    1232     int d_username = 123;
    1233     int d_password = 456;
    1234     //3.匹配则显示登录成功(则循环停止),否则登录失败,重新登录。
    1235     //a.输入数据
    1236     do{
    1237         printf("输入用户名:
    ");
    1238         scanf("%d",&username);
    1239         printf("请输入密码:
    ");
    1240         scanf("%d",&password);
    1241         if (username==d_username && password==d_password) {
    1242             printf("登录成功!
    ");
    1243             break;
    1244         }else{
    1245             printf("登录失败,请重新登录!
    ");
    1246             continue;
    1247         }
    1248     }while (1);
    1249     //用户名和密码 都相同 登录成功
    1250     //(username==d_username && password==d_password)
    1251 
    1252 三个循环的特点:
    1253 for:循环可以直接确定循环次数
    1254 while :关注循环的条件
    1255 dowhile 循环:第一次循环不会进行判断,每次判断的是下一次循环是否执行!
    1256 
    1257 知识点
    1258 十二、breakcontinue
    1259 1.循环中使用break;
    1260   break;不但可以终止switch,也可以终止for循环语句
    1261  举例:
    1262 int main()
    1263 {
    1264     int i=0;
    1265     for (; i<10; i++) {
    1266         if (i==3) {
    1267             break;//终止循环的继续执行
    1268         }
    1269         printf("hello:%d
    ",i);
    1270     }
    1271 }
    1272 练习:
    1273 编写一个求和程序。用户从控制台输入的整数的个数 不受限制,直到输入整数0为止。将输入的整数逐个相加后, 把结果输出。
    1274     int sum = 0;
    1275     while (1) {
    1276         //1.输入一个整数
    1277         int num = 0;
    1278         printf("请输入一个数:
    ");
    1279         scanf("%d",&num);
    1280         //2.循环输入 直接输入0时结束 break
    1281         if (num==0) {
    1282             break;
    1283         }
    1284         //3.求输入整数之和并输出
    1285         sum+=num;
    1286         printf("sum:%d
    ",sum);
    1287     }
    1288 结果:
    1289 请输入一个数:
    1290 45
    1291 sum:45
    1292 请输入一个数:
    1293 64
    1294 sum:109
    1295 请输入一个数:
    1296 0
    1297 2.continue可以终止当次循环,继续下一次循环
    1298 相当于跳过当次,接着执行下面的
    1299 int main()
    1300 {
    1301     for (int i=0; i<10; i++) {
    1302         if (i==3) {
    1303             continue;
    1304         }
    1305         printf("hello word:%d
    ",i);
    1306     }
    1307     return 0;
    1308 }
    1309 结果:
    1310 hello word:0
    1311 hello word:1
    1312 hello word:2
    1313 hello word:4
    1314 hello word:5
    1315 hello word:6
    1316 hello word:7
    1317 hello word:8
    1318 hello word:9
    1319 
    1320 3.清空缓冲区
    1321 scanf(“%*c”);
    1322 举例:有关回车所占的位置清空
    1323 int main()
    1324 {
    1325     char a,b;
    1326     printf("input:");
    1327     scanf("%c",&a);
    1328     scanf("%*c");//清空缓冲区
    1329     
    1330     printf("input:");
    1331     scanf("%c",&b);
    1332     printf("a;%db:%d",a,b);
    1333 }
    1334 
    1335 知识点
    1336 十三、for循环嵌套(相当于乘法)
    1337 int main()
    1338 {
    1339 1.循环嵌套 外面的循环执行一次 里面的循环执行一遍
    1340 2.描述的是一个二维表 外面的循环代表行  里面的代表列
    1341 3.使用循环的嵌套输出指定的图形
    1342 4.for可以嵌套 while可以嵌套 dowhile 也可以嵌套
    1343 5.for…while混合嵌套
    1344     for (int j=0; j<2; j++) {//
    1345         for (int i=0; i<3; i++) {//
    1346             printf("i:%d j:%d
    ",i,j);
    1347         }
    1348         printf("|
    ");
    1349     }
    1350     return 0;
    1351 }
    1352 结果:
    1353 i:0 j:0
    1354 i:1 j:0
    1355 i:2 j:0
    1356 |
    1357 i:0 j:1
    1358 i:1 j:1
    1359 i:2 j:1
    1360 |
    1361 2.输出指定的图形
    1362 for (int j=0; j<3; j++) {
    1363         for (int i=0; i<5; i++) {
    1364             printf("*");
    1365         }
    1366        printf("
    ");
    1367     }
    1368 
    1369 3.while里面嵌套while
    1370 int main()
    1371 {
    1372     int i=0;
    1373     while (i<9) {//
    1374         int j=0;
    1375         while (j<9) {
    1376             printf("%d%d ",i,j);
    1377             j++;
    1378         }
    1379         printf("
    ");
    1380         i++;
    1381         }
    1382    
    1383     return 0;
    1384 }
    1385 执行结果:
    1386 00 01 02 03 04 05 06 07 08 
    1387 10 11 12 13 14 15 16 17 18 
    1388 20 21 22 23 24 25 26 27 28 
    1389 30 31 32 33 34 35 36 37 38 
    1390 40 41 42 43 44 45 46 47 48 
    1391 50 51 52 53 54 55 56 57 58 
    1392 60 61 62 63 64 65 66 67 68 
    1393 70 71 72 73 74 75 76 77 78 
    1394 80 81 82 83 84 85 86 87 88 
    1395 4.while里面嵌套for
    1396 for (int i = 0; i<9; i++) {
    1397         int j = 0;
    1398         while (j<9) {
    1399             printf("%d%d ",i,j);
    1400             j++;
    1401         }
    1402         printf("
    ");
    1403     }
    1404 
    1405 作业:
    1406 
    1407 1.打印图形(简单)
    1408     a.*****
    1409     for (int i = 0;i<5; i++) {
    1410         printf("*");
    1411     }
    1412     printf("
    ");
    1413     b.   *
    1414         **
    1415         ***
    1416         ****
    1417         *****
    1418 for (int j = 1; j<6; j++) { //
    1419         for (int k = 0; k<j; k++) {//列打印内容
    1420             printf("*");
    1421         }
    1422         printf("
    ");
    1423     }
    1424 
    1425     c.*****
    1426        ****
    1427        ***
    1428        **
    1429        *
    1430 for (int j = 1; j<6; j++) { //
    1431         for (int k = 0; k<6-j; k++) {//列打印内容
    1432             printf("*");
    1433         }
    1434         printf("
    ");
    1435     }
    1436 
    1437     d.    *
    1438          ***
    1439           *****
    1440 for(int i=1;i<4;i++){
    1441         
    1442         for(int p=0;p<2*i-1;p++){
    1443             printf("*");
    1444         }
    1445                 printf("
    ");
    1446     }
    1447 
    1448 e. * * * * 
    1449      * * * * 
    1450        * * * * 
    1451          * * * * 
    1452 for(int i=1;i<5;i++){
    1453         
    1454         for(int p=0;p<i;p++){
    1455             printf(" ");
    1456         }
    1457         for(int j=0;j<4;j++){
    1458             
    1459             printf("* ");
    1460             
    1461         }printf("
    ");
    1462     }
    1463 
    1464 2.99乘法表(中)
    1465     1*1=1
    1466     2*1=2 2*2=4
    1467     3*1=3 3*2=6 3*3=9
    1468     ……
    1469 for (int i=1; i<=9; i++) {
    1470         for (int j=1; j<=i; j++) {
    1471             printf("%d*%d=%d ",i,j,i*j);
    1472         }
    1473         printf("
    ");
    1474     }
    1475 
    1476 3.三角形的输出(中)
    1477 for(int i=1;i<5;i++){
    1478         
    1479         for(int p=1;p<5-i;p++){
    1480             printf(" ");
    1481         }
    1482         for(int j=0;j<2*i-1;j++){
    1483 
    1484             printf("*");
    1485            
    1486         }printf("
    ");
    1487     }
    1488   *
    1489   ***
    1490  *****
    1491 *******
    1492 
    1493 4.输入一个数 求数的位数…(高)
    1494     for/while/dowhile
    1495     123->3 4567->4
    1496 int num = 0;
    1497     printf("请输入一个数:
    ");
    1498     scanf("%d",&num);
    1499     int length = 0;//除的次数(长度)
    1500     while (1) {
    1501         length++;
    1502         num = num/10;
    1503         if (num==0) {
    1504             break;
    1505         }
    1506     }
    1507     printf("length:%d
    ",length);
    1508 结果:
    1509 请输入一个数:
    1510 12345
    1511 length:5
    1512 知识点
    1513 十四、一维数组
    1514 一维数组
    1515 数组是用来存储多条相同数据类型的数据结构(容器)
    1516 定义数组:
    1517 int array[3];
    1518 访问元素:array[0]=10;
    1519 
    1520 数组名是地址:不能给数组名赋值
    1521 数组变量只可以在初始化的时候赋值并且是常量
    1522 举例:%p
    1523 int array[3];//数组类型 元素类型 数组名【长度】
    1524     array[0]=10;//数组名【下标】 变量=(存值)=变量(取值)
    1525     array[1]=20;
    1526     array[2]=30;
    1527     printf("array[0]:%d
    ",array[0]);
    1528     printf("array[1]:%d
    ",array[0]);
    1529     printf("array[2]:%d
    ",array[0]);
    1530     return 0;
    1531 
    1532 举例
    1533 int array[3];//数组类型 元素类型 数组名【长度】
    1534     array[0]=10;//数组名【下标】 变量=(存值)=变量(取值)
    1535     array[1]=20;
    1536     array[2]=30;
    1537     printf("array[0]:%d
    ",array[0]);
    1538     printf("array[1]:%d
    ",array[0]);
    1539     printf("array[2]:%d
    ",array[0]);
    1540     
    1541     int i=10;
    1542     printf("address:%p
    ",&i);//&取地址运算符
    1543     
    1544     printf("array address:%p
    ",&array);//array数组变量 array[0]数组元素变量
    1545     printf("array address:%p
    ",array);
    1546     //得到数组中首元素的地址 &array[0]
    1547     printf("array address:%p
    ",&array[0]);
    1548 结果:array[0]:10
    1549 array[1]:10
    1550 array[2]:10
    1551 address:0x7fff5fbff8d8
    1552 array address:0x7fff5fbff8dc
    1553 array address:0x7fff5fbff8dc
    1554 array address:0x7fff5fbff8dc
    1555 
    1556 
    1557 
    1558 练习:通过键盘输入5个数,输入后输出相应的5个数是什么
    1559 
    1560 int array2[5]={};//初始化
    1561     int j;
    1562     //数组使用的时候,经常与循环(for)结合使用
    1563      //输入5个数
    1564     for (int i=0; i<5; i++) {
    1565         printf("input:",i+1);
    1566         scanf("%d",&array2[i]);
    1567         
    1568     }//输出5个数
    1569     for (int j=0; j<5; j++) {
    1570         printf("output:%d",array2[j]);
    1571     }
    1572 
    1573  2. //数组所占空间=元素所占空间*数组的长度
    1574     //?只要知道数组的名字 就能求出数组的长度
    1575     //数组的长度=数组所占空间/元素所占空间
    1576     
    1577     float array3[3] = {10.1,20.1,30.1};
    1578     //数组变量只可以在初始化的时候赋值并且是常量
    1579     //array3 = {10.1,20.1,30.1};
    1580     //array3 = &...
    1581     
    1582     int length = 0;
    1583     //sizeof 变量 类型 常量 表达式
    1584     printf("sizeof(array3) size:%lu
    ",sizeof(array3));
    1585     printf("sizeof(array3[0]) size:%lu
    ",sizeof(array3[0]));
    1586     length = sizeof(array3)/sizeof(array3[0]);
    1587     printf("length:%d
    ",length);
    1588     
    1589     //输出5个数
    1590     for (int j=0; j<sizeof(array3)/sizeof(array3[0]); j++) {
    1591         printf("第%d个数:%f
    ",j+1,array3[j]);
    1592     }
    1593 结果:
    1594 sizeof(array3) size:12
    1595 sizeof(array3[0]) size:4
    1596 length:3
    1597 第1个数:10.100000
    1598 第2个数:20.100000
    1599 第3个数:30.100000
    1600 
    1601 3.可变数组
    1602 1、在C语言中,可变数组指的是数组在声明前其长度是可变的,一旦声明,数组的长度就不可变了。
    1603 2、在oc语言中,专门有一种数据类型叫可变数组,数组在使用过程中,其长度是可变的。
    1604 int count;
    1605     printf("请输入班级的人数:
    ");
    1606     scanf("%d",&count);
    1607     //可变数组在使用前 必须确定数组的长度
    1608     //一但声明,数组的长度不可修改
    1609     int scores[count];//可变数组 是不能初始化
    1610     int sum = 0;
    1611     for (int i = 0; i<count; i++) {
    1612         printf("请输入第%d个的成绩:
    ",i+1);
    1613         scanf("%d",&scores[i]);
    1614         sum+=scores[i];
    1615     }
    1616     printf("sum:%d
    ",sum);
    1617 
    1618 练习:输入10个数,求10个数中的最大值,最小值,和。并且输入该值所在位置(最大值,最小值)
    1619 #include <stdio.h>
    1620 #include <time.h>
    1621 #include <stdlib.h>
    1622 int main(int argc, const char * argv[])
    1623 {
    1624     int nums[5] = {0};
    1625     srand((unsigned)time(0));
    1626     //1.输入5个数
    1627     for (int i = 0; i<5; i++) {
    1628         /* 输入5个数
    1629         printf("请输入第%d个数:
    ",i+1);
    1630         scanf("%d",&nums[i]);
    1631          */
    1632         /*随机生成5个数*/
    1633         nums[i]= rand()%100+1;
    1634        
    1635     }
    1636     //2.得到最大值 得到相应的位置
    1637     int maxIndex = -1;
    1638     int minIndex = -1;
    1639     //a.标尺 (1)拿第一个值当标尺
    1640     //int max = nums[0];
    1641     //(2)指定一个值作为标尺
    1642     //给最小值一个最大值的初值
    1643     //给最大值一个最小值的初值
    1644     int max = 0;
    1645     int min = 100;
    1646     //b.每一个值和标尺比
    1647     //得到数组中的每一个元素 "遍历"
    1648     for (int i = 0; i<5; i++) {
    1649         if(nums[i]> max){
    1650             max = nums[i];
    1651             maxIndex = i;//保存最大值的下标
    1652         }
    1653         if (nums[i]<min) {
    1654             min = nums[i];
    1655             minIndex = i;
    1656         }
    1657     }
    1658     printf("max:%d maxIndex:%d
    ",max,maxIndex);
    1659     printf("min:%d minIndex:%d
    ",min,minIndex);
    1660     //3.得到最小值 得到相应的位置
    1661     //4.求和
    1662 结果:
    1663 max:95 maxIndex:3
    1664 min:29 minIndex:1
    1665 
    1666 4.数组的复制、拷贝
    1667     int array[3] = {4,5,6};
    1668     int array2[3];
    1669     //不可以直接赋值数组变量
    1670     //array2 = array;//数组一但声明 地址是不可修改
    1671     for (int i = 0; i<3; i++) {
    1672        array2[i] = array[i];//取出第一个数组中每一个元素
    1673     }
    1674     //查看数组2中的内容
    1675     for (int j = 0; j<3; j++) {
    1676         printf("array2[%d]:%d
    ",j,array2[j]);
    1677     }
    1678 结果:
    1679 array2[0]:4
    1680 array2[1]:5
    1681 array2[2]:6
    1682 
    1683 5.数组的乱序
    1684 
    1685 #include <stdio.h>
    1686 #include <time.h>
    1687 #include <stdlib.h>
    1688 int main(int argc, const char * argv[])
    1689 {
    1690     int array[10] = {1,2,3,4,5,6,7,8,9,0};
    1691     srand((unsigned)time(0));
    1692     for (int i = 0; i<10; i++) {
    1693         //x交换位置 随机生成
    1694         /*
    1695             0~9
    1696             1~9
    1697             2~9
    1698             3~9
    1699          */
    1700         int x = rand()%(10-i)+i;//只是为了更随机
    1701         //array[i]当前的位置
    1702         //array[x]随机生成的交换位置
    1703         //交换两个值
    1704         int temp = array[i];
    1705         array[i] = array[x];
    1706         array[x] = temp;
    1707     }
    1708     //输出交换后的数组内容
    1709     for (int i = 0; i<10; i++) {
    1710         printf("array[%d]:%d
    ",i,array[i]);
    1711     }
    1712     
    1713     return 0;
    1714 }
    1715 结果:
    1716 array[0]:4
    1717 array[1]:1
    1718 array[2]:8
    1719 array[3]:0
    1720 array[4]:9
    1721 array[5]:6
    1722 array[6]:3
    1723 array[7]:7
    1724 array[8]:5
    1725 array[9]:2
    1726 
    1727 6.正反向遍历
    1728 int main()
    1729 {
    1730     int array[5]={1,2,3,4,5};
    1731     for (int i=0; i<5; i++) {
    1732         printf("%d",array[i]);
    1733         
    1734     }
    1735     printf("
    ");
    1736     for (int i=4; i>=0; i--) {
    1737         printf("%d",array[i]);
    1738     }
    1739     return 0;
    1740 }
    1741 结果
    1742 12345
    1743 54321
    1744 7.数组元素的重复
    1745 若输入数据有重复的数字,把重复的数据表现出来
    1746 int main()
    1747 {
    1748     int num=0;
    1749     int count=0;
    1750 //    int temp=num;//复制一份输入的值
    1751     int array[count];
    1752     
    1753     printf("input");
    1754     scanf("%d",&num);
    1755     int temp=num;
    1756     while (temp) {//求长度
    1757         count++;
    1758         temp/=10;
    1759  //       printf("%d",temp);
    1760     }
    1761     for (int i=0; num; i++) {//求出数组中的每一个数值
    1762         array[i]=num%10;//取出每一位的值并保存
    1763         num/=10;
    1764     }
    1765     for (int i=0; i<count; i++) {//每次都是与前一次进行比较
    1766         for (int j=0; j<i; j++) {
    1767     //        printf("%d%d",i,j);
    1768             if (array[i]==array[j]) {
    1769                 printf("chongf%d
    ",array[i]);
    1770             }
    1771         }
    1772     }
    1773     return 0;
    1774     
    1775 }
    1776 结果:
    1777 input5864564
    1778 chongf4
    1779 chongf8
    1780 chongf5
    1781 
    1782 
    1783 练习:
    1784 随机产生6个红球和1个篮球,并且红球不重复,并输出红球和篮球
    1785 int main()
    1786 {
    1787     //1.生成几个随机数
    1788     //2.随机数的范围
    1789     //3.随机数的样子
    1790     //4.所求随机数 红 蓝
    1791     int blue=0;
    1792     int red[6]={0};
    1793     srand((unsigned)time(0));
    1794     blue=rand()%16+1;
    1795     for (int i=0; i<6; i++) {//red[i]=当前生成的随机数
    1796         red[i]=rand()%33+1;
    1797         for (int j=0; j<i; j++) {//red[j]=之前生成的随机数
    1798             if (red[j]==red[i]) {
    1799                 i--;
    1800                 break;//只要发现一个重复的,后面的就不需要判断了
    1801             }
    1802         }
    1803     }
    1804     
    1805     //判断之前是否有重复
    1806     for (int i=0; i<6; i++) {
    1807         printf("%d ",red[i]);
    1808     }
    1809     printf("%d
    ",blue);
    1810 }
    1811 
    1812 练习 日历
    1813 
    1814 int days[40] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,1,2,3,4,5,6,7,8,9,10};//40应该是365
    1815     int startIndex = 1;//1号在星期几
    1816     int index = 0;//取到几号了
    1817     printf("一	二	三	四	五	六	日
    ");
    1818     if (startIndex==1) {
    1819         printf(" 	");
    1820     }
    1821     do {
    1822         if(startIndex%7!=0){//标识 所在位置
    1823             printf("%d	",days[index++]);
    1824         }else{
    1825             printf("
    %d	",days[index++]);
    1826         }
    1827         startIndex++;
    1828         if (index==40) {
    1829             break;
    1830         }
    1831     }while (1);
    1832     printf("
    ");
    1833 结果:
    1834 一    二    三    四    五    六    日
    1835      1    2    3    4    5    6    
    1836 7    8    9    10    11    12    13    
    1837 14    15    16    17    18    19    20    
    1838 21    22    23    24    25    26    27    
    1839 28    29    30    1    2    3    4    
    1840 5    6    7    8    9    10    
    1841 
    1842 知识点
    1843 十五、二维数组
    1844    //元素类型 数组名[数组长度];
    1845      int array[3]={0};初始化
    1846     //array[下标] 下标<数组长度
    1847     // 数组= 存值     =数组 取值
    1848     //二维数组 3外层(一维)数组的长度,2内层(二维)数组的长度
    1849     //元素类型 二维数组名[一维长度][二维长度];
    1850     int array[3][2];
    1851     //二维数组的操作 array[下标1][下标2]
    1852   int array2[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
    1853   //二维数组与循环嵌套使用
    1854     //外层循环对应二维数组一维的下标
    1855     //内层循环对应二维数组二维的下标
    1856   //   printf("%d",array2[2][0]);
    1857 
    1858 int array[3][2]={{1,2},{3,4},{5,6}};//对应元素内容
    1859 int array1[3][2]={1,2,3,4,5,6};//整体赋值
    1860 int array2[3][2]={1,2,3,4};//依次赋值 自动补零
    1861 
    1862 练习
    1863  1.输入5个学生,3门课的成绩,
    1864  2.求每个学生 总成绩 X
    1865    求每个课程 总成绩 Y
    1866  3.显示
    1867 #include <stdio.h>
    1868 
    1869 int main(int argc, const char * argv[])
    1870 {
    1871     //保存5个学生3门课的成绩
    1872     int score[3][5] = {0};
    1873     int sum[3] = {0};//各门课的总成绩
    1874     int psum[5] = {0};//各个人的总成绩
    1875     //输入每一个学生的成绩
    1876     for (int i=0; i<3; i++) {
    1877         for (int j=0; j<5; j++) {
    1878             //printf("请输入%d行(课程)%d列(姓名)的成绩
    ",i,j);
    1879             printf("请输入");
    1880             //课程
    1881             switch (i) {
    1882                 case 0:
    1883                     printf("语文");
    1884                     break;
    1885                 case 1:
    1886                     printf("数学");
    1887                     break;
    1888                 case 2:
    1889                     printf("英语");
    1890                     break;
    1891             }
    1892             //姓名
    1893             switch (j) {
    1894                 case 0:
    1895                     printf("");
    1896                     break;
    1897                 case 1:
    1898                     printf("");
    1899                     break;
    1900                 case 2:
    1901                     printf("");
    1902                     break;
    1903                 case 3:
    1904                     printf("");
    1905                     break;
    1906                 case 4:
    1907                     printf("");
    1908                     break;
    1909             }
    1910             printf("的成绩
    ");
    1911             scanf("%d",&score[i][j]);
    1912             //求每门课的成绩和
    1913             sum[i]+=score[i][j];
    1914             //求每个人的总成绩和
    1915             psum[j]+=score[i][j];
    1916         }
    1917     }
    1918     printf("	张	李	王	赵	钱
    ");
    1919     //输出每一个学生的成绩
    1920     for (int i=0; i<3; i++) {
    1921         //每一行的行头
    1922         switch (i) {
    1923             case 0:
    1924                 printf("语文");
    1925                 break;
    1926             case 1:
    1927                 printf("数学");
    1928                 break;
    1929             case 2:
    1930                 printf("英语");
    1931                 break;
    1932         }
    1933         printf("	");
    1934         for (int j=0; j<5; j++) {
    1935             printf("%d	",score[i][j]);
    1936         }
    1937         printf("
    ");
    1938         
    1939     }
    1940     //查看每门课的总成绩
    1941     for (int i = 0; i<3; i++) {
    1942         switch (i) {
    1943             case 0:
    1944                 printf("语文");
    1945                 break;
    1946             case 1:
    1947                 printf("数学");
    1948                 break;
    1949             case 2:
    1950                 printf("英语");
    1951                 break;
    1952         }
    1953         printf("的总成绩为:%d
    ",sum[i]);
    1954     }
    1955     //每个人的总成绩?
    1956     return 0;
    1957 }
    1958 结果:
    1959 ……
    1960 80
    1961 请输入英语钱的成绩
    1962 80
    1963     张    李    王    赵    钱
    1964 语文    60    60    60    60    60    
    1965 数学    70    70    70    70    70    
    1966 英语    80    80    80    80    80    
    1967 语文的总成绩为:300
    1968 数学的总成绩为:350
    1969 英语的总成绩为:400
    1970 知识点
    1971 十六、函数
    1972 
    1973 特点:1.结构清晰2.重复使用
    1974 
    1975 1.函数的参数 
    1976 #include <stdio.h>
    1977 //1.声明
    1978 //返回值类型 函数名(参数);
    1979 //推荐:***只要使用函数一定要声明
    1980 void sayHello(int i);//函数的原型
    1981 //void代表空 声明时不写参数 代表任意个数的参数
    1982 //如果不需要参数必须声明成void
    1983 //***函数的声明与函数的定义可以一致
    1984 //声明的时候 定义的时候 参数形参
    1985 //参数:如果函数执行的时候 需要有参考依据就要使用参数
    1986 void sayHello(){ //函数体 真正解决问题代码
    1987     printf("Hello
    ");
    1988 }
    1989 //void sayHello5();
    1990 //2.定义
    1991 void sayHello5(){
    1992  printf("Hello
    ");
    1993  printf("Hello
    ");
    1994  
    1995 }
    1996 练习1:
    1997 想输出几个Hello就输出几个Hello
    1998 void sayHelloN(int n);//声明
    1999 void sayHelloN(int n){
    2000     for (int i=0; i<n; i++) {
    2001         printf("Hello
    ");
    2002     }
    2003 }
    2004 //程序执行的->main()->sayHello();
    2005 int main(int argc, const char * argv[])
    2006 {
    2007     //3.调用 如果定义的时候有参数,调用的时候就必须输入参数,声明与调用要统一
    2008     //sayHello(20);//调用时候的参数就是实参
    2009     //sayHello5();
    2010     sayHelloN(3);
    2011     printf("...几百行
    ");
    2012     //sayHello5();//函数中定义的代码可以多次使用
    2013 结果:
    2014 Hello
    2015 Hello
    2016 Hello
    2017 ...几百行
    2018 
    2019 练习2:
    2020    早 晚 中 吃啥?
    2021  //写函数根据不同值来决定吃什么
    2022  //0鱼香肉丝 1地三鲜 2土豆丝 3.宫爆鸡丁
    2023  //other.吃饺子
    2024 #include <stdio.h>
    2025 //1.声明
    2026 void eat(int num);//根据数据决定吃什么
    2027 //2.定义
    2028 //如果函数需要多个参数,需要用,号分隔开。
    2029 //参数的类型不限制,但必须声明其类型。
    2030 //void eat(int num1,int num2)
    2031 //void eat(int num1,char ch)
    2032 void eat(int num){
    2033     //0鱼香肉丝 1地三鲜 2土豆丝 3.宫爆鸡丁
    2034     switch (num) {
    2035         case 0:
    2036             printf("鱼香肉丝
    ");
    2037             break;
    2038         case 1:
    2039             printf("地三鲜
    ");
    2040             break;
    2041         case 2:
    2042             printf("土豆丝
    ");
    2043             break;
    2044         case 3:
    2045             printf("宫爆鸡丁
    ");
    2046             break;
    2047         default:
    2048             printf("吃饺子
    ");
    2049             break;
    2050     }
    2051 }
    2052 #include <time.h>
    2053 #include <stdlib.h>
    2054 int main(int argc, const char * argv[])
    2055 {
    2056     srand((unsigned)time(0));
    2057     int temp;
    2058     printf("早上起床了,吃啥呢?
    ");
    2059     //scanf("%d",&temp);
    2060     temp = rand()%5;
    2061     //参数也可以是一个表达式,但必须有结果
    2062     eat(1+2);
    2063     
    2064     printf("又到中午了,吃啥呢?
    ");
    2065     temp = rand()%5;
    2066     eat(temp);
    2067     
    2068     printf("晚上了,吃啥呢?
    ");
    2069     temp = rand()%5;
    2070     eat(temp);
    2071 结果:
    2072 早上起床了,吃啥呢?
    2073 宫爆鸡丁
    2074 又到中午了,吃啥呢?
    2075 地三鲜
    2076 晚上了,吃啥呢?
    2077 宫爆鸡丁
    2078 
    2079 2.函数的返回值
    2080 
    2081 练习
    2082 /带饭
    2083 //吃什么口味的 0甜 1咸 2辣
    2084 //0->鱼(Y) 1->土(T) 2->尖(J)
    2085 
    2086 #include <stdio.h>
    2087 /char buy(int taste);
    2088 //如果定义了返回值类型 函数执行后必须有返回值
    2089 char buy(int taste){
    2090     switch (taste) {
    2091         case 0:
    2092             return 'Y';
    2093             break;
    2094         case 1:
    2095             return 'T';
    2096             break;
    2097         case 2:
    2098             return 'J';
    2099             break;
    2100         default:
    2101             return 'Y';
    2102     }
    2103 }
    2104 
    2105 int main(int argc, const char * argv[])
    2106 {
    2107     //中午帮我带个饭 我要辣的
    2108     //调用一个函数的时候,如果函数有返回值,必须要接收或处理
    2109     char ch = buy(0);
    2110     printf("ch:%c
    ",ch);
    2111 结果:ch:Y
    2112 
    2113 3.函数的参数是数组
    2114 
    2115 1.求数组的长度
    2116     int a[]={1,2,3,4,5};
    2117     int length=sizeof(a)/sizeof(a[0]); 求数组的长度
    2118     printf("length:%d
    ",length);
    2119 结果:
    2120 length:5
    2121 
    2122 2.参数是数组
    2123 #include <stdio.h>
    2124 void func(int length,int *p);
    2125 void func(int length,int *p){
    2126     for (int i = 0; i<length; i++) {
    2127         printf("array[%d]:%d
    ",i,*(p+i));
    2128     }
    2129 }
    2130 //参数 如果是数组,必须指定两个值
    2131 //1.数组的长度 2,数组名
    2132 void func2(int lenght,int array[]);
    2133 void func2(int lenght,int array[]){
    2134     for (int i = 0; i<lenght; i++) {
    2135         printf("array[%d]:%d
    ",i,array[i]);
    2136     }
    2137 }
    2138 
    2139 
    2140 int main(int argc, const char * argv[])
    2141 {
    2142     int array[] = {1,2,3,4,5};
    2143     int length = sizeof(array)/sizeof(array[0]);
    2144     printf("length:%d
    ",length);
    2145     
    2146     //int *p = &i;
    2147     //int *p = &array[0];
    2148     int *p = array;
    2149     
    2150     //func(array);
    2151     //如果函数的参数是数组 使用两个参数
    2152     //参数1 为数组的长度 参数2 数组的指针
    2153     func2(length,array);
    2154     
    2155     return 0;
    2156 }
    2157 结果:length:5
    2158 array[0]:1
    2159 array[1]:2
    2160 array[2]:3
    2161 array[3]:4
    2162 array[4]:5
    2163 
    2164 作业:
    2165 1.求两个数的和
    2166 
    2167 #include <stdio.h>
    2168 #include<stdlib.h>
    2169 #include<time.h>
    2170 
    2171 int count(int a,int b);
    2172 int count(int a,int b){
    2173     
    2174     //printf("%d",sum);
    2175     return a+b;
    2176    }
    2177 
    2178 int main(int argc, const char * argv[]) {
    2179     int a;
    2180     int i,j;
    2181     srand((unsigned)time(0));//随机得到两个数
    2182     i=rand()%10;
    2183     j=rand()%10;
    2184     a= count(i,j);// return的返回值赋给a
    2185     printf("%d",a);
    2186 结果:11
    2187 
    2188 2.重构 成绩打印
    2189 
    2190 #include <stdio.h>
    2191 void kemu(int i);
    2192 void xingming(int j);
    2193 
    2194 void kemu(int i){
    2195     switch (i) {
    2196         case 0:
    2197             printf("语文");
    2198             break;
    2199         case 1:
    2200             printf("数学");
    2201             break;
    2202         case 2:
    2203             printf("英语");
    2204             break;
    2205     }
    2206   
    2207 }
    2208 void xingming(int j){
    2209     switch (j) {
    2210         case 0:
    2211             printf("");
    2212             break;
    2213         case 1:
    2214             printf("");
    2215             break;
    2216         case 2:
    2217             printf("");
    2218             break;
    2219         case 3:
    2220             printf("");
    2221             break;
    2222         case 4:
    2223             printf("");
    2224             break;
    2225     }
    2226  
    2227 }
    2228 
    2229 int main(int argc, const char * argv[])
    2230 {
    2231     //保存5个学生3门课的成绩
    2232     int score[3][5] = {0};
    2233     int sum[3] = {0};//各门课的总成绩
    2234     int psum[5] = {0};//各个人的总成绩
    2235     //输入每一个学生的成绩
    2236     for (int i=0; i<3; i++) {
    2237         for (int j=0; j<5; j++) {
    2238             printf("请输入");
    2239             //课程
    2240             kemu(i);
    2241             //姓名
    2242             xingming(j);
    2243             printf("的成绩:");
    2244             scanf("%d",&score[i][j]);
    2245             //求每门课的成绩和
    2246             sum[i]+=score[i][j];
    2247             //求每个人的总成绩和
    2248             psum[j]+=score[i][j];
    2249         }
    2250     }
    2251     printf("	张	李	王	赵	钱
    ");
    2252     //输出每一个学生的成绩
    2253     for (int i=0; i<3; i++) {
    2254         //每一行的行头
    2255         kemu(i);
    2256         printf("	");
    2257         for (int j=0; j<5; j++) {
    2258             printf("%d	",score[i][j]);
    2259         }
    2260         printf("
    ");
    2261         
    2262     }
    2263     //查看每门课的总成绩
    2264     for (int i = 0; i<3; i++) {
    2265         kemu(i);
    2266         printf("的总成绩为:%d
    ",sum[i]);
    2267     }
    2268     //每个人的总成绩
    2269     for (int j=0; j<5; j++) {
    2270         xingming(j);
    2271         printf("的总成绩为:%d
    ",sum[j]);
    2272     }
    2273     return 0;
    2274 }
    2275 结果:
    2276 请输入语文张的成绩:60
    2277 请输入语文李的成绩:60
    2278 请输入语文王的成绩:60
    2279 请输入语文赵的成绩:60
    2280 请输入语文钱的成绩:60
    2281 请输入数学张的成绩:70
    2282 请输入数学李的成绩:70
    2283 请输入数学王的成绩:70
    2284 请输入数学赵的成绩:70
    2285 请输入数学钱的成绩:70
    2286 请输入英语张的成绩:80
    2287 请输入英语李的成绩:80
    2288 请输入英语王的成绩:80
    2289 请输入英语赵的成绩:80
    2290 请输入英语钱的成绩:80
    2291     张    李    王    赵    钱
    2292 语文    60    60    60    60    60    
    2293 数学    70    70    70    70    70    
    2294 英语    80    80    80    80    80    
    2295 语文的总成绩为:300
    2296 数学的总成绩为:350
    2297 英语的总成绩为:400
    2298 张的总成绩为:300
    2299 李的总成绩为:350
    2300 王的总成绩为:400
    2301 赵的总成绩为:60
    2302 钱的总成绩为:60
    2303 
    2304 3.使用一个函数调换两个数。
    2305 #include <stdio.h>
    2306 #include<stdlib.h>
    2307 #include<time.h>
    2308 void count(int i,int j);
    2309 void count(int i,int j){
    2310     printf("交换之前的值:i=%d j=%d
    ",i,j);
    2311     int temp=0;
    2312     temp=i;
    2313     i=j;
    2314     j=temp;
    2315     printf("交换之后的值:i=%d j=%d
    ",i,j);
    2316 }
    2317 
    2318 int main(int argc, const char * argv[]) {
    2319     int a=0,b=0;
    2320     srand((unsigned)time(0));
    2321     a=rand()%100;
    2322     b=rand()%100;
    2323    // printf("主函数交换之前的值:i=%d j=%d
    ”,a,b);去掉
    2324     count(a,b);
    2325     //实参与形参不是一个内存空间(传递的只是值)
    2326    // printf("主函数交换之后的值:i=%d j=%d
    ”,a,b);去掉
    2327     return 0;
    2328 }
    2329 结果:
    2330 主函数交换之前的值:i=66 j=41
    2331 交换之前的值:i=66 j=41
    2332 交换之后的值:i=41 j=66
    2333 主函数交换之后的值:i=66 j=41
    2334 
    2335 4.求两个数的最大值?
    2336 5.求两个数的最小值?
    2337 #include <stdio.h>
    2338 #include<stdlib.h>
    2339 #include<time.h>
    2340 void count(int i,int j);
    2341 void count(int i,int j){
    2342     int min=0,max=0;
    2343     max=i;min=i;
    2344     if (i<j) {
    2345         max=j;
    2346     }
    2347     if (i>j) {
    2348         min=j;
    2349     }
    2350     printf("max:%d,min:%d
    ",max,min);
    2351     
    2352 }
    2353 
    2354 int main(int argc, const char * argv[]) {
    2355     int a=0,b=0;
    2356     srand((unsigned)time(0));
    2357     a=rand()%100;
    2358     b=rand()%100;
    2359     count(a,b);
    2360 结果:
    2361 max:54,min:17
    2362 
    2363 6.输入分数求级别,输入级别求分数?重构输入10个学生信息,得到相应结果。
    2364 #include <stdio.h>
    2365 #include<stdlib.h>
    2366 #include<time.h>
    2367 //void a(int i);
    2368 //void b(char j);
    2369 //void xingming(int k);
    2370 
    2371 void a(int i){
    2372     i=i/10;
    2373     switch (i) {  //输入分数求级别0~60D 60~70C 70~90B 90~100A
    2374         case 6:
    2375             printf("C
    ");
    2376             break;
    2377         case 7:
    2378         case 8:
    2379             printf("B
    ");
    2380             break;
    2381         case 9:
    2382         case 10:
    2383             printf("A
    ");
    2384             break;
    2385             
    2386         default:printf("D
    ");
    2387             break;
    2388     }
    2389 }
    2390 
    2391 void b(char j){
    2392     switch(j){
    2393         case 'A':
    2394         case 'a':printf("90~100
    ");break;
    2395         case 'B':
    2396         case 'b':printf("70~90
    ");break;
    2397         case 'C':
    2398         case 'c':printf("60~70
    ");break;
    2399         default:printf("60
    ");  break;
    2400     }
    2401  
    2402     
    2403 }
    2404 
    2405 
    2406 void xingming(int k){
    2407     switch (k) {
    2408         case 0:
    2409             printf("");
    2410             break;
    2411         case 1:
    2412             printf("");
    2413             break;
    2414         case 2:
    2415             printf("");
    2416             break;
    2417         case 3:
    2418             printf("");
    2419             break;
    2420         case 4:
    2421             printf("");
    2422             break;
    2423     }
    2424     
    2425 }
    2426 
    2427 int main(int argc, const char * argv[]) {
    2428   
    2429     
    2430     for (int i=0; i<5; i++) {//输入5个人的信息
    2431         int fenshu;
    2432         printf("请输入");
    2433         xingming(i);
    2434         printf("的分数:");
    2435         scanf("%d",&fenshu);
    2436         printf("对应的等级是:");a(fenshu);
    2437     }
    2438     scanf("%*c");//缓存
    2439     for (int i=0; i<5; i++) {//输入5个人的信息
    2440         char dengji;
    2441         printf("请输入");
    2442         xingming(i);
    2443         printf("的等级:");
    2444         scanf("%c",&dengji);
    2445         
    2446         printf("对应的范围是:");b(dengji);
    2447     }
    2448 
    2449         return 0;
    2450 }
    2451 结果:
    2452 请输入张的分数:60
    2453 对应的等级是:C
    2454 请输入李的分数:50
    2455 对应的等级是:D
    2456 请输入王的分数:90
    2457 对应的等级是:A
    2458 请输入赵的分数:80
    2459 对应的等级是:B
    2460 请输入钱的分数:70
    2461 对应的等级是:B
    2462 请输入张的等级:a
    2463 对应的范围是:90~100
    2464 请输入李的等级:对应的范围是:60
    2465 请输入王的等级:D
    2466 对应的范围是:60
    2467 请输入赵的等级:对应的范围是:60
    2468 请输入钱的等级:C
    2469 对应的范围是:60~70
    2470 
    2471 4.return与exit关键字
    2472 
    2473 return2474 
    2475 1.有返回值类型,必须有return关键字
    2476 2.没有返回值类型,也可以使用return关键字
    2477 3.当函数的执行过程中,如果碰到return关键字,会终止函数的继续执行
    2478 
    2479 #include <stdio.h>
    2480 void fun();
    2481 void fun(){
    2482     //有返回值类型,必须有return关键字
    2483     //没有返回值类型,也可以使用return关键字
    2484     return ;//当函数的执行过程中,如果碰到return关键字,会终止函数的继续执行
    2485     printf("函数结尾");
    2486 }
    2487 int main(int argc, const char * argv[]) {
    2488     fun();
    2489     printf("程序结尾
    ");
    2490 结果:
    2491 程序结尾
    2492 
    2493 exit:(#include <stdlib.h>2494 1.终止程序的继续执行
    2495 #include <stdio.h>
    2496 #include <stdlib.h>
    2497 void func();
    2498 void func(){
    2499     printf("2.func函数开始执行了
    ");
    2500     //1.有返回值类型 必须有return关键字
    2501     //2.没有返回值类型 也可以使用return关键字
    2502     //return ;
    2503    exit(0);//终止程序的继续执行
    2504     //当函数的执行过程中 如果碰到return关键字,会终止函数的继续执行
    2505     printf("函数末尾!
    ");
    2506 }
    2507 int main(int argc, const char * argv[])
    2508 {
    2509     printf("1程序开始!
    ");
    2510     func();
    2511     printf("3.程序末尾!
    ");
    2512     return 0;
    2513 }
    2514 结果:
    2515 1程序开始!
    2516 2.func函数开始执行了
    2517 
    2518 练习:
    2519 输出一组数的和、最大值、最小 值  
    2520         在主函数中创建一个长度为10的数组,数组内放置10 个0~99之间(包含0,包含99)的随机数作为数组内容。   按要求分别编制自定义函数求数组中的最大值、最小值并 计算出所有数组元素的和。   在主函数中将各自定义函数的返回值打印显示在界面上。
    2521 #include <stdio.h>
    2522 #include <time.h>
    2523 #include <stdlib.h>
    2524 //得到一个随机数 0~99
    2525 int getRandom();
    2526 int getRandom(){
    2527     return rand()%100;
    2528 }
    2529 //得到一组数中的最大值
    2530 int getArrayMax(int length,int array[]);
    2531 int getArrayMax(int length,int array[]){
    2532     int max = 0;
    2533     for (int i= 0; i<length; i++) {
    2534         if(array[i]>max){
    2535             max = array[i];
    2536         }
    2537     }
    2538     return max;
    2539 }
    2540 //得到一组数中的最小值
    2541 int getArrayMin(int length,int array[]);
    2542 int getArrayMin(int length,int array[]){
    2543     int min = 99;
    2544     for (int i= 0; i<length; i++) {
    2545         if(array[i]<min){
    2546             min = array[i];
    2547         }
    2548     }
    2549     return min;
    2550 }
    2551 //得到一组数的和
    2552 int getArraySum(int length,int array[]);
    2553 int getArraySum(int length,int array[]){
    2554     int sum = 0;
    2555     for (int i=0; i<length; i++) {
    2556         sum+=array[i];
    2557     }
    2558     return sum;
    2559 }
    2560 //得到数组所有的内容
    2561 void outputArrayValue(int length,int array[]);
    2562 void outputArrayValue(int length,int array[]){
    2563     for (int i = 0; i<length; i++) {
    2564         printf("array[%d]:%d
    ",i,array[i]);
    2565     }
    2566 }
    2567 int main(int argc, const char * argv[])
    2568 {
    2569     int array[10] = {0};
    2570     //生成随机数
    2571     srand((unsigned)time(0));
    2572     for (int i=0; i<10; i++) {
    2573         array[i] = getRandom();
    2574     }
    2575     //得到最大值
    2576     int max = getArrayMax(10, array);
    2577     //得到最小值
    2578     int min = getArrayMin(10, array);
    2579     //得到和
    2580     int sum = getArraySum(10, array);
    2581     printf("max:%d min:%d sum:%d
    ",max,min,sum);
    2582     //显示数组中的所有内容
    2583     outputArrayValue(10, array);
    2584    
    2585     return 0;
    2586 }
    2587 结果:
    2588 max:78 min:10 sum:504
    2589 array[0]:18
    2590 array[1]:30
    2591 array[2]:46
    2592 array[3]:75
    2593 array[4]:78
    2594 array[5]:52
    2595 array[6]:50
    2596 array[7]:10
    2597 array[8]:76
    2598 array[9]:69
    2599 
    2600 
    2601 5.递归函数
    2602 函数中调用函数就叫做递归。(一不小心死循环)
    2603     1.递归工作原理:
    2604               1.必须有退出条件
    2605               2.必须保证递归后。算法简化
    2606 #include <stdio.h>
    2607 int func(int num);
    2608 int func(int num){
    2609     printf("num:%d
    ",num);
    2610     if (num==1) {
    2611         return 1;//终止条件
    2612     }
    2613     return num*func(num-1);//保证递归后算法简化   复制一个继续执行然后返回值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
    2614 }//函数中调用函数 递归 一不小心死循环
    2615 //程序的编译顺序是自上下向的
    2616 //程序的运行顺序main函数的调用顺序
    2617 int main(int argc, const char * argv[]) {
    2618    int num1= func(3);3的阶乘,是几的阶乘就写几
    2619     printf("num1=%d
    ",num1);
    2620     return 0;
    2621 }
    2622 结果:
    2623 num:3
    2624 num:2
    2625 num:1
    2626 num1=6(6相当于3的阶乘3!=3*2*12627 
    2628 知识点
    2629 十六、变量的作用域
    2630 一、变量的作用域  (变量的使用范围)
    2631 1.不同级的代码块是可以重名的
    2632 2.i取值是就近原则
    2633 3.在上一级代码中声明的变量,是可以在下一级代码中使用
    2634 4.在下一级代码中声明的变量,是不可以在上一级代码中使用
    2635 5.声明在大括号外面的变量叫全局变量(整个程序中都可以用)
    2636 6.声明在大括号里面的变量叫局部变量(只能在大括号的内部使用)
    2637 7.参数是个特殊的局部变量,作用域范围,是函数的内部
    2638 8.for 循环的表达式1也是个特殊的局部变量,作用域的范围只能在for  循环体内部使用
    2639 #include <stdio.h>
    2640 
    2641 int main(int argc, const char * argv[]) {
    2642     //变量i 作用域
    2643     int i=10;上一级代码块    全局变量
    2644     {
    2645       //代码块
    2646         int i=20;//不同级的代码块是可以重名的    下一级代码块      局部变量
    2647         //i取值是就近原则
    2648         printf("i1:%d
    ",i);
    2649     }
    2650     printf("i2:%d
    ",i);
    2651     return 0;
    2652 }
    2653 结果:
    2654 i1:20
    2655 i2:10
    2656 
    2657 二、变量的生命周期(局部变量)在内存中存在的情况
    2658    1.自动变量auto   
    2659          auto关键字 是没有动态变量一说的  不可使用
    2660    2.静态变量static
    2661      static在声明的开始,当程序结束时后结束
    2662        
    2663 #include <stdio.h>
    2664 void func2(){
    2665     //自动变量  默认值就是auto
    2666     auto int i=10;//生 创建内存空间    auto可以省略
    2667     //静态变量
    2668     static int i2=20;//生 死:当程序结束的时候
    2669     i++;
    2670     i2++;
    2671     printf("i:%d
    ",i);
    2672     printf("i2:%d
    ",i2);
    2673 }//出了作用域 死 回收内存空间
    2674 
    2675 int main(int argc, const char * argv[]) {
    2676     func2();
    2677     func2();
    2678     
    2679     
    2680     return 0;
    2681 }
    2682 结果:
    2683 i:11
    2684 i2:21
    2685 i:11
    2686 i2:22
    2687 二、变量的生命周期(全局变量)
    2688  全局变量的作用域在整个程序的内部,多个函数可以共享这个全局变量  
    2689  全局变量的生命周期:
    2690     程序开始的时候——生
    2691     程序结束的时候——死
    2692  
    2693 三、全局变量中的static和auto
    2694 
    2695 1.auto关键字 是没有动态变量一说的  不可使用
    2696 2.static关键字 和生命周期没有关系,在多文件开发中,如果要区分全局变量在不同文件中的访问范围,需要使用static关键字修饰
    2697 
    2698 四、栈操作
    2699 先进后出,后进先出
    2700 练习:使用程序来模拟放球、取球的问题  
    2701       用数字来代表球,向栈中放入一个数字1代表放入了1 号球,向栈中放入一个数字2代表放入了2号球,依次类推。 同样,从栈中取出数字1代表取出了1号球。
    2702 #include <stdio.h>
    2703 //网兜
    2704 int balls[3]={0};
    2705 //网兜状态标识
    2706 int ballIndex = -1;//网兜空的时候为-1
    2707 
    2708 //判断有没有满 1.满 0.未满
    2709 int isFull(){
    2710     if (ballIndex==2) {
    2711         return 1;
    2712     }else{
    2713         return 0;
    2714     }
    2715 }
    2716 
    2717 //存球
    2718 void push(int ball);
    2719 void push(int ball){
    2720     //判断有没有满
    2721     if (!isFull()) {//没满 存
    2722         ballIndex++;
    2723         balls[ballIndex]=ball;
    2724     }else{ //满 不存
    2725         printf("网兜已经满了,不能存值!
    ");
    2726     }
    2727 }
    2728 
    2729 //网兜是否为空 1空 0非空
    2730 int isEmpty();
    2731 int isEmpty(){
    2732     if (ballIndex==-1) {
    2733         return 1;//为空
    2734     }else{
    2735         return 0;//非空
    2736     }
    2737 }
    2738 
    2739 //取球
    2740 int pop();
    2741 int pop(){
    2742     //网兜是否为空
    2743     if (!isEmpty()) {//非空 取
    2744         int temp = balls[ballIndex];
    2745         balls[ballIndex] = 0;//还要将原来位置的值清零
    2746         ballIndex--;
    2747         return temp;
    2748     }else{//空 不能取
    2749         printf("网兜为空,不能取球!
    ");
    2750         return 0;
    2751     }
    2752 }
    2753 
    2754 //查看网兜状态
    2755 void showBalls();
    2756 void showBalls(){
    2757     printf("===================
    ");
    2758     for (int i=2; i>=0; i--) {
    2759         printf("balls[%d]:%d
    ",i,balls[i]);
    2760     }
    2761     printf("===================
    ");
    2762 }
    2763 
    2764 int main(int argc, const char * argv[])
    2765 {
    2766     showBalls();
    2767     push(1);
    2768     showBalls();
    2769     push(1);
    2770     showBalls();
    2771     push(2);
    2772     showBalls();
    2773     push(3);
    2774     showBalls();
    2775     int ball = pop();
    2776     printf("取走了一个球:%d
    ",ball);
    2777     showBalls();
    2778     ball = pop();
    2779     printf("取走了一个球:%d
    ",ball);
    2780     showBalls();
    2781     ball = pop();
    2782     printf("取走了一个球:%d
    ",ball);
    2783     showBalls();
    2784     ball = pop();
    2785     printf("取走了一个球:%d
    ",ball);
    2786     showBalls();
    2787     return 0;
    2788 }
    2789 结果:
    2790 ===================
    2791 balls[2]:0
    2792 balls[1]:0
    2793 balls[0]:0
    2794 ===================
    2795 ===================
    2796 balls[2]:0
    2797 balls[1]:0
    2798 balls[0]:1
    2799 ===================
    2800 ===================
    2801 balls[2]:0
    2802 balls[1]:1
    2803 balls[0]:1
    2804 ===================
    2805 ===================
    2806 balls[2]:2
    2807 balls[1]:1
    2808 balls[0]:1
    2809 ===================
    2810 网兜已经满了,不能存值!
    2811 ===================
    2812 balls[2]:2
    2813 balls[1]:1
    2814 balls[0]:1
    2815 ===================
    2816 取走了一个球:2
    2817 ===================
    2818 balls[2]:0
    2819 balls[1]:1
    2820 balls[0]:1
    2821 ===================
    2822 取走了一个球:1
    2823 ===================
    2824 balls[2]:0
    2825 balls[1]:0
    2826 balls[0]:1
    2827 ===================
    2828 取走了一个球:1
    2829 ===================
    2830 balls[2]:0
    2831 balls[1]:0
    2832 balls[0]:0
    2833 ===================
    2834 网兜为空,不能取球!
    2835 取走了一个球:0
    2836 ===================
    2837 balls[2]:0
    2838 balls[1]:0
    2839 balls[0]:0
    2840 ===================
    2841 
    2842 知识点
    2843 十七、指针
    2844 1.什么是指针
    2845 内存被分为字节,每个字节有唯一的地址,指针指的就是内 存地址
    2846 2.指针变量
    2847 保存指针的变量,就叫指针变量。(保存地址)  
    2848     int i;//int类型变量
    2849     i=10;
    2850     int* p;//*指针类型变量
    2851     p=&i;
    2852     printf("p->:%d
    ",*p);
    2853 结果:
    2854 p->:10
    2855 
    2856 3.每个指针变量能指向一种特定类型的对象(地址,内存区 域)
    2857 
    2858 4.指针是引用数据类型,因为本身没有保存数据,只是保存了 数据的地 址,间接的找到内存中的数据
    2859 
    2860 *5.得到一个指针,可以得到两个值
    2861         1.直接得到数据在内存的地址    指针的值     地址
    2862         2.间接得到内存中保存的数据    指针指向(值)
    2863     int i;//int类型变量
    2864     i=30;
    2865     int* p;//*指针类型变量
    2866           p = &i;//得到变量在内存中位置   (指针的值)一块内存地址
    2867     printf("p:%p
    ",p);
    2868     
    2869     //通过寻址运算符 根据地址直接操作内存
    2870     //
    2871     printf("内存中的数据:%d
    ",*p);
    2872     //
    2873     *p = 40; 指针指向的内存区域
    2874     printf("i:%d
    ",i);
    2875     
    2876     
    2877 结果:
    2878 p:0x7fff5fbff70c
    2879 内存中的数据:30
    2880 i:40
    2881 
    2882 6.指针可以作为参数(形参)
    2883 
    2884 定义函数时,可以使指针类型作为参数,多个变量共用一个内存空间
    2885 
    2886 练习 交换两个值的地址
    2887 
    2888 #include <stdio.h>
    2889 //共用一块内存区域
    2890 void change(int* p1,int* p2);
    2891 void change(int* p1,int* p2){
    2892     printf("change1 i:%d j:%d
    ",*p1,*p2);
    2893     int temp = *p1;
    2894     *p1 = *p2;
    2895     *p2 = temp;
    2896     printf("change2 i:%d j:%d
    ",*p1,*p2);
    2897 }
    2898 
    2899 int main(int argc, const char * argv[])
    2900 {
    2901     int i = 10;
    2902     int j = 20;
    2903     printf("main1 i:%d j:%d
    ",i,j);
    2904     change(&i, &j);
    2905     printf("main2 i:%d j:%d
    ",i,j);
    2906     return 0;
    2907 }
    2908 结果:
    2909 main1 i:10 j:20
    2910 change1 i:10 j:20
    2911 change2 i:20 j:10
    2912 main2 i:20 j:10
    2913 
    2914 求一组数的最大值、最小值    
    2915          在主函数中创建一个长度为10的数组,数组内放置10 个0~99之间(包含0,包含99)的随机数作为数组内容, 按要求编制一个自定义函数同时返回数组中的最大值、最 小值,然后在主函数中将自定义函数的返回值打印显示在 界面上。
    2916 #include <stdio.h>
    2917 #include<stdlib.h>
    2918 #include<time.h>
    2919 int num();
    2920 int num(){
    2921     return rand()%100;
    2922 }
    2923 
    2924 void func(int length,int a[],int* maxp,int* minp);
    2925 void func(int length,int a[],int* maxp,int* minp){
    2926     for (int i=0; i<length; i++) {
    2927         if (a[i]>*maxp) {
    2928             *maxp=a[i];
    2929         }
    2930         if (a[i]<*minp) {
    2931             *minp=a[i];
    2932         }
    2933     }
    2934 }
    2935 int main(int argc, const char * argv[]) {
    2936     int max=0,min=99;
    2937     int a[10]={0};
    2938     //使用随机数生成10个数
    2939     srand((unsigned)time(0));
    2940     for (int i=0; i<10; i++) {
    2941         a[i]=num();
    2942         printf("a[%d]=%d
    ",i,a[i]);
    2943     }
    2944    //求一组数的最大值和最小值
    2945     func(10,a, &max,&min);
    2946     printf("max:%d min:%d
    ",max,min);
    2947     
    2948     return 0;
    2949 }
    2950 结果:
    2951 a[0]=72
    2952 a[1]=11
    2953 a[2]=16
    2954 a[3]=38
    2955 a[4]=52
    2956 a[5]=78
    2957 a[6]=20
    2958 a[7]=92
    2959 a[8]=42
    2960 a[9]=53
    2961 max:92 min:11
    2962 
    2963 7.指针可以作为返回值
    2964 
    2965 定义函数的时候,可以使用指针类型作为返回值,可以共享函数中的内存空间。注意:函数中的变量不能是自动变量,自动变量一旦超出作用域就销毁了,如果想使用,必须延长变量的生命周期,使它变成静态变量。
    2966 
    2967 
    2968 #include <stdio.h>
    2969 //2.使用全局变量
    2970 //int i=30;
    2971 int* func();
    2972 int* func(){//指针作为参数,共享函数中的内存空间
    2973     static int i=10;//1.延长变量生命周期    (只有第一次执行,第二次调用便使用i++)
    2974     i++;
    2975     printf("i:%d
    ",i);
    2976     return &i;
    2977 }
    2978 int main(int argc, const char * argv[]) {
    2979     int* ip;
    2980     ip=func();
    2981     *ip=20;
    2982     func();
    2983     
    2984     return 0;
    2985 }
    2986 结果:
    2987 i:11
    2988 i:21
    2989 
    2990 8.指针的加减操作
    2991 指针支持加整数、减整数、指针的比较和相减,但运算的单位 由指针的类型决定。 
    2992    指针变量+1 相当于移动了一个数据位
    2993    int类型指针+1  =  地址+4        
    2994    char类型指针+1  =地址+1  
    2995 1.int 类型的指针加减
    2996 
    2997 #include <stdio.h>
    2998 
    2999 int main(int argc, const char * argv[]) {
    3000     int a[3]={1,2,3};
    3001     int* p=a;//等于int* p=&a[0];
    3002     printf("*p:%d  %p
    ",*p,p);
    3003     printf("*(p+1):%d  %p
    ",*(p+1),p+1);
    3004     printf("*(p+2):%d  %p 
    ",*(p+2),p+2);
    3005     return 0;
    3006 }
    3007 结果:
    3008 *p:1      0x7fff5fbff77c
    3009 *(p+1):2  0x7fff5fbff780
    3010 *(p+2):3  0x7fff5fbff784
    3011 
    3012 2.char类型的指针加减
    3013 
    3014 #include <stdio.h>
    3015 
    3016 int main(int argc, const char * argv[]) {
    3017     char a[3]={'a','b','c'};
    3018     char* p=a;//等于int* p=&a[0];
    3019     printf("*p:%c  %p
    ",*p,p);
    3020     printf("*(p+1):%c  %p
    ",*(p+1),p+1);
    3021     printf("*(p+2):%c  %p 
    ",*(p+2),p+2);
    3022     return 0;
    3023 }
    3024 结果:
    3025 *p:a      0x7fff5fbff77d
    3026 *(p+1):b  0x7fff5fbff77e
    3027 *(p+2):c  0x7fff5fbff77f
    3028 
    3029 3.通过for循环  根据地址取值
    3030 
    3031 #include <stdio.h>
    3032 
    3033 int main(int argc, const char * argv[]) {
    3034    int a[3]={1,5,2};
    3035    int* p=a;//等于int* p=&a[0];
    3036 
    3037    //通过for循环 根据地址取值
    3038     for (int i=0; i<3; i++) {
    3039     //*(p+i)与(*p)+1结果是不同的
    3040     printf("*(p+i):%d
    ",*(p+i));正确的输出
    3041     printf("*(p)+i:%d
    ",(*p)+i);
    3042 }
    3043 结果:
    3044 *(p+i):1
    3045 *(p)+i:1
    3046 *(p+i):5
    3047 *(p)+i:2
    3048 *(p+i):2
    3049 *(p)+i:3
    3050 
    3051 
    3052 9.二级指针
    3053     int i=10;
    3054     int* ip=&i;//指针
    3055     int** ip2=&ip;//二级指针
    3056     int*** ip3=&ip2;//三级指针
    3057     printf("ip3:%d
    ",***ip3);
    3058 结果:
    3059 ip3:10
    3060 
    3061 10.指针与数组
    3062 
    3063 共同点:两者都可以表示地址
    3064 
    3065 不同点:
    3066  一、所占内存空间不同
    3067     1. 和具体内存中,所保存的数据无关
    3068   2.所有内存的地址所占内存空间都是一样大的
    3069   3.指针地址所占内存空间在macos64位系统下, 地址所占8字节
    3070      4.数组所占的内存空间=元素所占的内存空间*元素的长度(个数)
    3071 例题:
    3072     int i = 10;
    3073     char ch = 'a';
    3074     int* p1 = &i;
    3075     char* p2 = &ch;
    3076     //所占内存空间
    3077     //和具体内存中,所保存的数据是无关
    3078     //所有内存的地址所占内存空间都是一样大的
    3079     //macos64位 地址所占8B
    3080     printf("p1 size:%ld
    ",sizeof(p1));
    3081     printf("p2 size:%ld
    ",sizeof(p2));
    3082     
    3083     //数组所占的内存空间=元素所占内存空间*元素个数
    3084     int array[5];
    3085     int* p = array;
    3086     printf("p size:%ld %p
    ",sizeof(p),p);
    3087     printf("array size:%ld *%p
    ",sizeof(array),array);
    3088 
    3089 结果:
    3090 p1 size:8
    3091 p2 size:8
    3092 p size:8 0x7fff5fbff790
    3093 
    3094 二、赋值
    3095      1.指针变量的值是可以改变的
    3096        2.数组一但声明,其值是不可以改变的,而是保存数据在内存中的地址,在使     用的时候通过地址间接得到数据的值。
    3097 
    3098  例题:   
    3099     int array[5];
    3100     int* p = array;
    3101     printf("p size:%ld %p
    ",sizeof(p),p);
    3102     printf("array size:%ld *%p
    ",sizeof(array),array);
    3103     //赋值
    3104     int i2 = 10;
    3105     int j2 = 20;
    3106     int* p3 = &i2;
    3107     p3 = &j2;//指针变量的值是可以改变的 赋值
    3108     
    3109     int array2[5];
    3110     int array3[10];
    3111     //array2 = array3;错误的表示//是不可以改变数组变量的值的
    3112 结果:
    3113 array size:20 *0x7fff5fbff790
    3114 
    3115 11、引用———c语言中数据类型主要分为两大类
    3116 
    3117  基本数据类型:int char double float
    3118  变量本身就保存了我们需要的数据
    3119  引用数据类型:指针
    3120  变量本身并没有保存数据
    3121 
    3122 数据->(Create创建Read读取Update更新Delete删除)
    3123 
    3124 12.进程空间
    3125 
    3126 •进程是正在运行的程序,在内存中。  
• 每个进程在内存中占据的空间称进程空间  
    3127 1.进程空间的内存分配
    3128     1.代码区(正文段,  text)  只读      程序代码
    3129     2.全局区(全局静态区)    读、写     全局变量、静态变量
    3130     3.堆区(自由区,  heap)   读、写
    3131      4.栈区(堆栈,    stack)     读、写     动态变量(局部变量)
    3132 知识点
    3133 十八、字符串
    3134  1.三种字符串的创建:
    3135   一、字面值字符串
    3136        1.在代码区创建了一个字符串 会在结尾自动加0 (只读)
    3137         2.字符串有自己的占位符%s
    3138         3.字符串使用,会从首地址一个字节一个字节的读取数据,直到读到位     置表示结束
    3139     //在代码区创建了一个字符串 会在结尾自动加
    3140     char* p= "string1";//可以与指针变量结合使用
    3141     printf("string2
    ");//直接与输出函数使用
    3142     //字符串有自己的占位符%s
    3143     printf("%s
    ",p);
    3144     char* p2= "string1";
    3145     //如果字符串的内容相同,代码区只会创建一个字符串
    3146     printf("p:%p,p2:%p
    ",p,p2);//地址
    3147     //字符串使用,会从首地址一个字节一个字节的读取数据,直到读到位置 表示结束
    3148     char* p3="string1
    ";
    3149     printf("p3:%s
    ",p3);
    3150 结果:
    3151 string2
    3152 string1
    3153 p:0x100000f6e,p2:0x100000f6e
    3154 p3:str
    3155          4.证明  代码区   只读
    3156     char* p3="string1
    ";
    3157     printf("p3:%s
    ",p3);
    3158     char* cp=p3;
    3159     printf("cp+1:%c
    ",*(cp+1));  //3160     //*(cp+1)='w';//如果非要改 程序就异常   //
    3161 结果:
    3162 p3:str
    3163 cp+1:t
    3164 
    3165 二、字符数组的字符串
    3166        1.保存在内存中栈区  内容就算相同,也会开辟不同的内存空间
    3167      2.字符数组的字符串与普通的字符数组最大的区别是否有 结束符0
    3168   3.栈区 读写....
    3169     char str[4]={'s','t','r',''};
    3170     char str2[4]={'s','t','r',''};
    3171     char* cp = str2;
    3172     *(cp+1) = 'w';//可以改变栈区的数据
    3173     printf("str address:%p value:%s
    ",str,str);
    3174     printf("str2 address:%p value:%s
    ",str2,str2);
    3175 结果:
    3176 str address:0x7fff5fbff7a4 value:str
    3177 str2 address:0x7fff5fbff7a0 value:swr
    3178 
    3179 三、字符指针
    3180 
    3181 对于字符串来讲引用类型:
    3182 
    3183 1.字符指针即可以与字面值字符串结合使用
    3184 2.也可以与字符数组的字符串结合使用
    3185 
    3186 练习:通过键盘输入一个字符串
    3187     //char* input="*********";通过字面值定义字符串不可取
    3188     char input[10];
    3189     char* inputp=input;
    3190     printf("请输入一个字符串信息:
    ");
    3191     scanf("%s",input);
    3192     printf("str:%s
    ",inputp);
    3193 结果:
    3194 请输入一个字符串信息:
    3195 hello
    3196 str:hello
    3197 
    3198 三种字符串创建的比较
    3199                     内存              内容相同               读写        结束符
    3200     a.字面值       代码区            只会创建一个      只读         自动
    3201     b.字符数组   栈区                会创建多个          读写         手动
    3202     c.字符指针   保存地址(栈) 无关                      无关         无关
    3203 
    3204 2.字符串函数库
    3205 
    3206 #include <string.h>
    3207 
    3208      帮我们解决常用字符串的问题
    3209   a.字符串的赋值strcpy(参数1,参数2)
    3210                参数1:目标字符串位置(复制到哪里)
    3211                参数2:源字符串位置(字符串的来源)
    3212            *注:
    3213     char* str="helloworld
    ";
    3214     char str2[15];
    3215     //复制一个字符串
    3216     strcpy(str2, str);
    3217     printf("str2:%s
    ",str2);
    3218 结果:
    3219 str2:helloworld
    3220    
    3221    b.字符串的拼接strcat(参数1,参数2)
    3222           1. 将第一个字符串的内容与第二个字符串的内容拼接在一起,保存在第一个  字符串中。
    3223       *注:参数1的空间>=两个字符串内容之和
    3224     char str3[10]={'h','e','l',''};
    3225     char*str4="wor
    ";
    3226     strcat(str3, str4);
    3227     printf("str3:%s
    ",str3);
    3228 结果:
    3229 str3:helwor
    3230 
    3231       c.字符串的长度  (返回值长度)strlen(参数)
    3232  练习:求字符串的长度,不包含结束符
    3233      1.  char* str5 = "helloworld!
    ";
    3234     unsigned long length = strlen(str5);
    3235     printf("length:%lu
    ",length); 
    3236 结果:
    3237  length:12   
    3238      2.   char str5[10] = {‘h’,’e’,’l’,’0’};//   ‘’不占内存空间
    3239       unsigned long length = strlen(str5);
    3240       printf("length:%lu
    ",length);
    3241 结果:length:3
    3242 
    3243 
    3244       d.字符串的比较
    3245             比较两个字符串的内容strcmp(参数1,参数2)
    3246             1. 字符串的比较不可以使用==号,==通常比较的是两个数的值,字符串是引用数据类型,比较的是两个字符串的地址,与使用场景不符
    3247         2.标准做法:比较两个字符串中每一个字符的ASC码值,全都相同,两个字符串是相同的。
    3248               *注:结果得到的是两个字符串中ASC码的差值,若差值为0,则两个字符串相等。
    3249        char *str6 = "Heflo";
    3250     char *str7 = "HEllo";
    3251     int i = strcmp(str6, str7);
    3252     printf("i:%d
    ",i);ASC码的差值
    3253 结果:i:32
    3254 
    3255 练习:模拟登录,三次输入机会
    3256 
    3257 //输入内容
    3258     char username[20],password[20];
    3259     //模拟数据库中的数据
    3260     char* d_username = "admin";
    3261     char* d_password = "123";
    3262     int count = 0;
    3263     while (1) {
    3264         count++;
    3265         printf("请输入用户名:
    ");
    3266         scanf("%s",username);
    3267         printf("请输入密码:
    ");
    3268         scanf("%s",password);
    3269         //判断登录是否成功
    3270         if (strcmp(username, d_username)==0
    3271             &&
    3272             strcmp(password, d_password)==0
    3273             ) {
    3274             printf("登录成功!
    ");
    3275             break;
    3276         }else{
    3277             printf("用户名或密码错误!
    ");
    3278             if (count==3) {
    3279                 exit(0);//程序结束
    3280             }
    3281         }
    3282     }
    3283     printf("登录成功后...");
    3284 结果:
    3285 请输入用户名:
    3286 fcp
    3287 请输入密码:
    3288 lbm
    3289 用户名或密码错误!
    3290 请输入用户名:
    3291 admin
    3292 请输入密码:
    3293 123
    3294 登录成功!
    3295 登录成功后...
    3296 3.字符串数组
    3297 
    3298 两种形式:
    3299    1.字面值字符串数组
    3300     字面值字符串数组中的字符串是不能改变的
    3301 
    3302     //字面值字符串数组
    3303    char* str = "zhangsan";
    3304     char* str2 = "lisi";
    3305     char* strs[2] = {str,str2};
    3306     printf("strs size:%lu
    ",sizeof(strs));
    3307     //遍历字符串数组   输出strs[2]
    3308     for (int i = 0; i<2; i++) {
    3309         printf("strs[%d]:%s
    ",i,strs[i]);
    3310     }
    3311 结果:
    3312 strs size:16
    3313 strs[0]:zhangsan
    3314 strs[1]:lisi
    3315 
    3316     2.数组字符串数组
    3317     数组字符串数组中的字符串是可以改变的
    3318 //数组字符串的数组
    3319     //char str3[10] = {'z','h','a',''};
    3320     //char str4[10] = {'l','i','s',''};
    3321     char strs2[2][10]={{'z','h','a',''},{'l','i','s',''}};
    3322     printf("strs2 size:%lu
    ",sizeof(strs2));
    3323     for (int i=0; i<2; i++) {
    3324         printf("strs2[%d]:%s
    ",i,&strs2[i][0]);
    3325     }
    3326 结果:
    3327 strs2 size:20
    3328 strs2[0]:zha
    3329 strs2[1]:lis
    3330 
    3331 作业
    3332 a.所有功能在使用前一定要登录
    3333     b.先注册才能登录
    3334     c.存钱存到帐号中(只有一个帐号)
    3335     d.取钱,取帐号中的钱(减),不足,取钱失败提示。
    3336     e.查看余额
    3337     f.0退出程序 如果不退出系统,循环执行。
    3338         /==============/
    3339                     系统功能
    3340                 1.注册
    3341                 2.登录
    3342                 3.存钱
    3343                 4.取钱
    3344                 5.查看余额
    3345                 0.退出
    3346         /==============/
    3347                 请输入您要选择的功能:_
    3348 
    3349 #include <stdio.h>
    3350 #include <string.h>
    3351 void registerUser();
    3352 int isLogin();
    3353 void save();
    3354 //登录状态的标识
    3355 int flag = 0;
    3356 
    3357 //保存用户名/密码
    3358 char username[20];
    3359 char password[20];
    3360 //临时保存用户输入的内容
    3361 char inputUsername[20];
    3362 char inputPassword[20];
    3363 
    3364 void menu(){
    3365     printf("==================
    ");
    3366     printf("系统功能
    ");
    3367     printf("1.注册
    ");
    3368     printf("2.登录
    ");
    3369     printf("3.存钱
    ");
    3370     printf("4.取钱
    ");
    3371     printf("5.查看余额
    ");
    3372     printf("0.退出
    ");
    3373     printf("==================
    ");
    3374 }
    3375 
    3376 int inputNum(){
    3377     int num = 0;
    3378     printf("请输入您需要的功能(0~5):
    ");
    3379     scanf("%d",&num);
    3380     return num;
    3381 }
    3382 
    3383 void select(int num){
    3384     switch (num) {
    3385         case 1:
    3386             printf("进入注册功能
    ");
    3387             registerUser();
    3388             break;
    3389         case 2:
    3390             printf("进入登录功能
    ");
    3391             flag = isLogin();
    3392             break;
    3393         case 3:
    3394             printf("进入存钱功能
    ");
    3395             save();
    3396             break;
    3397         default:
    3398             printf("您输入的数据有误,请重新输入
    ");
    3399             break;
    3400     }
    3401 }
    3402 //向银行存钱
    3403 void save(){
    3404     //判断登录状态 登录成功才可以存钱,未登录不能存钱
    3405     if (flag) {
    3406         printf("开始存钱!...
    ");
    3407     }else{
    3408         printf("未登录,请先登录!
    ");
    3409     }
    3410 }
    3411 
    3412 //注册一个用户
    3413 void registerUser(){
    3414     printf("注册一个用户:
    ");
    3415     printf("输入一个用户名:
    ");
    3416     scanf("%s",username);
    3417     printf("输入一个密码:
    ");
    3418     scanf("%s",password);
    3419     printf("注册成功!
    ");
    3420 }
    3421 
    3422 //登录功能
    3423 int isLogin(){
    3424     printf("登录功能!
    ");
    3425     printf("输入一个用户名:
    ");
    3426     scanf("%s",inputUsername);
    3427     printf("输入一个密码:
    ");
    3428     scanf("%s",inputPassword);
    3429     //和数据库进行匹配
    3430     if (strcmp(inputUsername, username)==0
    3431         &&
    3432         strcmp(inputPassword, password)==0) {
    3433         printf("登录成功!
    ");
    3434         return 1;
    3435     }else{
    3436         printf("用户名或密码错误!
    ");
    3437         return 0;
    3438     }
    3439 }
    3440 
    3441 int main(int argc, const char * argv[])
    3442 {
    3443     //(高内聚 低耦合)->程序更灵活
    3444     while (1) {
    3445         //1.显示菜单
    3446         menu();
    3447         //2.输入选择的选项
    3448         int num = inputNum();
    3449         //3.输入不同的值,选择相应的功能
    3450         select(num);
    3451     }
    3452     return 0;
    3453 }
    3454 结果:
    3455 ==================
    3456 系统功能
    3457 1.注册
    3458 2.登录
    3459 3.存钱
    3460 4.取钱
    3461 5.查看余额
    3462 0.退出
    3463 ==================
    3464 请输入您需要的功能(0~5):
    3465 1
    3466 进入注册功能
    3467 注册一个用户:
    3468 输入一个用户名:
    3469 fcp
    3470 输入一个密码:
    3471 lbm
    3472 注册成功!
    3473 ==================
    3474 系统功能
    3475 1.注册
    3476 2.登录
    3477 3.存钱
    3478 4.取钱
    3479 5.查看余额
    3480 0.退出
    3481 ==================
    3482 请输入您需要的功能(0~5):
    3483 3
    3484 进入存钱功能
    3485 未登录,请先登录!
    3486 ==================
    3487 系统功能
    3488 1.注册
    3489 2.登录
    3490 3.存钱
    3491 4.取钱
    3492 5.查看余额
    3493 0.退出
    3494 ==================
    3495 请输入您需要的功能(0~5):
    3496 2
    3497 进入登录功能
    3498 登录功能!
    3499 输入一个用户名:
    3500 fcp
    3501 输入一个密码:
    3502 lbm
    3503 登录成功!
    3504 ==================
    3505 系统功能
    3506 1.注册
    3507 2.登录
    3508 3.存钱
    3509 4.取钱
    3510 5.查看余额
    3511 0.退出
    3512 ==================
    3513 请输入您需要的功能(0~5):
    3514 
    3515 9.字符串数组
    3516     有两种形式,字面值字符串数组,数组字符串数组。
    3517     字面值字符串数组中的字符串是不能改变的。
    3518     数组字符串数组中的字符串是可以改变的。
    3519 
    3520 作业:
    3521     a.有五虎上将,zhangfei、guanyu、huangzhong、zhaoyun、machao。
    3522         输入一个人名,判断是否是五虎上将?
    3523 #include <stdio.h>
    3524 #include <string.h>
    3525 
    3526 int main(int argc, const char * argv[]) {
    3527     char* tigger[5]={"zf","gy","hz","zhy","mc"};
    3528     char username[10];
    3529     printf("请输入一个人名!
    ");
    3530     scanf("%s",username);
    3531     for (int i=0; i<5; i++) {
    3532         if (strcmp(username,tigger[i])==0) {
    3533             printf("%s是五虎上将",username);
    3534         }
    3535     }
    3536     
    3537     return 0;
    3538 }
    3539 结果:
    3540 请输入一个人名!
    3541 gy
    3542 gy是五虎上将
    3543     b.输入三个人的姓名,并保存?
    3544 char usernames[3][20];
    3545     //输入三个人的姓名
    3546     for (int i = 0; i<3; i++) {
    3547         printf("请输入第%d个人的名字:
    ",i+1);
    3548         scanf("%s",&usernames[i][0]);
    3549     }
    3550     //输出三个人的姓名
    3551     for (int i = 0; i<3; i++) {
    3552         printf("第%d人的名字:%s
    ",i+1,&usernames[i][0]);
    3553     }
    3554 结果:
    3555 请输入第1个人的名字:
    3556 fcp
    3557 请输入第2个人的名字:
    3558 lbm
    3559 请输入第3个人的名字:
    3560 wjy
    3561 第1人的名字:fcp
    3562 第2人的名字:lbm
    3563 第3人的名字:wjy
    3564 
    3565 知识点
    3566 十八、一些计算机操作指令
    3567 
    3568 1.const关键字
    3569      1.可以把一个变量,变成常量
    3570      2. 由于指针变量相当于两个值:
    3571             指针的值  int* const p
    3572             指针指向的值 const int* p
    3573      3.  有些函数在使用内存地址是,希望内存中的数据是只读的,不需修改,就会加上const关键字
    3574     const int i=10;//将变量->常量
    3575     //i=20;
    3576     printf("i:%d
    ",i);
    3577     
    3578     int j=20;
    3579     int k=30;
    3580     int* p=&j;
    3581     //指针的值  int* const p
    3582     p=&k;
    3583     //指针指向的值 const int* p
    3584     *p=40;
    3585     printf("k:%d",k);
    3586 结果:
    3587 i:10
    3588 k:40
    3589 
    3590 
    3591 2.命令行参数
    3592 ./a.out 640*480->main()……
    3593 main(参数1:长度,参数2:值)
    3594         数组中第一个内容是命令 …
    3595 3.预处理指令
    3596 
    3597 #预编译指令
    3598    在编译之前做的事情:
    3599        例:1.导入头文件...
    3600             2.条件编译....
    3601             #ifndef    ZBS
    3602            没有条件编译此处
    3603             #else
    3604            有条件编译此处
    3605             #endif
    3606  编译:gcc main.c—DZBS
    3607             ./a.out
    3608             #ifdef SIZE //如果定义了SIZE宏条件成立
    3609         #ifndef SIZE //如果没定义SIZE宏条件成立              #if 1==1 //条件成立 #if 条件表达式或逻辑表达式
    3610 #include <stdio.h>
    3611 
    3612 int main(int argc, const char * argv[]) {
    3613     int num=0;
    3614     printf("轻点菜:");
    3615     scanf("%d",&num);
    3616 #ifndef ZBS
    3617     if (num==1) {
    3618         printf("您点的是鱼香肉丝
    ");
    3619     }else if (num==2){
    3620         printf("您点的是地三鲜
    ");
    3621  
    3622     }else {
    3623         printf("没有这个菜
    ");
    3624     
    3625     }
    3626 #else
    3627     if (num==1) {
    3628         printf("没有这个菜
    ");
    3629     }else if (num==2){
    3630         printf("没有这个菜
    ");
    3631         
    3632     }else {
    3633         printf("真没有这个菜
    ");
    3634         
    3635     }
    3636 #endif
    3637     return 0;
    3638 }
    3639 结果:gcc main.c—DZBS就执行else的代码
    3640 
    3641           3.宏…  (#define  PI …)
    3642                  1.把复杂的操作变得更简单 ,不会改变原代码
    3643                  2.宏与变量最大的区别,不占内存空间,当编译前会自动替换代码中的变量
    3644                  3.宏的值一旦确定是不可改变的
    3645 #include <stdio.h>
    3646 //#预编译指令 PI文本标识  3.1415926替换内容
    3647 //宏与变量最大的区别,不占内存空间,当编译前会自动替换代码中的变量
    3648 #define PI 3.1415926//PI宏的文本
    3649 
    3650 int main(int argc, const char * argv[]) {
    3651     //圆的面积=派*r*r;
    3652     int r=0;
    3653     printf("请输入一个半径:
    ");
    3654     scanf("%d",&r);
    3655     //printf("圆的面积为:%lf
    ",3.1415926*r*r);
    3656     printf("圆的面积为:%lf
    ",PI*r*r);
    3657     return 0;
    3658 }
    3659 结果:
    3660 请输入一个半径:
    3661 8
    3662 圆的面积为:201.061926
    3663 
    3664         4.宏可以和数组搭配使用
    3665            #define SIZE 6
    3666            int main(int argc, const char * argv[]) {
    3667     
    3668            int a[SIZE]={0};
    3669      5.宏函数
    3670  与内存空间没有关系 跟类型与没有关系
    3671         #include <stdio.h>
    3672      #define MUL(x,y)x*y
    3673      int i=10;
    3674      int j=20;
    3675      printf("i:%d*j:%d=%d",i,j,i*j);
    3676      printf("%d
    ",MUL(i,j));
    3677      printf("%d
    ",MUL(2+3,4+5));//2+3*4+5
    3678      printf("%d
    ",21/MUL(2+3,4+5));//21/2+3*4+5
    3679 结果:
    3680 i:10*j:20=200
    3681 200
    3682 19
    3683 27
    3684 
    3685 练习:
    3686 1.输入一个字母将小写->大写…
    3687 2.条件编译
    3688     iphone4 
    3689     iphone5~5s
    3690     iphone6
    3691     iphone6plus
    3692     ipad1~4
    3693     ipad mini
    3694 
    3695 知识点
    3696 十九、大型软件开发
    3697 1.多文件编程
    3698 当程序较大时,为了提高可读性,一般将程序拆分成多个文 件,每个文件负责一个功能块
    3699 2.多文件编程的操作步骤
    3700 多人开发  将原文件拆分成三个文件,分别为*.h、*.c、 main.c
    3701 例:输入一个数并输出
    3702     1.输入功能拆分放到两个文件中
    3703            .h函数的声明
    3704            .c函数的定义
    3705     2.使用前必须导入头文件
    3706     3.编译的时候,必须连接
    3707           系统的函数库已经默认与程序连接到了一起
    3708                连接:将多个文件的的目标文件合在一起,就是连接
    3709                    gcc -c input.c 目标文件->*.o
    3710                           如: gcc -c  input.c转成input.o
    3711                    gcc 目标文件1 目标文件2....->a.out
    3712                             如:gcc  input.o  main.o——>./a.out——-得到编译结果
    3713 ’           总:1.只有.h 和.o别人可以使用你的函数了,但无法得到源代码。闭源
    3714                    2 .h 和.c别人可以使用你的函数了,并且知道你是如何实现的。开源
    3715 3.在多文件开发中
    3716        .h文件中 ,主要放的是函数声明、宏,但不能放变量的声明,一切与内存有关的操作都不可以
    3717        .c文件中,主要放程序源代码,变量的声明、函数的定义..
    3718                全局变量只能放在.c文件中
    3719                      **如果想使用其他文件中的全局变量必须使用extern关键字修饰。
    3720                                extern  int  array;
    3721                      **使用static修饰全局变量,该全局变量只能在当前文件中使用(私有)
    3722                            static不但可以修饰全局变量,还可以修饰函数
    3723 4.批处理命令:make
    3724 
    3725 知识点
    3726 二十、结构体
    3727 
    3728 • 结构体语法格式   
    3729 1.struct{  
    3730       成员;       
    3731    }变量名;  
    3732 2.typedef  struct  {  //常用格式
      int  age;//成员                
    3733       char  name[20];  
    3734    }Student2;//别名 
    3735 例: (标准定义)
    3736   //给类型(定义)起名字
    3737     typedef struct {
    3738         int age;//成员
    3739         char sex;
    3740     }NewPerson2;//新名字 //变量名
    3741     NewPerson2 person5 = {22,'F'};
    3742     //结构体如果声明在函数的外部,所有函数都可以使用
    3743     NewPerson2 person6 = {23,'M'};
    3744     printf("age5:%d sex5:%c
    ",person5.age,person5.sex);//取值
    3745     printf("age6:%d sex6:%c
    ",person6.age,person6.sex);//取值
    3746 结果:
    3747 age5:22 sex5:F
    3748 age6:23 sex6:M
    3749 
    3750 
    3751 *结构体其他表示方法
    3752  一、//数据结构 人的信息(年龄,性别)
    3753     struct{
    3754         int age;//成员
    3755         char sex;
    3756     }person1,person2={19,'F'};//变量名
    3757     person1.age = 18;//赋值
    3758     person1.sex = 'M';
    3759     printf("age:%d sex:%c
    ",person1.age,person1.sex);//取值
    3760     printf("age2:%d sex2:%c
    ",person2.age,person2.sex);//取值
    3761     //int i
    3762     //i = 10;
    3763     //int i = 10;
    3764     //给结构起个名字 struct Person == int
    3765  二、   struct Person{
    3766         int age;
    3767         char sex;
    3768     };
    3769     
    3770     //struct Person person3 = {20,'M'};
    3771     struct Person person3;
    3772     person3.age = 21;
    3773     person3.sex = 'F';
    3774     printf("age3:%d sex3:%c
    ",person3.age,person3.sex);//取值
    3775     
    3776 三、    //给类型起名字 typedef 原来的名字 新名字
    3777     typedef struct Person NewPerson;
    3778     NewPerson person4 = {22,'M'};
    3779     printf("age4:%d sex4:%c
    ",person4.age,person4.sex);//取值
    3780 
    3781 结果:
    3782 age:18 sex:M
    3783 age2:19 sex2:F
    3784 age3:21 sex3:F
    3785 age4:22 sex4:M
    3786 
    3787 2.结构体所占内存空
    3788 
    3789    //结构体所占内存空
    3790     typedef struct{
    3791         char ch;//1
    3792         short i;//2
    3793     } Stu;
    3794     printf("Stu size:%ld
    ",sizeof(Stu));
    3795 结果:
    3796 Stu size:4
    3797 
    3798 作业:
    3799 练习:创建四个学生信息(学号、姓名、性别、年龄),所有的信息要使用键盘输入并保存。
    3800 typedef struct{
    3801         int num;
    3802         char name[10];//保存字符串的内容
    3803         //char *cp;//保存字符串的地址
    3804         char sex;
    3805         int age;
    3806     } Student;
    3807         Student stus[4];
    3808     for (int i = 0; i<4; i++) {
    3809         printf("请输入学号:
    ");
    3810         scanf("%d",&stus[i].num);
    3811         printf("请输入姓名:
    ");
    3812         scanf("%s",stus[i].name);
    3813         scanf("%*c");
    3814         printf("请输入性别:
    ");
    3815         scanf("%c",&stus[i].sex);
    3816         printf("请输入年龄:
    ");
    3817         scanf("%d",&stus[i].age);
    3818     }
    3819     
    3820     for (int i = 0; i<4; i++) {
    3821         printf("学号:%d
    ",stus[i].num);
    3822         printf("姓名:%s
    ",stus[i].name);
    3823         printf("性别:%c
    ",stus[i].sex);
    3824         printf("年龄:%d
    ",stus[i].age);
    3825     }
    3826 
    3827 知识点
    3828 二十一、联合、枚举
    3829 
    3830 一、联合
    3831    1. 联合的用法、语法和结构非常相似,但联合中所有成员分配 的内存是同一块。(只能保存一个 成员信息,联合的空间以 最大成员所占的空间为值)    
    3832    2. 联合可以用一块内存对应多种数据类型  
   3. 联合与结构的区别,结构可以保存多个成员信息,而联合只能保存一个成员信息且最后一个
    3833 
    3834 #include <stdio.h>
    3835 
    3836 typedef union{ //联合语法格式
    3837     int i;
    3838     char ch;
    3839     
    3840 }LianHe;
    3841 
    3842 int main(int argc, const char * argv[])
    3843 {
    3844     printf("LianHe:%ld
    ",sizeof(LianHe));
    3845     LianHe lh;
    3846     lh.i=10;
    3847     printf("i:%d
    ",lh.i);
    3848     lh.ch='a';
    3849     printf("ch:%c
    ",lh.ch);
    3850     printf("i:%d
    ",lh.i); 
    3851    
    3852     return 0;
    3853 }
    3854 结果:
    3855 LianHe:4
    3856 i:10
    3857 ch:a
    3858 i:97
    3859 
    3860 二、枚举
    3861 
    3862  1.语法格式:
    3863 //定义一个枚举
    3864 enum{MON,TUE,WEN};
    3865 3866 //typedef 类型名字  新名字
    3867 typedef enum{  //常用类型
    3868    MON,TUE,WEN
    3869 }week;
    3870 
    3871 2.在声明的时候修改枚举值
    3872 //如果需要修改枚举值 只能在声明的时候修改
    3873 //后面的元素=前面的元素+1
    3874   1. typedef enum{
    3875      MON=1,TUE,WEN
    3876    }week;
    3877 结果:
    3878 MON:1
    3879 TUE:2
    3880 WEN:3
    3881   2. typedef enum{
    3882      MON,TUE=2,WEN
    3883    }week;
    3884 结果:
    3885 MON:0
    3886 TUE:2
    3887 WEN:3
    3888 
    3889 3.typedef enum{false,true} bool;
    3890     bool b1 = false;
    3891     printf("b1:%d
    ",b1);
    3892 结果:0
    3893 
    3894 练习:
    3895 #include <stdio.h>
    3896 
    3897 //定义一个枚举
    3898 //enum{MON,TUE,WEN};
    3899 
    3900 //typedef 类型名字  新名字
    3901 //如果需要修改枚举值 只能在声明的时候修改
    3902 //后面的元素=前面的元素+1
    3903 typedef enum{
    3904    MON=1,TUE,WEN
    3905 }week;
    3906 
    3907 void take(week i){
    3908     switch (i) {
    3909         case MON:
    3910             printf("星期一:要去交水费
    ");
    3911             break;
    3912         case TUE:
    3913             printf("星期二:要去交电费
    ");
    3914             break;
    3915         case WEN:
    3916             printf("星期三:要去交煤气费
    ");
    3917             break;
    3918         default:
    3919             break;
    3920     }
    3921 }
    3922 
    3923 int main(int argc, const char * argv[])
    3924 {
    3925     printf("MON:%d
    ",MON);
    3926     printf("TUE:%d
    ",TUE);
    3927     printf("WEN:%d
    ",WEN);
    3928     
    3929     int week=0;
    3930     printf("请选择今天星期几:
    ");
    3931     printf("1.星期一
    ");
    3932     printf("2.星期二
    ");
    3933     printf("3.星期三
    ");
    3934     
    3935     scanf("%d",&week);
    3936     take(week);
    3937     return 0;
    3938 }
    3939 结果:
    3940 MON:1
    3941 TUE:2
    3942 WEN:3
    3943 请选择今天星期几:
    3944 1.星期一
    3945 2.星期二
    3946 3.星期三
    3947 1
    3948 星期一:要去交水费
    3949 
    3950 练习
    3951 输入一个整数,求春夏秋冬    
    3952        用户从控制台输入一个整数,由程序判断该整数是春 夏秋冬哪个季节。春夏秋冬分别用一个枚举常量表示
    3953 #include <stdio.h>
    3954 
    3955 typedef enum{
    3956     SPRING,SUMMER,AUTUMN,WINTER
    3957 }Season;
    3958 
    3959 void func(int num){
    3960     switch (num%4) {
    3961         case SPRING:
    3962             printf("春天来了!
    ");
    3963             break;
    3964         case SUMMER:
    3965             printf("夏天来了!
    ");
    3966             break;
    3967         case AUTUMN:
    3968             printf("秋天来了!
    ");
    3969             break;
    3970         case WINTER:
    3971             printf("冬天来了!
    ");
    3972             break;
    3973             
    3974         default:
    3975             break;
    3976     }
    3977     
    3978     
    3979 }
    3980 
    3981 int main(int argc, const char * argv[])
    3982 {   int num=0;
    3983     printf("请输入任意一个整数数字:");
    3984     scanf("%d",&num);
    3985     func(num);
    3986 结果:
    3987 请输入任意一个整数数字:897231
    3988 冬天来了!
    3989 
    3990 知识点
    3991 二十二、高级指针
    3992 
    3993 一.双指针(二级指针)
    3994 #include <stdio.h>
    3995 void change(int j){//值传递
    3996     j = 20;
    3997     printf("j:%d
    ",j);
    3998 }
    3999 void change2(int* p){//地址传递
    4000     *p = 20;
    4001     printf("*p:%d
    ",*p);
    4002 }
    4003 /*
    4004 char** change3(){
    4005     char* str = "Hello";
    4006     return &str;
    4007 }
    4008  */
    4009 void change4(char** p){
    4010     *p = "Hello";
    4011 }
    4012 int main(int argc, const char * argv[])
    4013 {
    4014     int i = 10;
    4015     //change(i);
    4016     change2(&i);
    4017     printf("i:%d
    ",i);
    4018     char *p;//保存一个字符串的位置
    4019     change4(&p);
    4020     printf("p:%s
    ",p);
    4021     return 0;
    4022 }
    4023 结果:
    4024 *p:20
    4025 i:20
    4026 p:Hello
    4027 
    4028 二、void指针
    4029 
    4030 1.任意类型的指针
    4031 2.malloc分配堆内存时,由于无法确定内存存储类型,所以可 以使用void*代表任意指针类型
    4032 #include <stdio.h>
    4033 typedef enum{INT,CHAR,FLOAT,DOUBLE} type;
    4034 void output(void* p,type t){
    4035     switch (t) {
    4036         case INT:
    4037             //char c = (char)200;//类型转换
    4038             printf("%d
    ",*((int*)p));
    4039             break;
    4040         case CHAR:
    4041             printf("%c
    ",*(char*)p);
    4042             break;
    4043         case FLOAT:
    4044             //char c = (char)200;//类型转换
    4045             printf("%f
    ",*((float*)p));
    4046             break;
    4047         case DOUBLE:
    4048             printf("%lf
    ",*(double*)p);
    4049             break;
    4050     }
    4051 }
    4052 int main(int argc, const char * argv[])
    4053 {
    4054     int i = 10;
    4055     output(&i,INT);
    4056     char c = 'a';
    4057     float f = 10.1f;
    4058     double d = 20.1;
    4059     output(&f,FLOAT);
    4060     return 0;
    4061 }
    4062 结果:
    4063 10
    4064 10.100000
    4065 
    4066 三、函数指针
    4067 #include <stdio.h>
    4068 //1.返回值类型
    4069  void func(){
    4070   printf("Hello, World!
    ");
    4071 }
    4072 //2.
    4073 int func2(){
    4074     return 10;
    4075     
    4076 }
    4077 //3.
    4078 int func3(){
    4079     return 1;
    4080     
    4081 }
    4082 int main(int argc, const char * argv[])
    4083 {    printf("%p
    ",&func);
    4084      printf("%p
    ",func);
    4085     //函数指针变量*funcp 保存函数指针 func
    4086  //1.返回值类型....参数...
    4087     void(*funcp)()=func;//调用没有括号func
    4088     funcp();
    4089  //2.
    4090     int(*funcp2)()=func2;
    4091     int i=funcp2();
    4092     printf("i:%d
    ",i);
    4093  //3.
    4094     int(*funcp3)(int)=func3;
    4095     int i2=funcp3(5);
    4096     printf("i2:%d
    ",i2);
    4097 
    4098     
    4099     return 0;
    4100 }
    4101 结果:
    4102 0x100000e40
    4103 0x100000e40
    4104 Hello, World!
    4105 i:10
    4106 i2:1
    4107 
    4108 四、对内存管理
    4109 
    4110    1.malloc函数
    4111            a.导入头文件
    4112             #include <stdlib.h>
    4113            b.分配一个堆内存的空间,可以根据参数大小分配相应内存空间
    4114                  空间的首地址  malloc(空间大小)
    4115                      语法:void*malloc4);//字节
    4116             c.分配变量
    4117             int  *p;   p  =  (int*)malloc(sizeof(int));
    4118 练习:
    4119 #include <stdio.h>
    4120 #include <stdlib.h>
    4121 int main(int argc, const char * argv[])
    4122 {   //输入三个数并输出
    4123     int a[3]={0};//
    4124     printf("a address:%p
    ",a);
    4125     //开辟堆空间 void*malloc(size_t)
    4126     //堆内存的分配不一定成功
    4127     //如果成功则得到一个地址,如果不成功得到NULL
    4128     int*p;//分配变量
    4129     p=(int*)malloc(sizeof(int)*3);//语法格式
    4130     if (p!=NULL) {
    4131         //使用前做类型转换
    4132         printf("p address:%p
    ",p);
    4133         for (int i=0; i<3; i++) {
    4134             printf("请输入%d第个数:",i+1);
    4135             //scanf("%d",&a[i]);
    4136             scanf("%d",(p+i));
    4137         }
    4138         
    4139         //输出函数
    4140         for (int i=0; i<3; i++) {
    4141             //printf("第%d个数为:%d
    ",i+1,a[i]);
    4142             printf("第%d个数为:%d
    ",i+1,*(p+i));
    4143         }
    4144     }
    4145     else{
    4146         printf("分配内存失败");
    4147         
    4148     }
    4149     return 0;
    4150 }
    4151 结果:
    4152 a address:0x7fff5fbff83c
    4153 p address:0x100103b10
    4154 请输入1第个数:3
    4155 请输入2第个数:5
    4156 请输入3第个数:6
    4157 第1个数为:3
    4158 第2个数为:5
    4159 第3个数为:6
    4160            
    4161    2.calloc函数
    4162          a.分配一个堆内存空间
    4163          b.#include <stdlib.h>
    4164     c.空间的首地址 calloc(元素的个数,元素的大小)
    4165                    语法:void*calloc4,size(int));
    4166    calloc与malloc的区别是,不但分配内存空间,而且还会将分配到的内存空间清0
    4167 //开辟堆空间 void*calloc(size_t,size_t)
    4168 //参数1 元素的个数 参数2 元素的类型
    4169 int*p;//分配变量
    4170     p=(int*)calloc(3,sizeof(int));
    4171 以上输入输出函数程序只改变此句,结果不变
    4172 
    4173   3.realloc函数
    4174          调整一个内存空间,存在两种情况,如果原来的位置可以调整,则首地址不变。如果原来的位置不可以调整,创建一个新的内存空间,并将原来数据自动复制过来,将原来的内存自动销毁,返回新的内存的首地址。调整内存空间也可能有风险,即创建不成功。
    4175       a.空间的首地址 realloc(原来首地址,调整后的空间大小)
    4176               void* realloc(p,sizeof(int)*5);
    4177       b.调整内存空间也不一定成功,所以尽量创建一个新的变量来保存。
    4178 #include <stdio.h>
    4179 #include <stdlib.h>
    4180 int main(int argc, const char * argv[])
    4181 {
    4182     //输入三个数,保存并输出
    4183     int array[3]={0};//
    4184     printf("array address:%p
    ",array);
    4185     //开辟堆空间 void* calloc(size_t,size_t)
    4186     //叁数1 元素的个数 参数2 元素的类型
    4187     //堆内存分配不一定成功
    4188     //如果成功则得到一个地址,如果不成功得到NULL
    4189     int* p = (int*)malloc(sizeof(int)*3);
    4190     printf("p address:%p
    ",p);
    4191     //调整内存空间 参数1 原来空间的首地址 参数2 调整后的大小
    4192     int* p2=(int*)realloc(p,sizeof(int)*4);
    4193     printf("p2 address:%p
    ",p2);
    4194     if (p2!=NULL) {//分配内存成功
    4195         p = p2;//分配成功后,如果得到新的地址,会自动将原来的销毁。
    4196         printf("p address:%p
    ",p);
    4197         //使用前做类型转换
    4198         for (int i = 0; i<4; i++) {
    4199             printf("请输入第%d个数:
    ",i+1);
    4200             //scanf("%d",&array[i]);
    4201             scanf("%d",(p+i));
    4202         }
    4203         for (int i = 0; i<4; i++) {
    4204             printf("第%d个数:%d
    ",i+1,*(p+i));
    4205         }
    4206     }else{
    4207         printf("分配内存失败!
    ");
    4208     }
    4209     free(p);//释堆空间
    4210     //野指针:一个指针指向一个不合法区域
    4211     p = NULL;//空指针 用来解决野指针
    4212     //在OC访问一个空指针是合法并且不会报错
    4213     //printf("p->value:%d
    ",*p);
    4214     //printf("p address:%p
    ",p);
    4215     return 0;
    4216 }
    4217 结果:
    4218 array address:0x7fff5fbff82c
    4219 p address:0x100103b10
    4220 p2 address:0x100103b10
    4221 p address:0x100103b10
    4222 请输入第1个数:
    4223 6
    4224 请输入第2个数:
    4225 4
    4226 请输入第3个数:
    4227 3
    4228 请输入第4个数:
    4229 4
    4230 第1个数:6
    4231 第2个数:4
    4232 第3个数:3
    4233 第4个数:4
    4234 
    4235   4.free函数
    4236        可以将堆空间销毁掉(释放)
    4237           free(堆空间首地址);
    4238     销毁堆空间时,指针变量依然是有值的,但是指向了一个不合法的内存区域,野指针。当程序对野指针进行操作是不合法的,会报错的。标准的做法,将野指针赋NULL值,变成空指针。在OC当中,就可避免操作问题,并且不会报错。
    4239  
  • 相关阅读:
    MySQL的B+树索引底层构成
    Mybatis 使用注解和Provider类实现动态条件查询
    EF批量插入数据耗时对比
    NOPI Excel 读取公式生成后的数据
    EF 记录执行的sql语句
    c# Redis操作类
    c# ExpandoObject动态扩展对象
    微信小程序干货
    mysql中将多行数据合并成一行数据
    Flask 学习系列(四)---Jinjia2 模板继承
  • 原文地址:https://www.cnblogs.com/52190112cn/p/5063103.html
Copyright © 2020-2023  润新知