博文

[置顶] for循环使用详解(c语言版)[转载](2006-07-26 01:23:00)

摘要:说明:c语言的很多语法部分都和JAVA,AS等相同 特别是for的用法. c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句.for(表达式 1;表达式 2;表达式 3)语句它的执行过程如下:(1)先求表达式 1.(2)求表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第三步 做若为 假(值为0),则结束循环,转到第5步.(3)求解表达式3(4)转回上面第(2)步骤继续执行;(5)结束循环,执行for语句下面的一个语句;for(循环变量赋初值;循环条件;循环变量增值)语句如 for(i=1;i<=100;i++)sum=sum+i; 它的执行相当于 i=1; while(i<=100){ sum=sum+i; i++; } 显然,用for语句更简单、方便。说明:(1)for语句的一般形式中的"表达式1"可以省略,此时应在for语句之前给循环变量赋初值.注意省略表达式1时,其后的分号不能省略.如for(;i<=100;i++){....};(2)如果表达式2省略 即不判断循环条件,循环无终止地循环下去,也就是认为表达式2始终为真.例如:for(i=1;;i++){.....};相当于 i=1; while(1) {sum=sum+1; i++; } (3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束.如: for(i=1;i<=100;) {sum=sum+1; i++; } 这个例子的循环增量没有放在表达式三的位置 而是作为循环体的一部分 其效果是一样的.(4)可以省略表达式1和表达式3,只有表达式2 即只给循环条件.如 for(;i<=100;) { sum=sum+i; i++; } 这个相当于 whlie(i<=100) { sum=sum+i; i++; } (5)三个表达式都可以省略,如:for(;;)语句相当于while(1)语句即不设初值 不判断条件(认为表达式2为真值)循环变量不增值,无终止的执行循环体.(6)表达式1也可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式.如: for(sum=0;i<=......

阅读全文(2157) | 评论:0

[置顶] C语言编程易犯毛病集合[转载](2006-07-26 00:55:00)

摘要:C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,写给各位学员以供参考。1.书写标识符时,忽略了大小写字母的区别。main(){int a=5;printf("%d",A);}编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。[C语言规定所有的关键字必须小写,而标识符中的字母则既可以大写,也可以小写,标识符不能与关键字相同,并区分大小写字母。例如,else是关键字,不能作为标识符使用,而ELSE可以作为标识符使用。]2.忽略了变量的类型,进行了不合法的运算。main(){float a,b;printf("%d",a%b);}%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。3.将字符常量与字符串常量混淆。char c;c="a";在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。4.忽略了“=”与“==”的区别。在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写if (a=3) then …但C语言中,“=”是赋值运算符,“==”是关系运算符。如:if (a==3) a=b;前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。5.忘记加分号。分号是C语句中不可缺少的一部分,语句末尾必须有分号。a=1b=2编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。{ z=x+y;t=z/100;printf("%f",t);}对于......

阅读全文(2310) | 评论:1

[置顶] c语言的编程风格[转载]     (2006-07-26 00:50:00)

摘要:c语言的编程风格 第一章:缩进格式  Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.   理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.   现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.   总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序. 第二章:大符号的位置  另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:   if (x is true) { we do y }     然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:int function(int x) { body of function }     所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) K&R是___对___的,(第二)如果K&R不对,请参见第一条. (:-))......另外,函数也是特殊的,不一定非得一致.   需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如"while"在do-while循环中,或者"else"在if语句中.如下:   do { body of do-loop } while (condition);   以及  if (x == y) { .. } else if (x > y) { ... } else { .... }   理由: K&R.     另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了. ......

阅读全文(1916) | 评论:0

[置顶] c语言学习新手必看 power by vcok.com[转载](2006-07-26 00:47:00)

