系列1 系列2(原创程序,禁止非法转载出版)
部分程序演示视频见教材,二维码扫描可直接观看
计算以下数列前1000项的和
s=1+2+4+8+16+32+64+128+1+2+4+8+16+...

#include <stdio.h>
void main()
{
 int i,s=0;
 for(i=1;i<=1000;i++)
  s=s+(1<<((i+7)%8));
 printf("s=%d\n",s);
}
统计由2,3,4,7,8,9组成的5位数的和,5位数中不能有重复的数码
例如:23789,34789,98234,...
#include <stdio.h>
#include <string.h>
int fac(int n)
{
 if(n==1) return 1;
 else return n*fac(n-1);
}
int sum(int n)
{
 int i,s=1;
 for(i=2;i<=n;i++)  s=s*10+1;
 return s;
}
void main()
{
 int i,num=0;
 char s[]={"234789"};
 int n=strlen(s);
 for(i=0;i<n;i++)
  num=num+(s[i]-'0')*sum(n)*fac(n-1);
 printf("num=%d\n",num);
}

求和:(教材有视频)

#include <stdio.h>
#include <math.h>
void main()
{
 int i,j;
 double s=1.0,t,p;

 for(i=1;i<=1000;i++)
  s=s * (2*i)*(2*i) *1.0/ ((2*i-1)*(2*i+1) ) ;
 printf("1.pi=%f\n",s*2);

 s=0.0;
 for(i=1;i<=1000;i++)
  s=s + (i%2==1?1:-1) * 1.0/(2*i-1); 
 printf("2.pi=%f\n",s*4);

 s=0.0;
 for(i=1;i<=20;i++)
 {
  t=1;
  for(j=1;j<=i-1;j++)    t=t*4;
  p=1;
  for(j=1;j<=2*i-1;j++) p=p*j;
  s=s+1/(t*p);
 }
 printf("3.pi=%f\n",s*3);

 s=0.0;
 for(i=1;i<=1000;i++)  s=s + 1.0/(i*i);
 printf("4.pi=%f\n",sqrt(s*6));
 }

演示一维数组和二维数组之间的转换(教材有视频)

