|
部分程序演示视频见教材,二维码扫描可直接观看
|
计算以下数列前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");
}
|