第一题是说,输出2000年到2500年之间的所有闰年。程序十分简单,只有一点容易搞错----何为闰年?百度百科给出了定义及设置闰年的原因四年一闰,百年不闰,四百年再闰。之所以设置闰年,是因为按每天24小时、每年365天计算的话,每四年会多出一天(比一天略小),因此四年一闰;而四年一闰的每四百年会多出三日,因此又规定百年不闰,四百年再闰。算法流程图如下:
对应的C程序过于简单,不在赘述;
第二题;求m,n的最大公约数,同样算法是很重要的(我之前一直拿短除法之类的计算的,没见过这种算法,这种算法的收敛速度更快)
(算法叫欧几里得或辗转相除法,具体的证明方法参见经典问题—欧几里得求最大公约数)源代码也略去了;都是简单的运算符的应用。另外补充一点;如何计算最小公倍数,例如给出的数是m,n,由上述算法求得的最大公约数为p,则最小公倍数数为mn/p;
字符数据的输入和输出:putchar()和getchar()均只能输出和输入一个字符;如何输入一个字符串呢?利用循环
while((c=getchar())!=‘/n’).或者定义字符串数组,用gets()实现;关于这点可以从题目“输出给定的字符串的所有子串(http://blog.youkuaiyun.com/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'等字符的用法)
以下是几个简单的程序,可以看出他们之间的关系
#include
#include
int main(void)
{
char s[]="010\010\\010\n";
printf("%d\n%d",sizeof(s),strlen(s));//显示的结果为10(’\101‘指的是ASICII码
//为101的字符;’\\‘代表反斜杠字符,包括字符串的结束标志’\0‘)和9
}
//注意与上个程序间的区别//
#include
#include
int main(void)
{
char *s="010\010\\010\n";
printf("%d\n%d",sizeof(s),strlen(s));//显示的结果为4(包括字符串的结束标志’\0‘)和9
}