#include <stdio.h>
#include <string.h>
void main()
{
 int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
 int b[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 
 static int c[12]={1,2,3,4,5,6,7,8,9,10,11,12};
 static int d[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
 char s[3][10]={"123","456","789"};
 char t[10]={"123456789"};
 int i,j;

 //1.特殊引用
 printf("%3d,%3d\n",b[0][4],b[1][7]);
 printf("%3d,%3d\n",c[13],d[0][1]);
 printf("%s,%s\n",s[2],t+6);
 printf("%s,",s[0]);strcpy(s[0]+3,s[1]);printf("%s\n",s[0]);

 //2.一维数组当做二维数组:相当于3个数组a,a+4,a+8
 printf("%d,%d\n",(a+4)[0],(a+8)[0]);
 //3.二维数组当做一维数组:相当于数组b[0][12]
 for(i=0;i<12;i++) printf("%3d",b[0][i]); printf("\n");
 //4.3行4列的二维数组当做2行6列的二维数组:相当于数组b[0][6],(b[0]+6)[6]
 for(i=0;i<6;i++) printf("%3d",b[0][i]); printf("\n");
 for(i=0;i<6;i++) printf("%3d",(b[0]+6)[i]); printf("\n");
 for(i=0;i<2;i++)
 {
  for(j=0;j<6;j++)
   printf("%3d",(b[0]+i*6)[j]);
 printf("\n");
 }
}

利用数组输出2016年的日历(1月1日是星期五(教材有视频)

#include <stdio.h>
void main()
{
 int m[12]={31,29,31,30,31,30,31,31,30,31,30,31};
 int i,j,nBegin=5;

 char s[3000]="",t[100];

 //1.
 for(i=0;i<12;i++)
 {
  printf("%11d月\n\n",i+1); // 输出月份
  printf("日 一 二 三 四 五 六\n"); // 输出星期
  for(j=0;j<nBegin;j++) printf(" "); // 输出1号前面的空格
  for(j=1;j<=m[i];j++)
  {
   printf("%2d ",j); // 输出日期
   if((j+nBegin)%7==0) printf("\n"); // 换行,下一个星期
  }
  nBegin = (nBegin+m[i])%7; //调整下个月1号对应的星期
  printf("\n\n");
 }

 //2.
 nBegin = 5;
 for(i=0;i<12;i++)
 {
  sprintf(t,"%11d月\n\n",i+1);strcat(s,t); // 输出月份到s
  strcat(s,"日 一 二 三 四 五 六\n"); // 输出星期到s
  for(j=0;j<nBegin;j++) strcat(s," "); // 输出1号前面的空格到s
  for(j=1;j<=m[i];j++)
  {
   sprintf(t,"%2d ",j);strcat(s,t); // 输出日期到s
   if((j+nBegin)%7==0) strcat(s,"\n"); // 输出换行符到s
  }
  nBegin = (nBegin+m[i])%7; // 调整下个月1号对应的星期
  strcat(s,"\n\n"); // 输出换行符到s
 }
 puts(s); // 输出日历
}

演示递归的复用(教材有视频)

#include <stdio.h>
#define N 5
void main()
{
 double f(int,int);
 printf("%d!=%d\n",N,(int)f(N,1));
 printf("1+2+3+...+%d=%d\n",N,(int)f(N,2));
 printf("1+1/2+1/3+...+1/%d=%f\n",N,f(N,3));
}

double f(int n,int type)
{
 if(n>1)
 {
 switch(type)
 {
  case 1:return n*f(n-1,type);
  case 2:return n+f(n-1,type);
  case 3:return 1.0/n+f(n-1,type);
  default:return 0;
  }
 }
 else
 return 1.0;
}

十进制转换为其他进制(教材有视频)
#include <stdio.h>
void f(int n,int k)
{
 char s[]="0123456789ABCDEF";
 int i=0;
 char t[50]="";
 while(n>0)
 {
  t[i++]=s[n%k];
  n=n/k;
 }
 while(--i>=0)
  printf("%c",t[i]);
 printf("\n");
 }
void main()
{
 f(65,2);
 f(65,8);
 f(65,16);
}
输出所有奇数数码,即1,3,5,7,9(教材有视频)

#include <stdio.h>
void main()
{
 int a[10]={1,2,3,4,5,6,7,8,9,0},*p,i;
 char s[]="1234567890",t[2][10]={"123456","7890"},*q;
 char *m[2]={"123456","7890"}; // m 是指针数组,数组元素是2个指针
 char (*n)[2]; // n 是行指针变量,每行2个字符

 for(p=a;p-a<10;p++) // p 遍历a数组
  if(*p%2==1) printf("%2d",*p);
 printf("\n");

 for(q=s;*q!='\0';q++) // s 遍历s数组
 if( (*q-'0')%2==1) printf("%2c",*q);
 printf("\n");

 for(i=0;i<2;i++)
  for(q=t[i];*q!='\0';q++) // q 遍历t数组的i行
   if( (*q-'0')%2==1) printf("%2c",*q);
 printf("\n");

 for(i=0;i<2;i++)
  for(q=m[i];*q!='\0';q++) // q 遍历m[i]指向的数组
   if( (*q-'0')%2==1) printf("%2c",*q);
 printf("\n");

 n=(char (*)[2])s; // 1级指针强制转换为行指针char (*)[2]类型
 for(i=0;i<5;i++) // n 指向s数组的奇数位字符(每次移动2个字符)
  printf("%2c",**n++);
 printf("\n");

 n=(char (*)[2])t; // 行指针t强制转换为行指针char (*)[2]类型
 for(i=0;i<2;i++)
 {
  for(q=*n;*q!='\0';q++)
   if( (*q-'0')%2==1) printf("%2c",*q);
  n+=5; // n+5相当于移动10个字符,对应t数组的1行,相当于t+1和m+1
 }
 printf("\n");
}

模仿零比特填充(教材有视频)

#include <stdio.h>
void main()
{
 int i,n;
 char s[100]="11000111111000111010011011111110101101";
 char *p,*q;
 printf("1.%s\n",s);
 //1. 模仿零比特填充
 n=0;i=0;p=s;
 while(*p!='\0')
 {
  if(*p=='1') i++; // 统计连续的1的个数
  else i=0; // 遇到0,统计重新开始
  if(i==6) { *p='?'; i=0; n++;} // 发现6个连续的1,标注最后一个1为?
  p++;
 }
 printf("2.%s\n",s);
 q=p+n;*q='\0';--p;--q;
 while(p>=s)
 {
  if(*p!='?') *q--=*p; // 不是?,复制
  else { *q--='0'; *q--='1';} // 是?,替换为10(相当1替换为10)
  p--;
 }
 printf("3.%s\n",s);

 //2. 模仿零比特填充的还原
 i=0; p=s;
 while(*p!='\0')
 {
  if(*p=='1') i++;
  else i=0;
  if(i==6) { *(p+1)='?'; i=0; p++;} // 发现6个连续的1,标注后面的0为?
  p++;
 }
 printf("4.%s\n",s);
 p=q=s;
 while(*p!='\0')
 {
  if(*p!='?')*q++=*p; // 不是?复制,?字符跳过
  p++;
 }
 *q='\0';
 printf("5.%s\n",s);
}

演示循环链表(教材有视频)

#include <stdio.h>
#include <malloc.h>
#include <string.h>
// 演示双向循环链表
typedef struct student
{
 int data;
 struct student *left,*right;
}STUDENT;
void main()
{
 STUDENT *head,*p,*s;
 int i;
 // 创建头结点
 if((head=(STUDENT *)malloc(sizeof(STUDENT)))==NULL)
 {
  printf("\n不能创建链表");
  return ;
 }
 p = head; p->left = p->right = NULL;

 // 创建5个结点
 for(i=1;i<=5;i++)
 {
  if((s=(STUDENT *)malloc(sizeof(STUDENT)))==NULL)
  {
   printf("\n不能创建链表");
   return ;
  }
  s->data = i; s->left=p; s->right = head; // 设置结点数据及左右指针
  head->left=s; // 头结点左指针指向新结点
  p->right =s; // 当前结点右指针指向新结点
  p=s; // 将新结点设置为当前结点
 }

 // 插入结点(在头结点右侧插入)
 if((s=(STUDENT *)malloc(sizeof(STUDENT)))==NULL)
 {
  printf("\n不能创建链表");
  return ;
 }
 s->data = 88;
 s->left = head; // 插入的结点左指针指向头结点
 s->right = head->right; // 插入的结点右指针指向头结点的右指针指向的结点
 s->right->left = s; // 设置头结点右指针指向的结点的左指针,使其左指针指向新结点
 head->right=s; // 头结点的右指针指向新结点

 // 删除结点(设要删除的结点的data值为4)
 p=head->right;
 while(p->data !=4)  p=p->right;
 p->left->right = p->right; // 删除的结点的左侧结点的右指针指向其右结点
 p->right->left = p->left; // 删除的结点的右侧结点的左指针指向其左结点
 free(p); // 释放删除的结点

 // 顺序输出链表
 p = head->right;
 while(p->right!=head)
 {
 printf("%3d",p->data);
 p=p->right;
 }
 printf("%3d",p->data);printf("\n");

 // 逆序输出链表
 p = head->left;
 while(p->left!=head)
 {
  printf("%3d",p->data);
  p=p->left;
 }
 printf("%3d",p->data);printf("\n");
}