目录:
流程控制:
空语句
if注意
强制转换
判断浮点数x是否为零
自增
break 和 continue
数组:
为什么需要数组
数组分类
一维数组
二维数组
多维数组
小练习代码:
判断一个数是否是素数
判断一个数字是否是回文数
编程实现求一个十进制数字的二进制形式
求一个数字的每位是奇数的数字取出来组合成的新数字
求一个数字倒过来的数字
费波纳茨序列 (空白符):又叫制表符,换行符,在scanf 用空格
内容
空语句:
if(1 > 2) ; //分号加在此,空语句后面的语句和if没有关系
if注意:
即便表达式1和2的语句都成立,也只会执行表达式1符合的语句。
esle 后面没有表达式,若有表达式必须+if
强制类型转换:
(数据类型)(表达式)
功能:把表达式的值强制转化为前面所执行的数据类型
例如:
(int)(4.5+2.2) //最终值是 6(float)(5) // 最终值是 5.000000
注意:
int i ;float sum;sum = sum + 1.0 i; 推荐使用//也可以这样写sum = sum + 1 / (float)(i) ;
浮点数的存储所带来的问题:
float 和 double 都不能保证可以精确的存储一个小数。
注意:有一个浮点型变量x,如何判断x的值是否是零。
if(|x-0.000001| <= 0.000001)是else不是
为什么会出现自增
代码更加精炼
自增的速度更快
学习自增要明白的几个问题
编程时应该尽量屏蔽掉前自增和后自增的差别
i++和++i单独成一个语句,不要把它作为一个完成复合语句的一部分来使用。
break 和 continue
break如果用于循环是用于终止循环
break如果用于switch,则是用于终止switch
break只能终止距离最近的循环(for或者switch)
break不能直接用于if,除非if属于循环内部的一个子句
for(i = 0; i < 3; ++i){if (3 > 2)break; //break虽然是if内部的语句,但break终止的是外内的for循环printf("嘿嘿!");}
continue
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
数组:为了解决大量同类型数据的存储和使用问题,为了模拟现实世界
一维数组:为n个变量连续分配内存空间,所有变量的数据类型必须相同,所有变量所占的字节大小必须相等。
int a[5] = {1,2,3,4,5}; //完全初始化int a[5] = {1,2,3}; // 不完全初始化,未被初始化的元素自动为零int a[5]; // 不初始化,所有元素的垃圾值int a[5]={0}; // 清零// a单独时代表数组第一个元素的地址,每个元素时是单独的变量
注意:
只有在定义数组的同时才可以整体赋值,其它情况下整体赋值都是错误的。
如果要把a数组中的值全部复制给b数组,使用for循环一个一个的复制
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main(void){int a[5];int i;scanf("%d", &a[0]);printf("a[0] = %d\n", a[0]);scanf("%d", &a[3]);printf("a[3] = %d\n", a[3]);//输出全部for (i = 0; i < 5; i++){printf("数组a[%d]的值是%d\n", i, a[i]);}return 0;}
练习:
把一个数组元素给全部倒过来
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main(void){int a[7] = { 1,2,3,4,5,6,7 };int i, j, t;i = 0;j = 6;while (i < j){t = a[i];a[i] = a[j];a[j] = t;i++;j--;}for (int j = 0; j < 7; j++) {printf("a[%d]的值是%d\n", j, a[j]);}return 0;}
二位数组:
int a[3][4];
总共是12个元素,可以当作3行4列看待,这12个元素的名称依次是
a[0][0] ,a[0][1],a[0][2],a[0][3]a[1][0] ............a[i][j] // 表示 i+1 行,j+1 列int a[m][n]; // 该二维数组右下角位置的元素只能是a[m-1][n-1]
二维数组初始化
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};int a[3][4] ={{1, 2, 3, 4},{5, 6, 7, 8},{9,10,11,12}};
二维数组的输出
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main(void){int a[3][4] ={{1, 2, 3, 4},{5, 6, 7, 8},{9,10,11,12}};for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++){printf("%-5d",a[i][j]);//-5d意思是 -代表左对齐,5代表每个元素五个位置}printf("\n");}return 0;}
是否存在多维数组:
不存在
因为内存是线性一维的
n维数组可以当作每个元素是n-1维数组的一维数组
int a[3][4];//该数组是含有3个元素的一维数组,只不过每个元素都可以再分成4个小元素int a[3][4][5];//该数组是含有3个元素的一维数组// 只不过每个元素都是4行5列的二维数组
1,判断素数;
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>/** 判断素数:素数是除了能被1和自身整除,不能被其它数整除的数*/int main(void){int n;// 存储素数printf("请输入你要判断的数:");scanf("%d", &n);for (int i = 2; i < n ; i++){if (n % i == 0)//代表整数可以被i整除,没有余数,则不是素数{printf("%d不是素数\n", n);break; //只要有一个证明就跳出for循环}else{if (i == n - 1){printf("%d是素数\n", n);}continue;}}return 0;}
2,判断回文数
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>/** 回文数数字正着和倒着结果相同* 例如:12321持续输入循环回文数输出yes非 NO*/int main(void){int val; //存放回文数int sum=0;int m;while (1) //不断循环{printf("请输入你要判断的数:");scanf("%d", &val);m = val;while (m){sum = sum * 10 + m % 10;m = m 10;}if (sum == val) //是回文数printf("Yes\n");elseprintf("No\n");system("pause"); // 暂停输入结果system("cls"); // 清空cmd}return 0;}
3.1,十进制转二进制
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>/** 将十进制转化为二进制* 两种方式* 1,使用数组存储实现倒序*,2,使用函数递归实现倒序*/int main(void){int n;int i = 0;printf("请输入你要转换成二进制的数:");scanf("%d", &n);int m[20];do{m[i] = n % 2; //余数printf("%d\n", m[i]);n = n / 2;i++;} while (0 != n);//倒序输出数组for (int j = i - 1; j >= 0; j--){printf("%2d", m[j]);}printf("\n");return 0;}
3.2,通过函数递归的方式实现进制转换:
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>/** 将十进制转化为二进制* 两种方式* 1,使用数组存储实现倒序*,2,使用函数递归实现倒序*/void to_binary(int m){int i,j;i = m / 2;j = m % 2;if (i != 0){to_binary(i);}printf("%d", j);}int main(void){int n;int i = 0;printf("请输入你要转换成二进制的数:");scanf("%d", &n);to_binary(n);printf("\n");return 0;}
6,费波纳茨序列
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>/** 费波纳茨序列* 1 2 3 5 8 13 21 34* 除了前两项,其余都是前面两项之和*/int main(void){int n; //输出第几项的费波纳茨序列int f1, f2, f3;char ch ;do{f1 = 1;f2 = 2;f3 = 3;printf("请输入你要查找的费波纳茨序列:");scanf("%d", &n);if (1 == n)printf("%d\n", f1);else if (2 == n)printf("%d\n",f2);else{for (int i = 3; i <= n; i++){f3 = f1 + f2;f1 = f2;f2 = f3;}printf("第%d项的费波纳茨序列是%d\n", n, f3);}//system("pause");printf("你想终止循环吗?Y/N:");scanf(" %c", &ch); // %c前必须加空格,空格符,制表符,换行符,统称为空白符//system("cls");}while ('Y' == ch || 'y' == ch );return 0;}