摘要:本人也是刚学C不久算是老菜鸟。把我遇到的问题写出来,希望对初学者有点帮助。 一、分号,大括号 分号。分号是表达式结束的标志,一般表达式后面都要有。 写“;”的时候一定要注意:是否要结束前面的语句 。注意:if,switch,for,while语句,数据类型定义,函数定义。 if(a>b) /*if语句,没有分号*/ {...} while(i+=10,i!=100); /*while语句循环体为空,依靠逗号语句实现循环*/ struct a /*结构体数据定义,没有分号*/ {...}b; /*结构体变量,要有分号*/ int sum(...) /*函数定义,没有分号*/ {....} 大括号。大括号是一个语句段的标志。 写大括号时最好一次写一对,然后把光标移到大括号里写 。避免遗漏。 二、运算符号 “=”与“==” “=”用于赋值,注意“=”左边必须是变量,右边可以是常量也可以是变量。“==”用于判断两个量的大小,左右两边可以是常量也可以是变量( 尽量把常量写在左边,这样“==”误写成“=”时编译器就会报错 )。 运算表达式有它本身的值 。“=”语句值为“=”右边的量的大小;“==”语句值为判断结果,无外乎两种,0(表示“==”两边不等)1(“==”两边相等)。 (i=1)==(3==4); /*i值为1,整个表达式值为0*/ “,” 逗号语句是从左到右计算,整个逗号语句的值为最后一个语句的值 i=(j=2,j+8,j++); /*先计算j=2,值为2,j+8不是运算表达式,跳过,计算j++得到整个括号内的值3*/ “/” “/”两边都是整型变量的时候结果也是整型,而且结果遵循向0靠拢的原则 。 运算符的优先级及结合方向 不多说了,表格一定要背牢。 三、变量 命名 不要吝惜,能说明白性质尽量在变量的名字上说明。 避免老是使用一个字母,或者难以理解的变量名 。对于较长的变量命名可以使用宏定义、类型定义。 #deine UP 0x4800 /*键码的宏定义*/ typedef struct {....}MEM; /*结构体变量的类型定义*/ 类型 注意变量的使用范围。 当不确定变量的范围的时候尽量选用值域宽的类型。双目运算符两边的变量一般类型要一致。不一致......

阅读全文(2952) | 评论:1

[转帖][推荐]c语言补课笔记(5)(2006-07-31 02:06:00)

摘要:第九天   今天终于到了C语言的核心部份了,指针一直都是被学习C语言公认为最难的一个大重点了,如果假如我们不学C语言的指针的话,那我们可以说根本没有学过C语言了。不过话说回来,在我刚开始接触C的时候前面的基本语法倒是很快的过了,可是学到指针结合到数组里就傻了眼,因为我根本看不明为什么可以有这么多的数组调用方式(结合指针)。其实我下面的三言两语也很难说的明白指针这家伙的,请大家在上机里多多调试看看,待增加了经验后再回头看看指针这章,相信也能全摸透了。因为我也是这样过来的,我还特别看了很多运用指针方面的源程序。  现在我们就从相对于二维数组来说比较简单的一维数组开始吧,先看看如何定义一个指向一维数组的指针吧。 int a[5]={1,2,3,4,5};int *p;p=a; /*这里a因为是数组的变量名,它的值是这个数组的首地址*/跟着我们可以通过指针来改变数组的值p++;*p=6; /*那么数组的第二个元素就等于6了*/  这里的意思就是让指针向下移一个,这样一来指向了数组的第二个元素。我们再细一点看看它的地址,通过这个指针,即当前指向的元素的地址。那么地址又是怎么运行的呢?p++这个命令就是让地址往下移的了,如果按照数组a 的类型来看,数组a是一个整数的类型,占的空间是两字节,而p++就只加1,顶多都是到第一个元素的后一半里,哪里可以指到第二个元素呢?其实这里就关系到定义指针时的类型,我们这里定义的也是整型类型,"对啊,这里定义整型是对的啊,因为它要指向整形数据嘛,那么当然就是一定要定义这种类型啦",其实这并不是真正的答案,而且也不必一定要定义为跟指向的数据一样类型,我们完全可以定义指针的类型为其它的。就比如定义为float吧,不过这里执行p++就直接跳过了一个数组元素,那么现在我们来看看究竟是怎么一回事。其实我们定义的指针类型就是用来结合指针,进行一定规则的运算方式。这里很明显可以看出如果是定义int 类型的就可以到第二个元素,说明了p++不是简单的地址加一,而是先结合这个是什么类型才进行运算的,加一次就等于地址移了2位了。float道理一样移4位,所以得到的结合是移到第三个元素。再往下看看:a=a+1;这里我们进行地址移位赋值,不过这条命令是错误的,C语言里数组名是一个地址常量,所以不以试图改变它的值。接下来简单地说一说二维数组,因为我们今天......

阅读全文(2851) | 评论:0

[转帖][建议]c语言补课笔记(4)(2006-07-31 02:05:00)

