廉旭讲课C语言.docx
- 文档编号:27488419
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:21
- 大小:721.37KB
廉旭讲课C语言.docx
《廉旭讲课C语言.docx》由会员分享,可在线阅读,更多相关《廉旭讲课C语言.docx(21页珍藏版)》请在冰豆网上搜索。
廉旭讲课C语言
提前说明:
1、感谢李老师,感谢大家给我这个机会。
2、本节所有程序在vs2010下C#语言测试通过。
3、我用C的原因只是因为它是强类型语言,更容易找错。
其实,很多时候basic会更好用。
4、为了尽量排除界面的影响,所以所有程序都在控制台测试。
5、关于输出:
basic下用print,c语言用printf。
由于今天在vs2010下,所以输出全部用Console.Write();和Console.WriteLine();如果您用winform调试完全可以使用textbox或者label代替。
6、本节用的很多东西尤其是类似于概念性的东西都是源于XX。
7、本次课如有错误和不妥之处,请多多指教,谢谢!
1、运算符与优先级
C运算符
Basic运算符
名称
结合方向
说明
[]
()
.
->
[]
()
.
数组下标,
圆括号,
对象,
指针
1
-
(类型)
++
--
*
&
!
~
sizeof
-
Not
负号
强制类型转换自增
自减
取值
取地址
逻辑非
按位取反
长度运算符
右到左
2除(类型)和sizeof操作外均是单目运算符
单目运算
/
*
%
/
*
mod
除
乘
取余数
3算术
+
-
+
-
加
减
<<
>>
左移
右移
4移位
>
>=
<
<=
>
>=
<
<=
关系运算符
5关系
==
!
=
=
<>
关系运算符
&
&(字符串连接连接)
按位与
6位逻辑
^
^(乘方)
按位异或
|
按位或
&&
And
逻辑与
7逻辑
||
Or
逻辑或
?
:
条件运算符
右到左
8三目
=
/=
*=
%=
+=
-=
<<=
>>=
&=
^=
|=
=
赋值与复合赋值运算符(算术,移位,按位操作的)
右到左
9赋值
逗号运算符
10左到右顺序运算
Like
字符串匹配
Is
对象引用比较
2、常用基本变量类型
Basic关键字
C关键字
含义
取值范围
Integer
Int
整形
16位-32768~32767(现在已经32位)
Single
float
浮点,单精度
取值范围根据编译器和操作系统、开发环境的不同会有变化
double
double
双精度
string
Char*(c#为string)
字符,字符串
boolean
C没有bool(c#Bool)
逻辑型
Byte
Unsignedchar(c#有byte)
字节型
随着技术的发展,数据类型已经无法计算,任何人都可以在自己的程序中定义和使用自己的类型。
我个人觉得程序就是用计算机能识别的方式描述人的思维过程。
所以所谓的写程序就是把咱们的想法,用电脑描述出来。
3、计算素数
、何为素数:
质数又称素数。
指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数(不包括0)整除的数。
、判断一个数是不是素数的计算过程:
用这个数(n)分别除以2,3,4,……n-1(这里不能是n,不然就不对了),如果全都不能整除,那么这个数就是素数。
换句话说,如果碰到一个能整除的,那么这个数就不是素数。
编程语言描述上面一句话大概就是:
If(n%(2,3,4,……n-1)有一个==0),则n不是素数。
括号中的n必须用个变量来代替,那么就变成了一个循环。
如果数字有很多呢?
我们就把前面那个放到一个循环中。
并且还要想办法把数据记录下来,用来显示。
具体程序如下:
所有程序的主函数调用都与如下代码类似:
运行结果如下:
大家如果上网查资料,第二个for循环的条件多半是j 因为那样非但不能提高系统运行效率,减少循环次数,而且由于有了附加的运算,还会使程序运行效率更低。 思考1: 如果我想根据用户输入情况判断用户输入的数字是不是素数怎么办呢? 思考2: 如果想要先显示素数的个数,然后再显示所有数字怎么操作呢? 解决方法至少2种: 把程序运行两遍,第一遍用来计算数量,第二遍用来输出所有数字; 利用数组,把所有数字存储到数组中,然后统一显示。 思考3: 如果要计算的是一个非常大的范围,那么这个程序运行将会是非常慢的,有没有更好的办法呢? 4、输入一个字符组成的菱形图案,输出结果如下: 、程序分析 先来分析一下这个图。 这个图,一共有9行,第一行是4个空格,一个*,第二行是3个空格一个*,然后一个空格,一个*。 到第5行的时候是0个空格,一个*,7个空格,一个*。 图的上下两部分明显是有规律可循的,所以可以用以下方法输出: 、程序流程 For()//条件5行.用来输出上半部分 { For()//控制空格数 {输出空格} 输出* For()//控制中间的空格数 {输出空格} 输出* } For()//条件4行.用来输出下半部分 { For()//控制空格数 {输出空格} 输出* For()//控制中间的空格数 {输出空格} 输出* } 网上查到的写法基本都是这样。 但是我想说,如果换个思维方式,不用这么麻烦。 不用拆分成两部分一样能搞定。 不知道大家看明白没有? 这个的做法是: 想象一下,这个图形在一个矩形的区域内,区域内指定的点是*,其它点是空格(就好像咱们的电脑显示汉字一样)。 所以我们只要找到每行首应该显示的空格数量就可以了。 思考: 如果把这个图形放到一个数组中应该如何实现? 3、求水仙花数。 水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。 (例如: 1^3+5^3+3^3=153) .程序分析: 先要分解出每个数位上面的数字,然后可以做判断,如果符合条件的(即每个位上的数字的n次幂之和等于它本身)就输出,如果在指定范围内就可以利用for循环控制个数。 这个程序对于大家来说难点就在如何把各个数字分解出来。 .程序源代码: 运行结果如下: 思考: 如果加个要求,允许对方手动输入数字的位数(即n的值)应如何写。 4、兔子产仔问题 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,假如也从来不生病,假如从来不偷懒每月按时生产,假如也不会近亲结婚,假如它们都有地方住,并且还总有吃的饿不死……问每个月的兔子总数为多少? (为什么那么多假如,如果没有那么多假如,咱们的程序都没有bug了,微软也不用发布系统漏洞了) 、别总想着一对兔子是两只,咱们最后乘以2就是多少只,不乘2就是多少对。 兔子的规律为1,1,2,3,5,8,13,21....其实就是后一个数是前两个数的和。 .程序源代码: 运行结果如下: 其实上面的例子可能还是不好理解,有没有更好理解的方法呢? 例如: 这样写: 只要兔子不是1对,那就直接计算前两个数的和。 调用方法如下: 运行结果如下: 这种算法就是递归(程序调用自身),看起来比较容易理解吧! 再来看个递归的例子。 5、阶乘。 、何为阶乘: 正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。 例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。 、解题思路: 我们倒着看n的阶乘就是n*(n-1)*(n-2)*(n-3)*……*1,既然找到了规律剩下的事情就好办了: 、程序源码如下: 运行结果如下: 思考: 如果不用递归怎么做? 6、汉诺塔问题 、汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 (来源于XX百科) 、解题思路: 假设三根柱子分别是A、B、C,总之要把A柱子上面的圆盘移动到C上面。 我多么多么的希望只有一个圆盘! 那么就可以这样了: A->C。 但是现在不是一个是如果是两个那么就是: A->B,A->C,B->C;如果是三个盘子呢,应该就是A->C,A->B,C->B,A->C,B->A,B->C,A->C,然后我们再从中找出规律……这样做就是麻烦的方法了。 我们可以用把大象装冰箱里的方法去解决。 现在我们把所有的盘子看成两部分,一部分是最下面一个盘子,第二部分是除了最下面的那个的所有盘子,于是我们只需要把上面的那个整体移动到B(即A->B),然后我们把最下面的盘子移动到C(即A->C),最后把那个整体移动到C(即B->C)。 您会问,那个B不是个整体吗? 怎么移动啊? 继续让它执行刚才的过程呗。 、程序代码如下: 运行结果如下: 这个问题最不好理解的地方就是: 把n-1当做一个整体去处理。 注意,实际使用中,递归的长处是可读性高,程序好理解,但是没有循环语句效率高。 具体使用中到底用哪个要看问题是什么。 像计算阶乘就没有必要用递归。 但是像汉诺塔问题,如果不用递归就会很复杂了。 7、数组 、所谓数组,就是相同数据类型的元素按一定顺序排列的集合。 (来源于XX百科)数组里面的数据类型可不一定是基本类型。 C和basic数组的几个区别,basic的数组是可变大小的,但是c是固定大小的,basic的数组下标从1开始,C下标由于是地址偏移量所以是从0开始。 C中的数组和指针实际是同一个东西,所以用的时候混着用。 由于是从c#下调试所以使用中和纯粹的C语言也有所区别。 实际应用中,在.net环境下除非是参数数组,其它时候一般使用List 、数组怎么用? 咱们先看两个关于数组显示输出的问题。 练习1: 计算素数,要求先显示指定范围内一共多少素数,然后再显示出来。 程序分析: 我们可以用一个变量来记录数量,用一个数组来记录数字,然后再遍历数组,显示出来。 程序代码如下: 运行结果如下: 思考: 程序显示素数的时候为什么不用foreach,而是用效率相对低的for? 其中注释掉的是List 其实List 练习2: 输出菱形图案。 程序分析: 这次像上面一样一行数据就不能解决问题了,就需要使用到二维数组。 二维数组就好像一个表格一样。 我们可以像表格的行列一样去访问数据。 程序代码如下: 由于两个显示输出同时生效,所以输出结果是两个菱形: 至于到底用哪个语句输出看个人习惯。 8、矩阵 、矩阵是指纵横排列的二维数据表格。 、计算矩阵乘法 、分析: 在计算机中,一个矩阵实际上就是一个二维数组。 一个n行m列的矩阵与一个m行p列的矩阵可以相乘,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数为第一个矩阵第i行上的m个数与第二个矩阵第j列上的m个数对应相乘后所得的m个乘积之和。 (以上算法,来自XX) 其实就是矩阵1的i行所有数字分别乘以矩阵2的j列所有数字之和.用编程语言翻译一下就是: 结果矩阵[i,j]=矩阵1[i,k]*矩阵2[k,j]+矩阵1[i,k+1]*矩阵2[k+1,j]+……其中的k是有规律可循的,可以用一个循环去做. (因为在C#下调试所以这里使用了c#的写法) 、既然有了算法,我们就把算法用程序设计语言描述出来 运行结果如下: 9、打印出杨辉三角形 、杨辉三角是这个样子的: 、程序分析: 如果直接打印一个这样的图形不太好弄,所以咱们把所有数字都左对齐,如果弄一个这样的就好办多了: 可以看出每行的开始和结尾都是1,中间的数是对着的上面两个数的和。 我们先把所需要的所有数字,全都存储到一个二维数组中,然后再通过调整格式的方式输出我们需要的三角形。 、程序代码如下: 输出结果本题开头那两个截图。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 讲课 语言
![提示](https://static.bdocx.com/images/bang_tan.gif)