2004年11月28日






五条毛毛虫的故事(水梦犹蓝提供)
  第一条毛毛虫

  话说第一条毛毛虫,有一天爬呀爬呀过山河,终于来到这棵苹果树下。它并不知道这是一棵苹果树,也不知树上长满了红红的苹果。当它看到同伴们往上爬时,不知所以的就跟着往上爬。没有目的,不知终点,更不知生为何求、死为何所。

  它的最后结局呢?也许找到了一只大苹果,幸福地过了一生;也可能在树叶中迷了路,颠沛流离糊涂一生。不过可以确定的是,大部分的虫都是这样活着的,也不去烦恼什么是生命意义,倒也轻松许多。

  第二条毛毛虫

  有一天,第二条毛毛虫也爬到了苹果树下。它知道这是一棵苹果树,也确定他的“虫生目标”就是找到一棵大苹果。问题是……它并不知道大苹果会长在什么地方?但它猜想:大苹果应该长在大枝叶上吧!于是它就慢慢地往上爬,遇到分支的时候,就选择较粗的树枝继续爬。

  当然在这个毛虫社会中,也存在考试制度,如果有许多虫同时选择同一个分支,可是要举行考试来决定谁才有资格通过大树枝。幸运的,这条毛毛虫一路过关斩将,每次都能选上最好的树枝,最后它从一枝名为“大学”的树枝上,找到了一只大苹果。不过它发现这只大苹果并不是树上最大的,顶多只能称是局部最大。因为在它的上面还有一只更大的苹果,号称“老板”,是由另一条毛毛虫爬过一根名为“创业”的树枝才找到的。
令他泄气的是,这个创业分支是他当年不屑于爬的一棵细小的树枝。

  第三条毛毛虫

  接着,第三条毛毛虫也来到了树下。这条毛毛虫相当难得,小小年纪,却自己研制了一副望远镜。在还未开始爬时,就先利用望远镜搜寻一番,找到了一只超大苹果。同时,它发觉当从下往上找路时,会遇到很多分支,有各种不同的爬法;但若从上往下找路时,却只有一种爬法。

  它很细心地从苹果的位置,由上往下反推至目前所处的位置,记下这条确定的路径。于是,它开始往上爬,当遇到分支时,他一点也不慌张,因为它知道该往哪条路走,不必跟着一大堆虫去挤破头。譬如说,如果它的目标是一只名叫“教授”的苹果,那应该爬“升学”这条路;如果目标是“老板”,那应该爬“创业”这分枝;若目标是“政客”,也许早就该选“厚黑之道”这条路了。

  最后,这条毛毛虫应该会有一个很好的结局,因为它己具备了先觉的条件了。但也许会有一些意外的结局出现,因为毛毛虫的爬行相当缓慢,从预定苹果到抵达时,需要一段时间。当它抵达时,也许苹果已被别的虫捷足先登,也许苹果已熟透而烂掉了。

  第四条毛毛虫

  第四条毛毛虫可不是一只普通的虫,同时具有先知先觉的能力。它不仅知道自己要何种苹果,更知道未来的苹果将如何成长。因此当它带着那“ 先觉”的望远镜时,它的目标并不是一只大苹果,而是一芽含苞待放的苹果花。它计算着自己的时程,并估计当它抵达时,这朵花正好长成一只成熟的大苹果,而且它将是第一个钻入大快朵颐的虫。

  果不其然,它获得了所应得的,从此过着幸福快乐的日子。

  第五条毛毛虫

  毛毛虫的故事本来应该到此结束了。因为所有故事的结局都必须是正面的且富有教育意义。但仍有不少读者好奇:第五条毛毛虫到底怎么了?

  其实它什么也没做,就在树下躺着纳凉,而一只只大苹果从天而降。因为树上某一大片树枝早就被它的家族占领了。它的爷爷、爸爸、哥哥们盘据在某一树干上,禁止它虫进入。然后苹果成熟时,就一颗颗地丢给底下的子孙们捡食。

  奉劝诸位,如果你不是含着金汤匙出生的,可不要妄想检到大苹果,因为反而会被砸死的。

2004年11月27日

经典c程序100例==91–100