摘要:第七天   今天终于都讲到C语言比较后的范围了,"函数"说是C语言的一切真的没错(可能有吧,我不知道)。很多书上都说着函数是C语言根本,就是说函数是构成C语言的。看以下这个程序: main() {   printf("Hello World"; }   main()就是C语言里最特殊的一个函数,是构成整个程序的关键。在C编译器里首先就是要找出这个主函数才开始执行编译,好了,说了一些书上原来的东西。现在我们就来看看C语言里的函数究竟是怎么的,如果我们从基础的说起也没有什么意思。那么我们就从函数的另一个特点说起,"递归函数"相信很多人都知道这个吧,看过老潭的教程应该都知道他经典的第一个递归程序吧: int abc(int n) {   int s;   if(n >1) s= n*abc(n-1);   else s=1;   return (s); }   从这个源程序很容易就看出有一个同自己名字的函数在里面,所以以后我们看到一个函数里面调用自己就是递归函数了。而且我们看一个递归函数就主要就是看它是否一个返回的条件,就好像一条又黑又深的山洞,我们前去探险如果往到底就一定要回头,就算是更深的也要返回啊!所以我们判定一个递归函数是否成立也常常是看它的返回条件。至于上面的那个源程序我也不想多说了,应该大家也看得明白。 这里就看看另一个利用递归函数做的题目吧,就是诺汉塔(老潭的书上也是有的)。 #include <stdio.h> void move(char x,char y) {   printf("%c-->%c\n",x,y); } void hanoi (int n,char one ,char two,char three) {   if(n==1) move (one ,three);   else   {     hanoi (n-1,one,three,two);     move(one,three);     hanoi(n-1,two,one,three);   } } main() {   int m;   printf("input the number of diskes:";   scanf("%d",&m);   printf("the step to moving %3d diskes......

阅读全文(2255) | 评论:0

转帖][推荐]c语言补课笔记(3)(2006-07-31 02:05:00)

