C语言初步;简单的算法及程序;
2014-04-01 23:06
926 查看
打算重新学一遍C语言,并在这个博客上分享每天的成果。看见一个说法,写得比做的更靠谱;另外对于IT行业,博客似乎总是显得很重要,能够衡量一个程序员的功底;我既不是程序员,也没有扎实的功底。但我真的想坚持,今天是个开头,看能坚持多久。根据基本的了解,归纳了下C的一些特点:丰富的数据类型及运算符;可移植性;能够直接接触底层硬件(可以对地址的访问)。
第一题是说,输出2000年到2500年之间的所有闰年。程序十分简单,只有一点容易搞错----何为闰年?百度百科给出了定义及设置闰年的原因四年一闰,百年不闰,四百年再闰。之所以设置闰年,是因为按每天24小时、每年365天计算的话,每四年会多出一天(比一天略小),因此四年一闰;而四年一闰的每四百年会多出三日,因此又规定百年不闰,四百年再闰。算法流程图如下:
对应的C程序过于简单,不在赘述;
第二题;求m,n的最大公约数,同样算法是很重要的(我之前一直拿短除法之类的计算的,没见过这种算法,这种算法的收敛速度更快)
(算法叫欧几里得或辗转相除法,具体的证明方法参见经典问题—欧几里得求最大公约数)源代码也略去了;都是简单的运算符的应用。另外补充一点;如何计算最小公倍数,例如给出的数是m,n,由上述算法求得的最大公约数为p,则最小公倍数数为mn/p;
字符数据的输入和输出:putchar()和getchar()均只能输出和输入一个字符;如何输入一个字符串呢?利用循环
while((c=getchar())!=‘/n’).或者定义字符串数组,用gets()实现;关于这点可以从题目“输出给定的字符串的所有子串(http://blog.csdn.net/ns_code/article/details/21043665#comments)”一题中得以应用。我关于此题写的代码如下:
格式输入与输出:7.2f%指七列二位小数;
运算符优先级:赋值<关系<算术;
swith语句;一旦执行完一个case,自动进行下一个case,除非加了break;
在循环语句及cwith语句中用break跳出当前语句;
在循环语句中,continue跳出当前循环
fabs(t)指求t的绝对值;
字符串处理函数:puts;gets;strcat(str1,str2)将字符串2接到字符串1后面;strcpy(str1,str2)将字符串3复制到1中去,字符串不能通过简单的str1=str2赋值;与之对应的strncpy(str1,str2,n)将2中最前面的n个字符复制到1中去;strcmp(str1,str2),如str1>str2,函数值为一个正数;小于为负数;等于为零。strlen测试字符串的长度;strlwr和strupr互相对应,分别将字符串变成小写或大写;
函数的单向值传递形式,形参值的变化不能使实参的值发生改变;而用指针变量作为函数参数,可以很容易的完成多多个变量的修改;
指针的理解:指针好比是地址,通过地址能够找到他所指的对象;我们可以应用指针修改指针所指的对象。指针和数组名有关联之处,比如定义数组:int a【10】,则a代表数组元素的首地址;我们定义指针变量int*p,则p=&a【0】和p=a是等价的;也就是说a也是指针,但是是个常量指针,不能在程序里继续赋值了。另外,*(p+i)和a【i】是无条件等价的
多维数组与指针的关系:对于a【i】【j】:
a 含义:0行首地址
a[0],*(a+0),*a 含义:0行0列地址
a+1,&a[1] ,*(a+1) 1行首地址;
a[1]+2,*(a+1)+2 1行2列元素的地址
*(a[1]+2),*(*(a+1)+2 ) 1行2列元素的值
sizeof()和strlen()的关系:
1、sizeof()是运算法,strlen()是函数;
2、sizeof()求变量所占的byte值;strlen一般求的是字符串的长度(不包括结尾的’\0‘,但包'\n' 't'等,另外注意'\\' '\ddd' '\xhh'等字符的用法)
以下是几个简单的程序,可以看出他们之间的关系
第一题是说,输出2000年到2500年之间的所有闰年。程序十分简单,只有一点容易搞错----何为闰年?百度百科给出了定义及设置闰年的原因四年一闰,百年不闰,四百年再闰。之所以设置闰年,是因为按每天24小时、每年365天计算的话,每四年会多出一天(比一天略小),因此四年一闰;而四年一闰的每四百年会多出三日,因此又规定百年不闰,四百年再闰。算法流程图如下:
对应的C程序过于简单,不在赘述;
第二题;求m,n的最大公约数,同样算法是很重要的(我之前一直拿短除法之类的计算的,没见过这种算法,这种算法的收敛速度更快)
(算法叫欧几里得或辗转相除法,具体的证明方法参见经典问题—欧几里得求最大公约数)源代码也略去了;都是简单的运算符的应用。另外补充一点;如何计算最小公倍数,例如给出的数是m,n,由上述算法求得的最大公约数为p,则最小公倍数数为mn/p;
字符数据的输入和输出:putchar()和getchar()均只能输出和输入一个字符;如何输入一个字符串呢?利用循环
while((c=getchar())!=‘/n’).或者定义字符串数组,用gets()实现;关于这点可以从题目“输出给定的字符串的所有子串(http://blog.csdn.net/ns_code/article/details/21043665#comments)”一题中得以应用。我关于此题写的代码如下:
#include<stdio.h> void main() { char a[100]; int num,i,j,k; num=0; /*while((a[num]=getchar())!='\n') { num=num+1; }*/ for(num=0;(a[num]=getchar())!='\n';num++) printf("aaa%d\n",num); for(i=0;i<num;i++) for(j=i;j<num;j++) { k=i; while(k<=j) { printf("%c",a[k]); k=k+1; } printf("\n"); } }
格式输入与输出:7.2f%指七列二位小数;
运算符优先级:赋值<关系<算术;
swith语句;一旦执行完一个case,自动进行下一个case,除非加了break;
在循环语句及cwith语句中用break跳出当前语句;
在循环语句中,continue跳出当前循环
fabs(t)指求t的绝对值;
字符串处理函数:puts;gets;strcat(str1,str2)将字符串2接到字符串1后面;strcpy(str1,str2)将字符串3复制到1中去,字符串不能通过简单的str1=str2赋值;与之对应的strncpy(str1,str2,n)将2中最前面的n个字符复制到1中去;strcmp(str1,str2),如str1>str2,函数值为一个正数;小于为负数;等于为零。strlen测试字符串的长度;strlwr和strupr互相对应,分别将字符串变成小写或大写;
函数的单向值传递形式,形参值的变化不能使实参的值发生改变;而用指针变量作为函数参数,可以很容易的完成多多个变量的修改;
指针的理解:指针好比是地址,通过地址能够找到他所指的对象;我们可以应用指针修改指针所指的对象。指针和数组名有关联之处,比如定义数组:int a【10】,则a代表数组元素的首地址;我们定义指针变量int*p,则p=&a【0】和p=a是等价的;也就是说a也是指针,但是是个常量指针,不能在程序里继续赋值了。另外,*(p+i)和a【i】是无条件等价的
多维数组与指针的关系:对于a【i】【j】:
a 含义:0行首地址
a[0],*(a+0),*a 含义:0行0列地址
a+1,&a[1] ,*(a+1) 1行首地址;
a[1]+2,*(a+1)+2 1行2列元素的地址
*(a[1]+2),*(*(a+1)+2 ) 1行2列元素的值
sizeof()和strlen()的关系:
1、sizeof()是运算法,strlen()是函数;
2、sizeof()求变量所占的byte值;strlen一般求的是字符串的长度(不包括结尾的’\0‘,但包'\n' 't'等,另外注意'\\' '\ddd' '\xhh'等字符的用法)
以下是几个简单的程序,可以看出他们之间的关系
相关文章推荐
- 使用C语言实现二维,三维绘图算法(3)-简单的二维分形
- 简单的C语言算法举例
- day09-关于C语言数组的学习与简单的算法
- 实验二用C语言编写简单程序
- C语言及程序设计初步例程-30 算法的基本概念
- C语言实现的简单银行存取款程序 请输入如下数字命令
- 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)
- C语言算法和三种基本程序结构
- ROS的初步学习(六)---写一个简单程序
- C语言编写简单图像程序-圆
- C语言之算法初步(汉诺塔--递归算法)
- socket编程之C语言一个简单监听程序
- [面试算法]有一无符号整型数组,大小为10, 初始的数值随机,但在[0, 99]之间。请用C语言写一个过滤程序,令数组内的数据互不相等。
- 使用C语言简单模拟Linux的cat程序
- C语言编程实战——编写简单贪吃蛇程序
- C语言简单程序
- LRU算法的简单实现( C语言 + uthash包)
- C语言实现的一个简单的HTTP程序
- 从一简单程序看C语言内存分配
- Ubuntu12.04下gdb调试C语言简单程序详解