【程序91】
题目:时间函数举例1
1.程序分析:
2.程序源代码:
#include “stdio.h”
#include “time.h”
void main()
{ time_t lt; /*define a longint time varible*/
lt=time(NULL);/*system time and date*/
printf(ctime(<)); /*english format output*/
printf(asctime(localtime(<)));/*tranfer to tm*/
printf(asctime(gmtime(<))); /*tranfer to Greenwich time*/
}
==============================================================
【程序92】
题目:时间函数举例2
1.程序分析:           
2.程序源代码:
/*calculate time*/
#include “time.h”
#include “stdio.h”
main()
{ time_t start,end;
int i;
start=time(NULL);
for(i=0;i<3000;i++)
{ printf(“\1\1\1\1\1\1\1\1\1\1\n”);}
end=time(NULL);
printf(“\1: The different is %6.3f\n”,difftime(end,start));
}
==============================================================
【程序93】
题目:时间函数举例3
1.程序分析:
2.程序源代码:
/*calculate time*/
#include “time.h”
#include “stdio.h”
main()
{ clock_t start,end;
int i;
double var;
start=clock();
for(i=0;i<10000;i++)
{ printf(“\1\1\1\1\1\1\1\1\1\1\n”);}
end=clock();
printf(“\1: The different is %6.3f\n”,(double)(end-start));
}
==============================================================
【程序94】
题目:时间函数举例4,一个猜数游戏,判断一个人反应快慢。(版主初学时编的)
1.程序分析:
2.程序源代码:
#include “time.h”
#include “stdlib.h”
#include “stdio.h”
main()
{char c;
clock_t start,end;
time_t a,b;
double var;
int i,guess;
srand(time(NULL));
printf(“do you want to play it.(‘y’ or ‘n’) \n”);
loop:
while((c=getchar())==’y')
{
i=rand()%100;
printf(“\nplease input number you guess:\n”);
start=clock();
a=time(NULL);
scanf(“%d”,&guess);
while(guess!=i)
{if(guess>i)
{printf(“please input a little smaller.\n”);
scanf(“%d”,&guess);}
else
{printf(“please input a little bigger.\n”);
scanf(“%d”,&guess);}
}
end=clock();
b=time(NULL);
printf(“\1: It took you %6.3f seconds\n”,var=(double)(end-start)/18.2);
printf(“\1: it took you %6.3f seconds\n\n”,difftime(b,a));
if(var<15)
printf(“\1\1 You are very clever! \1\1\n\n”);
else if(var<25)
printf(“\1\1 you are normal! \1\1\n\n”);
else
printf(“\1\1 you are stupid! \1\1\n\n”);
printf(“\1\1 Congradulations \1\1\n\n”);
printf(“The number you guess is %d”,i);
}
printf(“\ndo you want to try it again?(\”yy\”.or.\”n\”)\n”);
if((c=getch())==’y')
goto loop;
}
==============================================================
【程序95】
题目:家庭财务管理小程序
1.程序分析:
2.程序源代码:
/*money management system*/
#include “stdio.h”
#include “dos.h”
main()
{
FILE *fp;
struct date d;
float sum,chm=0.0;
int len,i,j=0;
int c;
char ch[4]=”",ch1[16]=”",chtime[12]=”",chshop[16],chmoney[8];
pp: clrscr();
sum=0.0;
gotoxy(1,1);printf(“|—————————————————————————|”);
gotoxy(1,2);printf(“| money management system(C1.0) 2000.03 |”);
gotoxy(1,3);printf(“|—————————————————————————|”);
gotoxy(1,4);printf(“| — money records — | — today cost list — |”);
gotoxy(1,5);printf(“| ———————— |————————————-|”);
gotoxy(1,6);printf(“| date: ————– | |”);
gotoxy(1,7);printf(“| | | | |”);
gotoxy(1,8);printf(“| ————– | |”);
gotoxy(1,9);printf(“| thgs: —————— | |”);
gotoxy(1,10);printf(“| | | | |”);
gotoxy(1,11);printf(“| —————— | |”);
gotoxy(1,12);printf(“| cost: ———- | |”);
gotoxy(1,13);printf(“| | | | |”);
gotoxy(1,14);printf(“| ———- | |”);
gotoxy(1,15);printf(“| | |”);
gotoxy(1,16);printf(“| | |”);
gotoxy(1,17);printf(“| | |”);
gotoxy(1,18);printf(“| | |”);
gotoxy(1,19);printf(“| | |”);
gotoxy(1,20);printf(“| | |”);
gotoxy(1,21);printf(“| | |”);
gotoxy(1,22);printf(“| | |”);
gotoxy(1,23);printf(“|—————————————————————————|”);
i=0;
getdate(&d);
sprintf(chtime,”%4d.%02d.%02d”,d.da_year,d.da_mon,d.da_day);
for(;;)
{
gotoxy(3,24);printf(” Tab __browse cost list Esc __quit”);
gotoxy(13,10);printf(” “);
gotoxy(13,13);printf(” “);
gotoxy(13,7);printf(“%s”,chtime);
j=18;
ch[0]=getch();
if(ch[0]==27)
break;
strcpy(chshop,”");
strcpy(chmoney,”");
if(ch[0]==9)
{
mm:i=0;
fp=fopen(“home.dat”,”r+”);
gotoxy(3,24);printf(” “);
gotoxy(6,4);printf(” list records “);
gotoxy(1,5);printf(“|————————————-|”);
gotoxy(41,4);printf(” “);
gotoxy(41,5);printf(” |”);
while(fscanf(fp,”%10s%14s%f\n”,chtime,chshop,&chm)!=EOF)
{ if(i==36)
{ getch();
i=0;}
if ((i%36)<17)
{ gotoxy(4,6+i);
printf(” “);
gotoxy(4,6+i);}
else
if((i%36)>16)
{ gotoxy(41,4+i-17);
printf(” “);
gotoxy(42,4+i-17);}
i++;
sum=sum+chm;
printf(“%10s %-14s %6.1f\n”,chtime,chshop,chm);}
gotoxy(1,23);printf(“|—————————————————————————|”);
gotoxy(1,24);printf(“| |”);
gotoxy(1,25);printf(“|—————————————————————————|”);
gotoxy(10,24);printf(“total is %8.1f$”,sum);
fclose(fp);
gotoxy(49,24);printf(“press any key to…..”);getch();goto pp;
}
else
{
while(ch[0]!=’\r’)
{ if(j<10)
{ strncat(chtime,ch,1);
j++;}
if(ch[0]==8)
{
len=strlen(chtime)-1;
if(j>15)
{ len=len+1; j=11;}
strcpy(ch1,”");
j=j-2;
strncat(ch1,chtime,len);
strcpy(chtime,”");
strncat(chtime,ch1,len-1);
gotoxy(13,7);printf(” “);}
gotoxy(13,7);printf(“%s”,chtime);ch[0]=getch();
if(ch[0]==9)
goto mm;
if(ch[0]==27)
exit(1);
}
gotoxy(3,24);printf(” “);
gotoxy(13,10);
j=0;
ch[0]=getch();
while(ch[0]!=’\r’)
{ if (j<14)
{ strncat(chshop,ch,1);
j++;}
if(ch[0]==8)
{ len=strlen(chshop)-1;
strcpy(ch1,”");
j=j-2;
strncat(ch1,chshop,len);
strcpy(chshop,”");
strncat(chshop,ch1,len-1);
gotoxy(13,10);printf(” “);}
gotoxy(13,10);printf(“%s”,chshop);ch[0]=getch();}
gotoxy(13,13);
j=0;
ch[0]=getch();
while(ch[0]!=’\r’)
{ if (j<6)
{ strncat(chmoney,ch,1);
j++;}
if(ch[0]==8)
{ len=strlen(chmoney)-1;
strcpy(ch1,”");
j=j-2;
strncat(ch1,chmoney,len);
strcpy(chmoney,”");
strncat(chmoney,ch1,len-1);
gotoxy(13,13);printf(” “);}
gotoxy(13,13);printf(“%s”,chmoney);ch[0]=getch();}
if((strlen(chshop)==0)||(strlen(chmoney)==0))
continue;
if((fp=fopen(“home.dat”,”a+”))!=NULL);
fprintf(fp,”%10s%14s%6s”,chtime,chshop,chmoney);
fputc(‘\n’,fp);
fclose(fp);
i++;
gotoxy(41,5+i);
printf(“%10s %-14s %-6s”,chtime,chshop,chmoney);
}}}
==============================================================
【程序96】
题目:计算字符串中子串出现的次数
1.程序分析:
2.程序源代码:
#include “string.h”
#include “stdio.h”
main()
{ char str1[20],str2[20],*p1,*p2;
int sum=0;
printf(“please input two strings\n”);
scanf(“%s%s”,str1,str2);
p1=str1;p2=str2;
while(*p1!=’\0′)
{
if(*p1==*p2)
{while(*p1==*p2&&*p2!=’\0′)
{p1++;
p2++;}
}
else
p1++;
if(*p2==’\0′)
sum++;
p2=str2;
}
printf(“%d”,sum);
getch();}
==============================================================
【程序97】
题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。
1.程序分析:     
2.程序源代码:
#include “stdio.h”
main()
{ FILE *fp;
char ch,filename[10];
scanf(“%s”,filename);
if((fp=fopen(filename,”w”))==NULL)
{printf(“cannot open file\n”);
exit(0);}
ch=getchar();
ch=getchar();
while(ch!=’#')
{fputc(ch,fp);putchar(ch);
ch=getchar();
}
fclose(fp);
}
==============================================================
【程序98】
题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。
   输入的字符串以!结束。
1.程序分析:
2.程序源代码:
#include “stdio.h”
main()
{FILE *fp;
char str[100],filename[10];
int i=0;
if((fp=fopen(“test”,”w”))==NULL)
{ printf(“cannot open the file\n”);
exit(0);}
printf(“please input a string:\n”);
gets(str);
while(str[i]!=’!')
{ if(str[i]>=’a'&&str[i]<=’z')
str[i]=str[i]-32;
fputc(str[i],fp);
i++;}
fclose(fp);
fp=fopen(“test”,”r”);
fgets(str,strlen(str)+1,fp);
printf(“%s\n”,str);
fclose(fp);
}
==============================================================
【程序99】
题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),
   输出到一个新文件C中。
1.程序分析:
2.程序源代码:
#include “stdio.h”
main()
{ FILE *fp;
int i,j,n,ni;
char c[160],t,ch;
if((fp=fopen(“A”,”r”))==NULL)
{printf(“file A cannot be opened\n”);
exit(0);}
printf(“\n A contents are :\n”);
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;
putchar(c[i]);
}
fclose(fp);
ni=i;
if((fp=fopen(“B”,”r”))==NULL)
{printf(“file B cannot be opened\n”);
exit(0);}
printf(“\n B contents are :\n”);
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;
putchar(c[i]);
}
fclose(fp);
n=i;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(c[i]>c[j])
{t=c[i];c[i]=c[j];c[j]=t;}
printf(“\n C file is:\n”);
fp=fopen(“C”,”w”);
for(i=0;i<n;i++)
{ putc(c[i],fp);
putchar(c[i]);
}
fclose(fp);
}
==============================================================
【程序100】
题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出
   平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件”stud”中。
1.程序分析:
2.程序源代码:
#include “stdio.h”
struct student
{ char num[6];
char name[8];
int score[3];
float avr;
} stu[5];
main()
{int i,j,sum;
FILE *fp;
/*input*/
for(i=0;i<5;i++)
{ printf(“\n please input No. %d score:\n”,i);
printf(“stuNo:”);
scanf(“%s”,stu[i].num);
printf(“name:”);
scanf(“%s”,stu[i].name);
sum=0;
for(j=0;j<3;j++)
{ printf(“score %d.”,j+1);
scanf(“%d”,&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].avr=sum/3.0;
}
fp=fopen(“stud”,”w”);
for(i=0;i<5;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf(“file write error\n”);
fclose(fp);
}

经典c程序100例==81–90

【程序81】
题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
1.程序分析:
2.程序源代码:
output(long b,long i)
{ printf(“\n%ld/%ld=809*%ld+%ld”,b,i,i,b%i);
}
main()
{long int a,b,i;
a=809;
for(i=10;i<100;i++)
{b=i*a+1;
if(b>=1000&&b<=10000&&8*i<100&&9*i>=100)
output(b,i); }
}
==============================================================
【程序82】
题目:八进制转换为十进制
1.程序分析:           
2.程序源代码:
main()
{ char *p,s[6];int n;
p=s;
gets(p);
n=0;
while(*(p)!=’\0′)
{n=n*8+*p-’0′;
p++;}
printf(“%d”,n);
}
==============================================================
【程序83】
题目:求0—7所能组成的奇数个数。
1.程序分析:
2.程序源代码:
main()
{
long sum=4,s=4;
int j;
for(j=2;j<=8;j++)/*j is place of number*/
{ printf(“\n%ld”,sum);
if(j<=2)
s*=7;
else
s*=8;
sum+=s;}
printf(“\nsum=%ld”,sum);
}
==============================================================
【程序84】
题目:一个偶数总能表示为两个素数之和。
1.程序分析:
2.程序源代码:
#include “stdio.h”
#include “math.h”
main()
{ int a,b,c,d;
scanf(“%d”,&a);
for(b=3;b<=a/2;b+=2)
{ for(c=2;c<=sqrt(b);c++)
if(b%c==0) break;
if(c>sqrt(b))
d=a-b;
else
break;
for(c=2;c<=sqrt(d);c++)
if(d%c==0) break;
if(c>sqrt(d))
printf(“%d=%d+%d\n”,a,b,d);
}
}
==============================================================
【程序85】
题目:判断一个素数能被几个9整除
1.程序分析:
2.程序源代码:
main()
{ long int m9=9,sum=9;
int zi,n1=1,c9=1;
scanf(“%d”,&zi);
while(n1!=0)
{ if(!(sum%zi))
n1=0;
else
{m9=m9*10;
sum=sum+m9;
c9++;
}
}
printf(“%ld,can be divided by %d \”9\”",sum,c9);
}
==============================================================
【程序86】
题目:两个字符串连接程序
1.程序分析:
2.程序源代码:
#include “stdio.h”
main()
{char a[]=”acegikm”;
char b[]=”bdfhjlnpq”;
char c[80],*p;
int i=0,j=0,k=0;
while(a[i]!=’\0′&&b[j]!=’\0′)
{if (a[i] { c[k]=a[i];i++;}
else
c[k]=b[j++];
k++;
}
c[k]=’\0′;
if(a[i]==’\0′)
p=b+j;
else
p=a+i;
strcat(c,p);
puts(c);
}
==============================================================
【程序87】
题目:回答结果(结构体变量传递)
1.程序分析:     
2.程序源代码:
#include “stdio.h”
struct student
{ int x;
char c;
} a;
main()
{a.x=3;
a.c=’a';
f(a);
printf(“%d,%c”,a.x,a.c);
}
f(struct student b)
{
b.x=20;
b.c=’y';
}
==============================================================
【程序88】
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
1.程序分析:
2.程序源代码:
main()
{int i,a,n=1;
while(n<=7)
{ do {
   scanf(“%d”,&a);
   }while(a<1||a>50);
for(i=1;i<=a;i++)
 printf(“*”);
printf(“\n”);
n++;}
getch();
}
==============================================================
【程序89】
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:
   每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
1.程序分析:
2.程序源代码:
main()
{int a,i,aa[4],t;
scanf(“%d”,&a);
aa[0]=a%10;
aa[1]=a%100/10;
aa[2]=a%1000/100;
aa[3]=a/1000;
for(i=0;i<=3;i++)
 {aa[i]+=5;
 aa[i]%=10;
 }
for(i=0;i<=3/2;i++)
 {t=aa[i];
 aa[i]=aa[3-i];
 aa[3-i]=t;
 }
for(i=3;i>=0;i–)
printf(“%d”,aa[i]);
}
==============================================================
【程序90】
题目:专升本一题,读结果。
1.程序分析:
2.程序源代码:
#include “stdio.h”
#define M 5
main()
{int a[M]={1,2,3,4,5};
int i,j,t;
i=0;j=M-1;
while(i {t=*(a+i);
*(a+i)=*(a+j);
*(a+j)=t;
i++;j–;
}
for(i=0;i printf(“%d”,*(a+i));
}

经典c程序100例==71–80

【程序71】
题目:编写input()和output()函数输入,输出5个学生的数据记录。
1.程序分析:
2.程序源代码:
#define N 5
struct student
{ char num[6];
 char name[8];
 int score[4];
} stu[N];
input(stu)
struct student stu[];
{ int i,j;
 for(i=0;i<N;i++)
 { printf(“\n please input %d of %d\n”,i+1,N);
  printf(“num: “);
  scanf(“%s”,stu[i].num);
  printf(“name: “);
  scanf(“%s”,stu[i].name);
   for(j=0;j<3;j++)
   { printf(“score %d.”,j+1);
    scanf(“%d”,&stu[i].score[j]);
   }
  printf(“\n”);
 }
}
print(stu)
struct student stu[];
{ int i,j;
printf(“\nNo. Name Sco1 Sco2 Sco3\n”);
for(i=0;i<N;i++)
{ printf(“%-6s%-10s”,stu[i].num,stu[i].name);
 for(j=0;j<3;j++)
  printf(“%-8d”,stu[i].score[j]);
 printf(“\n”);
}
}
main()
{
 input();
 print();
}
==============================================================
【程序72】
题目:创建一个链表。
1.程序分析:           
2.程序源代码:
/*creat a list*/
#include “stdlib.h”
#include “stdio.h”
struct list
{ int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
void main()
{ link ptr,head;
int num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf(“please input 5 numbers==>\n”);
for(i=0;i<=4;i++)
{
 scanf(“%d”,&num);
 ptr->data=num;
 ptr->next=(link)malloc(sizeof(node));
 if(i==4) ptr->next=NULL;
 else ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{ printf(“The value is ==>%d\n”,ptr->data);
 ptr=ptr->next;
}
}
==============================================================
【程序73】
题目:反向输出一个链表。   
1.程序分析:
2.程序源代码:
/*reverse output a list*/
#include “stdlib.h”
#include “stdio.h”
struct list
{ int data;
 struct list *next;
};
typedef struct list node;
typedef node *link;
void main()
{ link ptr,head,tail; 
 int num,i;
 tail=(link)malloc(sizeof(node));
 tail->next=NULL;
 ptr=tail;
 printf(“\nplease input 5 data==>\n”);
 for(i=0;i<=4;i++)
 {
  scanf(“%d”,&num);
  ptr->data=num;
  head=(link)malloc(sizeof(node));
  head->next=ptr;
  ptr=head;
 }
ptr=ptr->next;
while(ptr!=NULL)
{ printf(“The value is ==>%d\n”,ptr->data);
 ptr=ptr->next;
}}
==============================================================
【程序74】
题目:连接两个链表。
1.程序分析:
2.程序源代码:
#include “stdlib.h”
#include “stdio.h”
struct list
{ int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
link delete_node(link pointer,link tmp)
{if (tmp==NULL) /*delete first node*/
 return pointer->next;
else
{ if(tmp->next->next==NULL)/*delete last node*/
  tmp->next=NULL;
 else /*delete the other node*/
  tmp->next=tmp->next->next;
 return pointer;
}
}
void selection_sort(link pointer,int num)
{ link tmp,btmp;
 int i,min;
 for(i=0;i<num;i++)
 {
 tmp=pointer;
 min=tmp->data;
 btmp=NULL;
 while(tmp->next)
 { if(min>tmp->next->data)
 {min=tmp->next->data;
  btmp=tmp;
 }
 tmp=tmp->next;
 }
printf(“\40: %d\n”,min);
pointer=delete_node(pointer,btmp);
}
}
link create_list(int array[],int num)
{ link tmp1,tmp2,pointer;
int i;
pointer=(link)malloc(sizeof(node));
pointer->data=array[0];
tmp1=pointer;
for(i=1;i<num;i++)
{ tmp2=(link)malloc(sizeof(node));
 tmp2->next=NULL;
 tmp2->data=array[i];
 tmp1->next=tmp2;
 tmp1=tmp1->next;
}
return pointer;
}
link concatenate(link pointer1,link pointer2)
{ link tmp;
tmp=pointer1;
while(tmp->next)
 tmp=tmp->next;
tmp->next=pointer2;
return pointer1;
}
void main(void)
{ int arr1[]={3,12,8,9,11};
 link ptr;
 ptr=create_list(arr1,5);
 selection_sort(ptr,5);
}
==============================================================
【程序75】
题目:放松一下,算一道简单的题目。
1.程序分析:
2.程序源代码:
main()
{
int i,n;
for(i=1;i<5;i++)
{ n=0;
 if(i!=1)
 n=n+1;
 if(i==3)
 n=n+1;
 if(i==4)
 n=n+1;
 if(i!=4)
 n=n+1;
 if(n==3)
  printf(“zhu hao shi de shi:%c”,64+i);
 }
}
==============================================================
【程序76】
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数
   1/1+1/3+…+1/n(利用指针函数)
1.程序分析:
2.程序源代码:
main()
#include “stdio.h”
main()
{
float peven(),podd(),dcall();
float sum;
int n;
while (1)
{
 scanf(“%d”,&n);
 if(n>1)
  break;
}
if(n%2==0)
{
 printf(“Even=”);
 sum=dcall(peven,n);
}
else
{
 printf(“Odd=”);
 sum=dcall(podd,n);
}
printf(“%f”,sum);
}
float peven(int n)
{
float s;
int i;
s=1;
for(i=2;i<=n;i+=2)
 s+=1/(float)i;
return(s);
}
float podd(n)
int n;
{
float s;
int i;
s=0;
for(i=1;i<=n;i+=2)
 s+=1/(float)i;
return(s);
}
float dcall(fp,n)
float (*fp)();
int n;
{
float s;
s=(*fp)(n);
return(s);
}
==============================================================
【程序77】
题目:填空练习(指向指针的指针)
1.程序分析:     
2.程序源代码:
main()
{ char *s[]={“man”,”woman”,”girl”,”boy”,”sister”};
char **q;
int k;
for(k=0;k<5;k++)
{       ;/*这里填写什么语句*/
 printf(“%s\n”,*q);
}
}
==============================================================
【程序78】
题目:找到年龄最大的人,并输出。请找出程序中有什么问题。
1.程序分析:
2.程序源代码:
#define N 4
#include “stdio.h”
static struct man
{ char name[20];
int age;
} person[N]={“li”,18,”wang”,19,”zhang”,20,”sun”,22};
main()
{struct man *q,*p;
int i,m=0;
p=person;
for (i=0;i<N;i++)
{if(m<p->age)
 q=p++;
 m=q->age;}
printf(“%s,%d”,(*q).name,(*q).age);
}
==============================================================
【程序79】
题目:字符串排序。
1.程序分析:
2.程序源代码:
main()
{
char *str1[20],*str2[20],*str3[20];
char swap();
printf(“please input three strings\n”);
scanf(“%s”,str1);
scanf(“%s”,str2);
scanf(“%s”,str3);
if(strcmp(str1,str2)>0) swap(str1,str2);
if(strcmp(str1,str3)>0) swap(str1,str3);
if(strcmp(str2,str3)>0) swap(str2,str3);
printf(“after being sorted\n”);
printf(“%s\n%s\n%s\n”,str1,str2,str3);
}
char swap(p1,p2)
char *p1,*p2;
{
char *p[20];
strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);
}
==============================================================
【程序80】
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只
   猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了
   一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,
   问海滩上原来最少有多少个桃子?
1.程序分析:
2.程序源代码:
main()
{int i,m,j,k,count;
for(i=4;i<10000;i+=4)
{ count=0;
m=i;
for(k=0;k<5;k++)
{
 j=i/4*5+1;
 i=j;
 if(j%4==0)
  count++;
 else
  break;
}
 i=m;
 if(count==4)
 {printf(“%d\n”,count);
  break;}
}
}

经典c程序100例==61–70

【程序61】
题目:打印出杨辉三角形(要求打印出10行如下图)   
1.程序分析:
       1
      1  1
      1  2  1
      1  3  3  1
      1  4  6  4  1
      1  5  10 10 5  1 
2.程序源代码:
main()
{int i,j;
int a[10][10];
printf(“\n”);
for(i=0;i<10;i++)
 {a[i][0]=1;
 a[i][i]=1;}
for(i=2;i<10;i++)
 for(j=1;j<i;j++)
 a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++)
 {for(j=0;j<=i;j++)
 printf(“%5d”,a[i][j]);
 printf(“\n”);
 }
}
==============================================================
【程序62】
题目:学习putpixel画点。
1.程序分析:            
2.程序源代码:
#include “stdio.h”
#include “graphics.h”
main()
{
int i,j,driver=VGA,mode=VGAHI;
initgraph(&driver,&mode,”");
setbkcolor(YELLOW);
for(i=50;i<=230;i+=20)
 for(j=50;j<=230;j++)
 putpixel(i,j,1);
for(j=50;j<=230;j+=20)
 for(i=50;i<=230;i++)
 putpixel(i,j,1);
}
==============================================================
【程序63】
题目:画椭圆ellipse   
1.程序分析:
2.程序源代码:
#include “stdio.h”
#include “graphics.h”
#include “conio.h”
main()
{
int x=360,y=160,driver=VGA,mode=VGAHI;
int num=20,i;
int top,bottom;
initgraph(&driver,&mode,”");
top=y-30;
bottom=y-30;
for(i=0;i<num;i++)
{
ellipse(250,250,0,360,top,bottom);
top-=5;
bottom+=5;
}
getch();
}
==============================================================
【程序64】
题目:利用ellipse and rectangle 画图。
1.程序分析:
2.程序源代码:
#include “stdio.h”
#include “graphics.h”
#include “conio.h”
main()
{
int driver=VGA,mode=VGAHI;
int i,num=15,top=50;
int left=20,right=50;
initgraph(&driver,&mode,”");
for(i=0;i<num;i++)
{
ellipse(250,250,0,360,right,left);
ellipse(250,250,0,360,20,top);
rectangle(20-2*i,20-2*i,10*(i+2),10*(i+2));
right+=5;
left+=5;
top+=10;
}
getch();
}
==============================================================
【程序65】
题目:一个最优美的图案。   
1.程序分析:
2.程序源代码:
#include “graphics.h”
#include “math.h”
#include “dos.h”
#include “conio.h”
#include “stdlib.h”
#include “stdio.h”
#include “stdarg.h”
#define MAXPTS 15
#define PI 3.1415926
struct PTS {
int x,y;
};
double AspectRatio=0.85;
void LineToDemo(void)
{
struct viewporttype vp;
struct PTS points[MAXPTS];
int i, j, h, w, xcenter, ycenter;
int radius, angle, step;
double rads;
printf(” MoveTo / LineTo Demonstration” );
getviewsettings( &vp );
h = vp.bottom – vp.top;
w = vp.right – vp.left;
xcenter = w / 2; /* Determine the center of circle */
ycenter = h / 2;
radius = (h – 30) / (AspectRatio * 2);
step = 360 / MAXPTS; /* Determine # of increments */
angle = 0; /* Begin at zero degrees */
for( i=0 ; i<MAXPTS ; ++i ){ /* Determine circle intercepts */
rads = (double)angle * PI / 180.0; /* Convert angle to radians */
points[i].x = xcenter + (int)( cos(rads) * radius );
points[i].y = ycenter – (int)( sin(rads) * radius * AspectRatio );
angle += step; /* Move to next increment */
}
circle( xcenter, ycenter, radius ); /* Draw bounding circle */
for( i=0 ; i<MAXPTS ; ++i ){ /* Draw the cords to the circle */
for( j=i ; j<MAXPTS ; ++j ){ /* For each remaining intersect */
moveto(points[i].x, points[i].y); /* Move to beginning of cord */
lineto(points[j].x, points[j].y); /* Draw the cord */
} } }
main()
{int driver,mode;
driver=CGA;mode=CGAC0;
initgraph(&driver,&mode,”");
setcolor(3);
setbkcolor(GREEN);
LineToDemo();}
==============================================================
【程序66】
题目:输入3个数a,b,c,按大小顺序输出。   
1.程序分析:利用指针方法。
2.程序源代码:
/*pointer*/
main()
{
int n1,n2,n3;
int *pointer1,*pointer2,*pointer3;
printf(“please input 3 number:n1,n2,n3:”);
scanf(“%d,%d,%d”,&n1,&n2,&n3);
pointer1=&n1;
pointer2=&n2;
pointer3=&n3;
if(n1>n2) swap(pointer1,pointer2);
if(n1>n3) swap(pointer1,pointer3);
if(n2>n3) swap(pointer2,pointer3);
printf(“the sorted numbers are:%d,%d,%d\n”,n1,n2,n3);
}
swap(p1,p2)
int *p1,*p2;
{int p;
p=*p1;*p1=*p2;*p2=p;
}
==============================================================
【程序67】
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
1.程序分析:谭浩强的书中答案有问题。      
2.程序源代码:
main()
{
int number[10];
input(number);
max_min(number);
output(number);
}
input(number)
int number[10];
{int i;
for(i=0;i<9;i++)
 scanf(“%d,”,&number[i]);
 scanf(“%d”,&number[9]);
}
max_min(array)
int array[10];
{int *max,*min,k,l;
int *p,*arr_end;
arr_end=array+10;
max=min=array;
for(p=array+1;p<arr_end;p++)
 if(*p>*max) max=p;
 else if(*p<*min) min=p;
 k=*max;
 l=*min;
 *p=array[0];array[0]=l;l=*p;
 *p=array[9];array[9]=k;k=*p;
 return;
}
output(array)
int array[10];
{ int *p;
for(p=array;p<array+9;p++)
 printf(“%d,”,*p);
printf(“%d\n”,array[9]);
}
==============================================================
【程序68】
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
1.程序分析:
2.程序源代码:
main()
{
int number[20],n,m,i;
printf(“the total numbers is:”);
scanf(“%d”,&n);
printf(“back m:”);
scanf(“%d”,&m);
for(i=0;i<n-1;i++)
 scanf(“%d,”,&number[i]);
scanf(“%d”,&number[n-1]);
move(number,n,m);
for(i=0;i<n-1;i++)
 printf(“%d,”,number[i]);
printf(“%d”,number[n-1]);
}
move(array,n,m)
int n,m,array[20];
{
int *p,array_end;
array_end=*(array+n-1);
for(p=array+n-1;p>array;p–)
 *p=*(p-1);
 *array=array_end;
 m–;
 if(m>0) move(array,n,m);
}
==============================================================
【程序69】
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出
   圈子,问最后留下的是原来第几号的那位。
1. 程序分析:
2.程序源代码:
#define nmax 50
main()
{
int i,k,m,n,num[nmax],*p;
printf(“please input the total of numbers:”);
scanf(“%d”,&n);
p=num;
for(i=0;i<n;i++)
 *(p+i)=i+1;
 i=0;
 k=0;
 m=0;
 while(m<n-1)
 {
 if(*(p+i)!=0) k++;
 if(k==3)
 { *(p+i)=0;
 k=0;
 m++;
 }
i++;
if(i==n) i=0;
}
while(*p==0) p++;
printf(“%d is left\n”,*p);
}
==============================================================
【程序70】
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。   
1.程序分析:
2.程序源代码:
main()
{
int len;
char *str[20];
printf(“please input a string:\n”);
scanf(“%s”,str);
len=length(str);
printf(“the string has %d characters.”,len);
}
length(p)
char *p;
{
int n;
n=0;
while(*p!=’\0′)
{
 n++;
 p++;
}
return n;
}

2004年11月26日

经典c程序100例==51–60

【程序51】
题目:学习使用按位与 & 。   
1.程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1
2.程序源代码:
#include “stdio.h”
main()
{
int a,b;
a=077;
b=a&3;
printf(“\40: The a & b(decimal) is %d \n”,b);
b&=7;
printf(“\40: The a & b(decimal) is %d \n”,b);
}
==============================================================
【程序52】
题目:学习使用按位或 | 。
1.程序分析:0|0=0; 0|1=1; 1|0=1; 1|1=1            
2.程序源代码:
#include “stdio.h”
main()
{
int a,b;
a=077;
b=a|3;
printf(“\40: The a & b(decimal) is %d \n”,b);
b|=7;
printf(“\40: The a & b(decimal) is %d \n”,b);
}
==============================================================
【程序53】
题目:学习使用按位异或 ^ 。   
1.程序分析:0^0=0; 0^1=1; 1^0=1; 1^1=0
2.程序源代码:
#include “stdio.h”
main()
{
int a,b;
a=077;
b=a^3;
printf(“\40: The a & b(decimal) is %d \n”,b);
b^=7;
printf(“\40: The a & b(decimal) is %d \n”,b);
}
==============================================================
【程序54】
题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4)
(3)将上面二者进行&运算。
2.程序源代码:
main()
{
unsigned a,b,c,d;
scanf(“%o”,&a);
b=a>>4;
c=~(~0<<4);
d=b&c;
printf(“%o\n%o\n”,a,d);
}
==============================================================
【程序55】
题目:学习使用按位取反~。   
1.程序分析:~0=1; ~1=0;
2.程序源代码:
#include “stdio.h”
main()
{
int a,b;
a=234;
b=~a;
printf(“\40: The a’s 1 complement(decimal) is %d \n”,b);
a=~a;
printf(“\40: The a’s 1 complement(hexidecimal) is %x \n”,a);
}
==============================================================
【程序56】
题目:画图,学用circle画圆形。   
1.程序分析:
2.程序源代码:
/*circle*/
#include “graphics.h”
main()
{int driver,mode,i;
float j=1,k=1;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,”");
setbkcolor(YELLOW);
for(i=0;i<=25;i++)
{
setcolor(8);
circle(310,250,k);
k=k+j;
j=j+0.3;
}
}
==============================================================
【程序57】
题目:画图,学用line画直线。
1.程序分析:           
2.程序源代码:
#include “graphics.h”
main()
{int driver,mode,i;
float x0,y0,y1,x1;
float j=12,k;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,”");
setbkcolor(GREEN);
x0=263;y0=263;y1=275;x1=275;
for(i=0;i<=18;i++)
{
setcolor(5);
line(x0,y0,x0,y1);
x0=x0-5;
y0=y0-5;
x1=x1+5;
y1=y1+5;
j=j+10;
}
x0=263;y1=275;y0=263;
for(i=0;i<=20;i++)
{
setcolor(5);
line(x0,y0,x0,y1);
x0=x0+5;
y0=y0+5;
y1=y1-5;
}
}
==============================================================
【程序58】
题目:画图,学用rectangle画方形。   
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
2.程序源代码:
#include “graphics.h”
main()
{int x0,y0,y1,x1,driver,mode,i;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,”");
setbkcolor(YELLOW);
x0=263;y0=263;y1=275;x1=275;
for(i=0;i<=18;i++)
{
setcolor(1);
rectangle(x0,y0,x1,y1);
x0=x0-5;
y0=y0-5;
x1=x1+5;
y1=y1+5;
}
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
outtextxy(150,40,”How beautiful it is!”);
line(130,60,480,60);
setcolor(2);
circle(269,269,137);
}
==============================================================
【程序59】
题目:画图,综合例子。
1.程序分析:
2.程序源代码:
# define PAI 3.1415926
# define B 0.809
# include “graphics.h”
#include “math.h”
main()
{
int i,j,k,x0,y0,x,y,driver,mode;
float a;
driver=CGA;mode=CGAC0;
initgraph(&driver,&mode,”");
setcolor(3);
setbkcolor(GREEN);
x0=150;y0=100;
circle(x0,y0,10);
circle(x0,y0,20);
circle(x0,y0,50);
for(i=0;i<16;i++)
{
 a=(2*PAI/16)*i;
 x=ceil(x0+48*cos(a));
 y=ceil(y0+48*sin(a)*B);
 setcolor(2); line(x0,y0,x,y);}
setcolor(3);circle(x0,y0,60);
/* Make 0 time normal size letters */
settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
outtextxy(10,170,”press a key”);
getch();
setfillstyle(HATCH_FILL,YELLOW);
floodfill(202,100,WHITE);
getch();
for(k=0;k<=500;k++)
{
 setcolor(3);
 for(i=0;i<=16;i++)
 {
  a=(2*PAI/16)*i+(2*PAI/180)*k;
  x=ceil(x0+48*cos(a));
  y=ceil(y0+48+sin(a)*B);
  setcolor(2); line(x0,y0,x,y);
 }
 for(j=1;j<=50;j++)
 {
  a=(2*PAI/16)*i+(2*PAI/180)*k-1;
  x=ceil(x0+48*cos(a));
  y=ceil(y0+48*sin(a)*B);
  line(x0,y0,x,y);
 }
}
restorecrtmode();
}
==============================================================
【程序60】
题目:画图,综合例子。   
1.程序分析:
2.程序源代码:
#include “graphics.h”
#define LEFT 0
#define TOP 0
#define RIGHT 639
#define BOTTOM 479
#define LINES 400
#define MAXCOLOR 15
main()
{
int driver,mode,error;
int x1,y1;
int x2,y2;
int dx1,dy1,dx2,dy2,i=1;
int count=0;
int color=0;
driver=VGA;
mode=VGAHI;
initgraph(&driver,&mode,”");
x1=x2=y1=y2=10;
dx1=dy1=2;
dx2=dy2=3;
while(!kbhit())
{
 line(x1,y1,x2,y2);
 x1+=dx1;y1+=dy1;
 x2+=dx2;y2+dy2;
 if(x1<=LEFT||x1>=RIGHT)
 dx1=-dx1;
 if(y1<=TOP||y1>=BOTTOM)
  dy1=-dy1;
 if(x2<=LEFT||x2>=RIGHT)
  dx2=-dx2;
 if(y2<=TOP||y2>=BOTTOM)
  dy2=-dy2;
 if(++count>LINES)
 {
  setcolor(color);
  color=(color>=MAXCOLOR)?0:++color;
 }
}
closegraph();
}

2004年11月25日

1. 男人是社会的主体,不管你信或不信。所以男人应该有种责任感。  
  2. 25岁之前,请记得,爱情通常是假的,或者不是你所想象的那样纯洁和永远。如果你过了25岁,那么你应该懂得这个道理。  
  3. 吃饭7成饱最舒服。对待女友最多也请你保持在7成。  
  4. 30岁之前请爱惜自己的身体,前30年你找病,后30年病找你。如果你过了30岁,你自然也会懂得这个道理。  
  5. 事业远比爱情重要。如果说事业都不能永恒,那么爱情只能算是昙花一现。  
  6. 不要轻易接受追求你的女孩。女追男隔层纱。如果你很容易就陷进去,你会发现你会错过很多东西,失去很多东西。  
  7. 请你相信,能用钱解决的问题,都不是问题。如果你认为钱索王道,有钱有女人,没钱没女人,那么。女人不是问题。  
  8 . 请永远积极向上。每个男人都有他可爱的地方,但是不可爱的地方只有不积极面对生活。  
  9. 不要连续2次让同一个女人伤害。好马不吃回头草,是有他道理的。如果认真考虑过该分手,那么请不要做任何舍不得的行动。  
  10. 如果你和你前女友能做朋友,那么你要问自己:为什么?如果分手后还是朋友,那么只有2个可能:。你们当初都只是玩玩而已,没付出彼此最真的感情。或者:必定有个人是在默默的付出无怨无悔!  
  11. 永远不要太相信女人在恋爱时的甜言蜜语。都说女人爱听甜言蜜语,其实,男人更喜欢。  
  12. 请不要为自己的相貌或者身高过分担心和自卑。人是动物,但是区别于动物。先天条件并不是阻挡你好好生活的借口。人的心灵远胜于相貌,请相信这点。如果有人以相貌取人,那么你也没必要太在意。因为他从某种意义来讲,只是只动物。你会跟动物怄气吗?  
  13. 失恋时,只有2种可能,要么你爱她她不爱你,或者相反。那么,当你爱的人不再爱你,或者从来没爱过你时。你没有遗憾,因为你失去的只是一个不爱你的人。  
  14. 请不要欺骗善良的女孩。这个世界上,善良的女孩太少。  
  15. 不能偏激的认为金钱万能,至少,金钱治不好艾滋病。  
  16. 请一定要有自信。你就是一道风景,没必要在别人风景里面仰视。  
  17. 受到再大的打击,只要生命还在,请相信每天的太阳都是新的。  
  18. 爱情永远不可能是天平。你想在爱情里幸福就要舍得伤心。  
  19. 如果你喜欢一个认为别人应该对她好的mm,请尽早放弃。没有人是应该对一个人好的。如果她不明白这个道理,也就是她根本不懂得珍惜。  
  20. 不要因为寂寞而找gf,寂寞男人请要学会品味寂寞。请记住:即使寂寞,远方黑暗的夜空下,一定有人和你一样,寂寞的人不同,仰望的星空却是唯一。  
  21. 任何事没有永远。也别问怎样才能永远。生活有很多无奈。请尽量充实自己,充实生活。请善待生活。  

2004年11月24日

经典c程序100例==41–50

【程序41】
题目:学习static定义静态变量的用法   
1.程序分析:
2.程序源代码:
#include “stdio.h”
varfunc()
{
int var=0;
static int static_var=0;
printf(“\40:var equal %d \n”,var);
printf(“\40:static var equal %d \n”,static_var);
printf(“\n”);
var++;
static_var++;
}
void main()
{int i;
 for(i=0;i<3;i++)
  varfunc();
}
==============================================================
【程序42】
题目:学习使用auto定义变量的用法
1.程序分析:      
2.程序源代码:
#include “stdio.h”
main()
{int i,num;
num=2;
 for (i=0;i<3;i++)
 { printf(“\40: The num equal %d \n”,num);
  num++;
  {
  auto int num=1;
  printf(“\40: The internal block num equal %d \n”,num);
  num++;
  }
 }
}
==============================================================
【程序43】
题目:学习使用static的另一用法。   
1.程序分析:
2.程序源代码:
#include “stdio.h”
main()
{
int i,num;
num=2;
for(i=0;i<3;i++)
{
printf(“\40: The num equal %d \n”,num);
num++;
{
static int num=1;
printf(“\40:The internal block num equal %d\n”,num);
num++;
}
}
}
==============================================================
【程序44】
题目:学习使用external的用法。
1.程序分析:
2.程序源代码:
#include “stdio.h”
int a,b,c;
void add()
{ int a;
a=3;
c=a+b;
}
void main()
{ a=b=4;
add();
printf(“The value of c is equal to %d\n”,c);
}
==============================================================
【程序45】
题目:学习使用register定义变量的方法。
1.程序分析:
2.程序源代码:
void main()
{
register int i;
int tmp=0;
for(i=1;i<=100;i++)
tmp+=i;
printf(“The sum is %d\n”,tmp);
}
==============================================================
【程序46】
题目:宏#define命令练习(1)   
1.程序分析:
2.程序源代码:
#include “stdio.h”
#define TRUE 1
#define FALSE 0
#define SQ(x) (x)*(x)
void main()
{
int num;
int again=1;
printf(“\40: Program will stop if input value less than 50.\n”);
while(again)
{
printf(“\40:Please input number==>”);
scanf(“%d”,&num);
printf(“\40:The square for this number is %d \n”,SQ(num));
if(num>=50)
 again=TRUE;
else
 again=FALSE;
}
}
==============================================================
【程序47】
题目:宏#define命令练习(2)
1.程序分析:            
2.程序源代码:
#include “stdio.h”
#define exchange(a,b) { \ /*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上”\”*/
            int t;\
            t=a;\
            a=b;\
            b=t;\
           }
void main(void)
{
int x=10;
int y=20;
printf(“x=%d; y=%d\n”,x,y);
exchange(x,y);
printf(“x=%d; y=%d\n”,x,y);
}
==============================================================
【程序48】
题目:宏#define命令练习(3)   
1.程序分析:
2.程序源代码:
#define LAG >
#define SMA <
#define EQ ==
#include “stdio.h”
void main()
{ int i=10;
int j=20;
if(i LAG j)
printf(“\40: %d larger than %d \n”,i,j);
else if(i EQ j)
printf(“\40: %d equal to %d \n”,i,j);
else if(i SMA j)
printf(“\40:%d smaller than %d \n”,i,j);
else
printf(“\40: No such value.\n”);
}
==============================================================
【程序49】
题目:#if #ifdef和#ifndef的综合应用。
1. 程序分析:
2.程序源代码:
#include “stdio.h”
#define MAX
#define MAXIMUM(x,y) (x>y)?x:y
#define MINIMUM(x,y) (x>y)?y:x
void main()
{ int a=10,b=20;
#ifdef MAX
printf(“\40: The larger one is %d\n”,MAXIMUM(a,b));
#else
printf(“\40: The lower one is %d\n”,MINIMUM(a,b));
#endif
#ifndef MIN
printf(“\40: The lower one is %d\n”,MINIMUM(a,b));
#else
printf(“\40: The larger one is %d\n”,MAXIMUM(a,b));
#endif
#undef MAX
#ifdef MAX
printf(“\40: The larger one is %d\n”,MAXIMUM(a,b));
#else
printf(“\40: The lower one is %d\n”,MINIMUM(a,b));
#endif
#define MIN
#ifndef MIN
printf(“\40: The lower one is %d\n”,MINIMUM(a,b));
#else
printf(“\40: The larger one is %d\n”,MAXIMUM(a,b));
#endif
}
==============================================================
【程序50】
题目:#include 的应用练习   
1.程序分析:
2.程序源代码:
test.h 文件如下:
#define LAG >
#define SMA <
#define EQ ==
#include “test.h” /*一个新文件50.c,包含test.h*/
#include “stdio.h”
void main()
{ int i=10;
int j=20;
if(i LAG j)
printf(“\40: %d larger than %d \n”,i,j);
else if(i EQ j)
printf(“\40: %d equal to %d \n”,i,j);
else if(i SMA j)
printf(“\40:%d smaller than %d \n”,i,j);
else
printf(“\40: No such value.\n”);
}

2004年11月19日








三天学好ADO之第三天









今天来说一下Recordset对象的一些方法。
1、AddNew 方法
创建可更新 Recordset 对象的新记录。
recordset.AddNew FieldList, Values
FieldList   可选。新记录中字段的单个名称、一组名称或序号位置。
Values   可选。新记录中字段的单个或一组值。如果 Fields 是数组,那么 Values 也必须是有相同成员数的数组,否则将发生错误。字段名称的次序必须与每个数组中的字段值的次序相匹配。


我们一般是
rs.addnew
rs(“xx”)=xx
rs(“xx”)=xx
rs.update
需要注意的是在立即更新模式(调用 Update 方法时提供者会立即将更改写入基本数据源)下,调用不带参数的 AddNew 方法可将 EditMode 属性设置为 adEditAdd。提供者将任何字段值的更改缓存在本地。调用 Update 方法可将新记录传递到数据库并将 EditMode 属性重置为 adEditNone。如果传送了 Fields 和 Values 参数,ADO 则立即将新记录传递到数据库(无须调用 Update),且 EditMode 属性值没有改变 (adEditNone)。
可能大家会问在ASP中使用ADO的AddNew方法和直接使用“Insert into…”语句有和不同?那种方式更好?答:ADO的AddNew方法只是将“Insert into ”语句封装了起来,所以,当对大量数据进行操作的时候,直接使用SQL语句将会大大加快存取数据的速度,因为他减少了ADO的“翻译”时间。


2、Delete 方法
删除当前记录或记录组。
recordset.Delete AffectRecords


AffectRecords   AffectEnum 值,确定 Delete 方法所影响的记录数目,该值可以是下列常量之一。
AdAffectCurrent 默认。仅删除当前记录。
AdAffectGroup 删除满足当前 Filter 属性设置的记录。要使用该选项,必须将 Filter 属性设置为有效的预定义常量之一。
adAffectAll 删除所有记录。
adAffectAllChapters 删除所有子集记录。
使用立即更新模式将在数据库中进行立即删除,否则记录将标记为从缓存删除,实际的删除将在调用 Update 方法时进行。


3、Update 方法
保存对 Recordset 对象的当前记录所做的所有更改
recordset.Update Fields, Values
Fields   可选。变体型,代表单个名称;或变体型数组,代表需要修改的字段(一个或多个)名称及序号位置。
Values   可选。变体型,代表单个值;或变体型数组,代表新记录中字段(单个或多个)值。
如果希望取消对当前记录所做的任何更改或者放弃新添加的记录,则必须调用 CancelUpdate 方法。


4、CancelUpdate 方法
recordset.CancelUpdate
使用 CancelUpdate 方法可取消对当前记录所作的任何更改或放弃新添加的记录。在调用 Update 方法后将无法撤消对当前记录或新记录所做的更改,如果在调用 CancelUpdate 方法时添加新记录,则调用 AddNew 之前的当前记录将再次成为当前记录。如果尚未更改当前记录或添加新记录,调用 CancelUpdate 方法将产生错误。


5、Find 方法
搜索 Recordset 中满足指定标准的记录。如果满足标准,则记录集位置设置在找到的记录上,否则位置将设置在记录集的末尾。
Find (criteria, SkipRows, searchDirection, start)
criteria   字符串,包含指定用于搜索的列名、比较操作符和值的语句。
SkipRows    可选,长整型值,其默认值为零,它指定当前行或 start 书签的位移以开始搜索。
searchDirection    可选的 SearchDirectionEnum 值,指定搜索应从当前行还是下一个有效行开始。其值可为 adSearchForward 或


adSearchBackward。搜索是在记录集的开始还是末尾结束由 searchDirection 值决定。
start    可选,变体型书签,用作搜索的开始位置。
criteria “比较操作符”可以是“>”(大于)、“<”(小于)、“=”(等于)、“>=”(大于或等于)、“<=”(小于或等于)、“<>”


(不等于)或“like”(模式匹配)。 criteria 中的值可以是字符串、浮点数或者日期。字符串值以单引号分界(如“state = ‘WA’”)。


日期值以“#”(数字记号)分界(如“start_date > #7/22/97#”)。
需要注意的是find是不支持多字段。但是可以用filter实现。”name=’abc’”AND “city=’sh’” 是不允许的


6、Move 方法
移动 Recordset 对象中当前记录的位置
recordset.Move NumRecords, Start
NumRecords    带符号长整型表达式,指定当前记录位置移动的记录数。
Start    可选,字符串或变体型,用于计算书签。也可为下列值之一:
AdBookmarkCurrent 默认。从当前记录开始。
AdBookmarkFirst 从首记录开始。
AdBookmarkLast 从尾记录开始。
需要注意的是:
(1)如果 NumRecords 参数大于零,则当前记录位置将向前移动(向记录集的末尾)。如果 NumRecords 小于零,则当前记录位置向后移动(向记录集的开始)。
(2)从空的 Recordset 对象调用 Move 方法将产生错误。
(3)如果 Move 调用将当前记录位置移动到首记录之前,则 ADO 将当前记录放置在记录集(BOF 为 True)的首记录之前。在 BOF 属性已经为 True 时试图向后移动将产生错误;如果 Move 调用将当前记录位置移动到尾记录之后,则 ADO 将当前记录放置在记录集(EOF 为 True)的尾记录之后。在 EOF 属性已经为 True 时试图向前移动将产生错误。


7、MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法
在指定 Recordset 对象中移动到第一个、最后一个、下一个或前一个记录并使该记录成为当前记录。
recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}
需要注意的是:
(1)使用 MoveNext 方法将当前记录向前移动一个记录(向 Recordset 的底部)。如果最后一个记录是当前记录并且调用 MoveNext 方法,则 ADO 将当前记录设置到 Recordset (EOF 为 True)的尾记录之后。当 EOF 属性已经为 True 时试图向前移动将产生错误。
(2)使用 MovePrevious 方法将当前记录位置向后移动一个记录(向记录集的顶部)。Recordset 对象必须支持向后游标移动;否则方法调用将产生错误。如果首记录是当前记录并且调用 MovePrevious 方法,则 ADO 将当前记录设置在 Recordset (BOF 为 True)的首记录之前。而 BOF 属性为 True 时向后移动将产生错误。


8、Clone 方法
创建与现有 Recordset 对象相同的复制 Recordset 对象。可选择指定该副本为只读。
Set rstDuplicate = rstOriginal.Clone
rstDuplicate   对象变量,标识正在创建的复制 Recordset 对象。
rstOriginal   对象变量,标识要被复制的 Recordset 对象。
使用 Clone 方法可创建多个 Recordset 对象副本,这对于希望在给定的记录组中保留多个当前记录十分有用。使用 Clone 方法比使用与初始定义相同的定义创建和打开新 Recordset 对象要有效得多。
也就是说
rs.open exec,conn,1,1
rs2.open exec,conn,1,1
应该这么改写
rs.open exec,conn,1,1
rs2=rs.clone


需要注意的是:
(1)新创建副本的当前记录将设置为首记录。
(2)关闭原始 Recordset 时并不关闭它的副本,而关闭某个副本也将不关闭原始 Recordset 或任何其他副本。


9、Close 方法
关闭打开的对象及任何相关对象。
object.Close
需要注意的是:
(1)使用 Close 方法可关闭Recordset 对象以便释放所有关联的系统资源。关闭对象并非将它从内存中删除,可以更改它的属性设置并且在


此后再次打开。要将对象从内存中完全删除,可将对象变量设置为 Nothing。
(2)如果正在立即更新模式下进行编辑,调用 Close 方法将产生错误,应首先调用 Update 或 CancelUpdate 方法。



10、Open 方法,为什么最后说这个,因为前面的各项属性方法没有弄清楚,我们是不会理解CursorType参数的
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。ActiveConnection


Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据


库连接信息(ConnectionString)的字符串参数。CursorType


Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及ad


OpenStatic,分述如下:


————————————————————–


常数 常数值 说明


————————————————————-


adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标(Forward Only)。


adOpenKeyset 1 启动一个Keyset类型的游标。


adOpenDynamic 2 启动一个Dynamic类型的游标。


adOpenStatic 3 启动一个Static类型的游标。


————————————————————-


以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。


Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic



AbsolutePage 不支持 不支持 可读写 可读写


AbsolutePosition 不支持 不支持 可读写 可读写


BOF 只读 只读 只读 只读


CursorType 可读写 可读写 可读写 可读写


EOF 只读 只读 只读 只读


Filter 可读写 可读写 可读写 可读写


LockType 可读写 可读写 可读写 可读写


PageCount 不支持 不支持 只读 只读


PageSize 可读写 可读写 可读写 可读写


RecordCount 不支持 不支持 只读 只读


AddNew 支持 支持 支持 支持


CancelBatch 支持 支持 支持 支持


CancelUpdate 支持 支持 支持 支持


Close 支持 支持 支持 支持


Delete 支持 支持 支持 支持


Move 不支持 支持 支持 支持


MoveFirst 支持 支持 支持 支持


MoveLast 不支持 支持 支持 支持


MoveNext 支持 支持 支持 支持


MovePrevious 不支持 支持 支持 支持


Open 支持 支持 支持 支持


Update 支持 支持 支持 支持


UpdateBatch 支持 支持 支持 支持


————————————————————–


Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:


常数 常数值 说明


————————————————————–


adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法


adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。


adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。


adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、删、改的操作。


需要注意的是:
如果数据源没有返回记录,那么提供者将 BOF 和 EOF 属性同时设置为 True,并且不定义当前记录位置。如果游标类型允许,仍然可以将新数据添加到该空 Recordset 对象。








三天学好ADO之第二天









今天说一下Recordset 对象的属性
1、CursorType 属性
AdOpenForwardOnly: 仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。(顾名思义,这种游标只能向前移动。然而,由于这种游标功能有限,将它用于系统资源时是非常有效的。)
AdOpenKeyset: 键集游标。尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,键集游标与动态游标相似。仍然可以看见其他用户更改的数据。(KeySet游标允许你看见自它创建起其他用户所做的修改,然而你却不能看到其他用户增加或删除的记录。)
AdOpenDynamic :动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。(此类型的游标功能强大同时也是耗费系统资源最多的游标。Dynamic游标可以看到他们保存记录集合的所有变化。使用Dynamic游标的用户可以看到其他用户所做的编辑、增加、删除。如果数据提供者允许这种类型的游标,那么它是通过每隔一段时间从数据源重取数据来支持这种可视性的。毫无疑问这会需要很多的资源。 )
AdOpenStatic:静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。(Static类游标只是数据的一幅快照。这就是说,它无法看到自它创建以后其他用户对RecordSet所做的修改。采用这类游标你可以向前和向后航行。由于其功能简单,资源的需求比Dynamic要小! )
需要注意的是:一旦打开RecordSet,你就无法改变CursorType属性。但是,如果你首先关闭RecordSet,改变CursorType属性,然后重新打开RecordSet,那么你仍可以有效地改变游标的类型!


2、LockType 属性
在任何同时可被多用户修改的数据库应用程序中,你必须处理可能发生的多个用户同时对同一条记录进行操作时的情况。当这种情况出现时,数据的完整性就会受到威胁,这是因为一个用户可能会在不自觉地在保存自己所做的修改时覆盖他人的修改。到时候你会觉得自己好象是没有做事。为了处理这种情况。ADO允许你在对RecordSet对象进行更新时决定并发事件控制的类型,当一个用户编辑时,如何由他对记录进行锁定。这就是由LockType属性所决定的。这个属性有四个值:
adLockReadonly:默认值,只读。无法更改数据。(这是RecodSet的默认值,如果你把锁定的方式设为该值,那么你将不能更新 Recordset。)
adLockPessimistic:保守式记录锁定(逐条)。提供者执行必要的操作确保成功编辑记录,通常采用编辑时立即锁定数据源的记录的方式。(如果设置为此类锁定,记录被锁定,且只有在编辑开始到将记录更新的提交给数据提供者这段时间内进行编辑的用户才可以访问! )
adLockOptimistic:开放式记录锁定(逐条)。提供者使用开放式锁定,只在调用 Update 方法时锁定记录。(只有在将数据提交给数据提供者的那一瞬间才把记录锁定。)
adlockBatchOptimistic:开放式批更新。用于与立即更新模式相反的批更新模式。(设定为这种类型的锁定制式将被称为批量更新模式的RecordSet。 可以加快更新RecordSet修改数据的速度,但因为同时更新多个记录,它也会恶化与并发访问相关的问题! )


3、AbsolutePage 属性
AbsolutePage属性设定当前记录的位置是位于哪一页的页数编号;使用PageSize属性将Recordset对象分割为逻辑上的页数,每一页的记录数为PageSize(除了最后一页可能会有少于PageSize的记录数)。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。
与AbsolutePosition属性相同,AbsolutePage属性是以1为起始的,若当前记录为Recordset的第一行记录,AbsolutePage为1。可以设定AbsolutePage属性,以移动到一个指定页的第一行记录位置。
4、AbsolutePosition属性
若您需要确定目前指标在RecordSet中的位置,您可以用AbsolutePosition属性。
AbsolutePosition属性的数值为目前指标相对於第一笔的位置,由1算起,即第一笔的AbsolutePosition为1。
注意,在存取RecordSet时,无法保证RecordSet每次都以同样的顺序出现。
若要启用AbsolutePosition,必须先设定为使用用户端cursor(指针):rs.CursorLocation=3


5、PageCount属性
使用PageCount属性,决定Recordset对象包括多少“页”的数据。这里的“页”是数据记录的集合,大小等于PageSize属性的设定,即使最后一页的记录数比PageSize的值少,最后一页也算是PageCount的一页。必须注意也并不是所有的数据提供者都支持此项属性。


6、PageSize属性
PageSize属性是决定ADO存取数据库时如何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的“一页”。设定并建立一个页的大小,从而允许使用AbsolutePage属性移到其它逻辑页的第一条记录。PageSize属性能随时被设定。


7、RecordCount属性
这也是一个非常常用和重要的属性,我们常用RecordCount属性来找出一个Recordset对象包括多少条记录。使用 RecordCount 属性可确定Recordset 对象中记录的数目。ADO 无法确定记录数时,或者如果提供者或游标类型不支持 RecordCount,则该属性返回 –1。读已关闭的 Recordset 上的 RecordCount 属性将产生错误。Recordset 对象的游标类型会影响是否能够确定记录的数目。对仅向前游标,RecordCount 属性将返回 -1,对静态或键集游标返回实际计数,对动态游标取决于数据源返回 -1 或实际计数。


8、BOF与EOF属性
通常我们在ASP程序中编写代码来检验BOF与EOF属性,从而得知目前指标所指向的RecordSet的位置,使用BOF与EOF属性,可以得知一个Recordset对象是否包含有记录或者得知移动记录行是否已经超出该Recordset对象的范围。
若当前记录的位置是在一个Recordset对象第一行记录之前时,BOF属性返回true,反之则返回false。
若当前记录的位置是在一个Recordset对象最后一行记录之后时,EOF属性返回true,反之则返回false。
(BOF与EOF都为True表示在RecordSet里没有任何记录。)


9、Filter 属性
为 Recordset 中的数据指定筛选条件,使用 Filter 属性可选择性地屏蔽 Recordset 对象中的记录,已筛选的 Recordset 将成为当前游标。


这将影响基于当前游标返回值的其他属性,如 AbsolutePosition、AbsolutePage、RecordCount 和 PageCount,因为将 Filter 属性设置为特


定值可将当前记录移动到满足新值的第一个记录。
这属性我认为相当有用处,有的时候我们打开了Recordset进行了某些判断以后我们还想过滤记录也就是重新调整 sql 语句,难道我们关闭Recordset再用新的SQL语句打开?不是,我们用Filter属性进行过滤,比如说
rs.open exec,conn,1,1
if …. then rs.filter=”name=’xxx’”
而不是
rs.open exec,conn,1,1
if … then
rs.close
exec=exec&” where name=’xxx’”
rs.open exec,conn,1,1
end if
实际上再很多地方不得不用到Filter,在以后的ASP技巧中会说到,大家也可以想一下。
明天继续说Recordset对象的方法。