摘要:第五天     昨天老师布置的我们一道答,我昨天都给忙了做,而是今天突然想起才冲冲的赶着做,是这样的一道题: 给一个不多于5位的正整数,要求:1,这个数有几位2,打印每一位的数,3逆序打印,比如321 输出 123。好在这答也不难,用了一会儿时间就做完了。main(){  int n; int num;  int i=0,a[5];  printf("请输入不大于5位的正整数";  scanf("%d",&num);  do   {    do =num % 10;    num /=10;    i++;  }while(num!=0);   n=i;  printf("LEN%d",n);  for(i=n-1;i>=0;i--)    printf("%d",a[ i ]);  for(i=0;i<n;i++)    printf("%d",a[ i ]); }  做这题时我也用到了昨天老师教的画图方法作了验算,不过还是要上机求正否,这样一来可以锻练一下编写程序。我们大家都各有各的方法,有些是很长(用Switch语句呢),我也不知道他怎么想的了,不过不同人有不同思想是正确的,编程这玩意没有完全统一的答案的。那么你们想想你们有什么方法做呢,好吧,就给五分钟你们做做吧。……好了,时间到了,下面我再说说我的另一位同学做的方法吧,他是用字符数组的,也很简单方便可以实现。你们做的怎么了?如果有好的方法也可以大家交流啊,因为我写这些都是为了大家(也为了自己)。大家应该都看得明白我的程序吧,因为我的思想就是这么单纯。 老师说完了昨天的作业后就开始说今天要讲的课程了。今天的主题是循环语句,其实C语言里也只是这么几条循环语句吗?相比QB来说真的可以算是见大场面了,因为QB里单是循环语句已经有七八种之种,至于有那些我也记不太清了。那么下面讲讲C语言的好了。C语言的循环语句一共有三种,先说说比较简单的前两种吧!While ( 条件 ) { 语句;} 和 do { 语句;}               while ( 条件 );  这里我想重复一下老师给我们说的一个笑话,就是有一个小女孩问妈妈拿糖的小故事。有一个很乖的小女孩总是先问妈妈可不可以吃糖,如果得么批准了就拿一粒来吃。可是有一次她就很拿着一粒吃着了,跟着才问妈妈我可不可吃糖啊......

阅读全文(2524) | 评论:0

[推荐]c语言补课笔记(2)(2006-07-31 02:01:00)

摘要:[推荐]c语言补课笔记(2) 第三天    今天所讲的都是围绕着数组,我们在C语言里定义数组和其它高级语言定义的不同,这里示出C语言和其它语言的。  C语言      Foxbase  int a[10][10]; dim a(10,10)  是不是符号也不同了,我们以前用惯的都是小括号,但是现在突然来的是中括号真的是有些不习惯呢。但是谁叫我们是学C语言呢,不习惯都要得习惯了。还记得以前定数组根本就是不用理会它的地址,只知道用就行了,就算用错了也会编译出错。可是C语言可不是呢,一但你定义了一个数组之后,你就得好好的管住它,因为数组出了边界是绝对不会通知你的。数组的定义和调用方法也是很多,真是灵活多变,这里不再重复书上里的东西了。现在就定义一个数组来看看:int a[10];   如这个表所示,数组定义之后有相对地址,而且数组名a就是存放这些地址的首地址。(但是数组名是一个指针常量。)现在我们定义多一个整型指针变量 int *p; ,让他指向数组a,p=a; 我们试着让指针运算递增一个p++; 我们看到的结果是p指向了新的地址2003,原来的地址是2001,为什么递增一个就移向了2003呢?不是2002才是正确的吗?其实这里就说明了我们定义指针变量为什么要整型呢,是因为所有的指针运算也是看自己本身是什么类型的指针作出什么的运算,就是现在是整型类型,整型数据存储是需要2字节的,所以针指运算也是按这个方式来到进行,结果很显然就是往下移2了。  好了,接下来我们做一些题目吧,这是今天老师给我们出的题,其实也是2001年程序员下午考试里出现过的题目。所以请大家自己也动手做做,多思考,看看谁的方法比较好。 在n行n列矩阵中,每行都有最大数,本程序求这几个最大数中的最小一个。#include <stdio.h>#define N 100int a[N][N];void main(){  int row,col,max,min,n;  /*输入合法的n和n*n个整数的代码, 注,这里略了一部份到后面练习自己做回*/  for(row=0;row<n;row++)  {    for(max=a[row][0],col=1;col<n;col++)    if (  ) max=a[row][col];    if (  ) mi......

阅读全文(2367) | 评论:0

[建议]转载c语言补课笔记(1)(2006-07-31 02:00:00)

摘要:网上有一篇考高程的补课笔记,看来是当事人为提高c语言参见的c语言补习班,我想对大家可能有所帮助,将原来的内容编辑以后在这里列出,希望大家喜欢。(部分内容我有些删改,是为了大家能更好的学习。)    第一天      今天因为第一天吧,老师还不太清楚我们的底究竟到那里。是因为我们之前都是全自学的,所以现在要摸一摸底吧。一开始,他直接引入了上界程序员考试的下午的第一道题,是一道编程填空题。如下:     int strcmp( char *s, char *t)           {       while(*s && *t && _______)         { s++;t++;          }           return ________;              }  这是模仿C语言字符函数库里的字符比较函数,当时我第一时间就想到了一种方法,第一空因为大家都没有问题吧,*s和*t这两个都保持为逻辑真就行,表明这个存储单元是用字符的,大家都知道C语言里没有字符串这种变量的,只有字符数组,'\0'这个符号就是用来表明这个字符数组到了结尾了,这里又有一个新的概念要说说的了,就是C语言逻辑里非零的都为真,那么'\0'这个符号就是为零。所以填这个空就应该没有什么太大的难度了,跟着就是还要有一个条件退出循环,因为是比较大小,只要保持一样都继续,所以条件也很显示的可以写出来*s == *t。至于第二题当时我的思维就销定在条件运算符里,因为返回的值是有三种可以性的,大于返回正数,等于就返回零,小于就返回负数。知道了这三种可能就可以用条件运算符填了,我当时的答案......

阅读全文(2854) | 评论:0

另类的穷举算法(2006-07-30 03:09:00)

摘要:Description有一个未完成的等式1 2 3 4 5 6 7 8 9=N空格内(1前面没有空格)可以填入+,-,也可以不填。 编程找出输入某个整数 N 后使等式成立的所有方案的总数。保证有解。Input该题含有多组测试数据,每组数据为一行,仅一个整数N。Output输出方案总数。Sample Input108Sample Output15 #include<iostream.h>#define OpNo 0 //No operator#define OpAdd 1 //+#define OpSub 2 //-typedef int Operator;long Calc(int Status);int main(){    long t,count,loop;    while(cin>>t)    {        for(loop=0,count=0;loop<6561;loop++)            if(Calc(loop) == t) count++;        cout<<count<<endl;    }    return 0;}long Calc(int Status){    long buffer=1,result=0;    int currentNum;    Operator op,elapsedop=OpNo;    for(currentNum=2;currentNum<=9;currentNum++)  &nbs......

阅读全文(1529) | 评论:0