大一C语言学习记录-1
正在学习C语言中…编程前须知今天懒得写了第一个程序求下落位移#includestdio.hintmain(){inth,t,g10;doubles;scanf(%d%d,h,t);sg*t*t/2;if(sh)printf(%.1f\n,s);elseprintf(%d\n,h);return0;}新知1.main()里面可以空白也可以写void2.控制输出小数位printf(“%.nf”,variable); n代表要求输出n位小数且会四舍五入而非直接截断易错1.scanf后面修改变量值必须加取变量运算符“”2.if后面条件要在()里3.每一条语句后面都要有分号4.如果ifelseforwhile等后面的body只有一行可以不用{}否则必须有且这些所在的那一行不能写分号5.区分整数除法与浮点除法只要被除数与除数之中一个是浮点数就采用浮点除法注意下面第二个是大坑它是先按整数除法得到1再转为浮点数1.0位数没关系只要有小数点就是浮点数doubleint sum9double avg sum / 2.0;等价于double avg (double)sum / 2;inta9/5;// 1 整数除法余数 4 被丢掉doubleb9/5;// 1.0 ⚠️ 先算 9/51再转成 doubledoublec9/5.0;// 1.8 浮点除法doubled9.0/5;// 1.8 浮点除法第二个程序海伦公式求三角形面积#includestdio.h#includemath.hintmain(){charagain;do{doublea,b,c,p,s;printf(输入三边长\n);scanf(%lf%lf%lf,a,b,c);if(abcacbbcaa0b0c0){p(abc)/2.0;ssqrt(p*(p-a)*(p-b)*(p-c));printf(面积为%f\n,s);}else{printf(不能组成三角形\n);}printf(还要继续吗回复y/n\n);scanf( %c,again);}while(againy||againY);return0;}新知1.stdio.h库中常用函数有printfscanfgetcharputchar等math.h中库有sin,cos,tan,asin,acos,atan,exp,log,log10,pow,sqrt,cbrt等2.char定义的是字符数据类型本质上是字符依据ASCⅡ对应的那个整数一个变量只能储存单个字符内存一个byte赋值形似char c ‘Y’;。注意此处是单引号单引号是字符本质是一个整数双引号是字符串本质是指向那一串字符的地址。char对应的格式符可以是%c字符或%dint字符串对应的格式符是%s3.定义数组如 char array[10];里面的数字指的是数据个数可以给其赋值字符串字符串就是以’\0’结尾的字符串数组比如上述array[10]数组就可以记录9个字符最后一个留给’\0’如abc‘a’,‘b’,‘c’,‘\0’数组是一段连续空间下标从0开始如声明int a[5]下标只有012344.字符串字面量就是写在源码里的那个量比如abc,经编译后变为以’\0’结尾的字符数组即字符串。5.逻辑运算符逻辑与逻辑或||逻辑非!任何非0的数的返回结果都是1真0的返回结果是0假如int a5 if(a){}就会正常执行因为a!0返回结果就是1优先级! 算术运算 关系运算(, , ) || 赋值()和||都有短路特性只要左边能确定结果右边就不会执行0任意东西都为假inti0;intr0i;// 左边 0 是假 → 右边 i 不执行 → i 还是 0ints1||i;// 左边 1 是真 → 右边 i 不执行 → i 还是 0易错1.字符数组中’\0’也占一个位置这很容易忘记导致越界2.注意写\n保证美观3.%c 会读取空白字符包括空格、换行、Tab常需在 %c 前加空格如 %c 来跳过前导空白。此段代码即是如此用户输入三个边长后会按\n来推进程序而这个\n会保留在缓存区后续%c一读取就读到了\n ! ‘y’||‘Y’故程序会直接结束4.%s 遇到空白就停且不会检查数组越界建议用宽度限制如 %19s补充记录循环for循环适用于次数已知的循环for(初始化 ; 判断条件 ; 更新表达式){循环体}执行顺序初始化→判断条件→循环体→更新表达式→判断条件→…三个位置不能交换各有职责// 三部分都可以省略但分号不能省for (;; ) // 死循环for (; i 5;) // 省略初始化和更新for (i 0; ; i) // 省略条件等于死循环可以把更新表达式写在循环体里但是可读性差while循环适用于次数未知靠条件控制的循环while条件{循环体}先判断条件为真才执行循环体。可能一次都不执行⚠️记得在循环体里更新否则会形成死循环do-while循环适用于至少执行一次的场景do{循环体}while条件\⚠️注意这里需要加分号先执行一次循环体再判断条件。至少执行一次break和continuebreak立即跳出整个循环for(inti0;i10;i){if(i5)break;// i 到 5 时直接结束循环printf(%d ,i);// 0 1 2 3 4}continue跳过本次进入下一次for(inti0;i10;i){if(i%20)continue;// 偶数跳过printf(%d ,i);// 1 3 5 7 9}注意continue 在 while 里要小心死循环inti0;while(i5){if(i2)continue;// ⚠️ i 没机会自增永远停在 2 → 死循环i;}然而在 for 里没这个问题因为 i 是循环语法的一部分continue 后仍会执行缓冲区键盘输入的字符不会立刻被程序读到而是先进输入缓冲区等 scanf、getchar 来取若输入3.14 2.71 1.41\n缓冲区[3][.][1][4][ ][2][.][7][1][ ][1][.][4][1][\n]scanf(“%lf%lf%lf”,…) 按格式一点点读走 3.14、2.71、1.41但换行 \n 留下了。于是下一个 scanf(“%c”, …) 就把这个残留的 \n 读走了——这就是为什么要在%c前面加一个空格来跳过空白符核心结论scanf 按格式读多余的字符会留在缓冲区污染后面的读取。返回值几乎所有函数都有返回值除了返回void的函数scanf返回值是成功读取的变量个数失败返回EOF藉此可以判断是否正确读取getchar返回值是读到的字符int值失败返回EOF数学运算返回值就是运算结果值零零散散的知识i 等价于i 1放在for循环里就可以说1是它的步长
上一篇/下一篇内容由系统自动关联
返回资讯列表 →