Ⅰ 算法:C语言实现(第1~4部分)基础知识、数据结构、排序及搜索作者简介
Robed Sedgewick是一位拥有丰富学术背景的计算机科学专家。他在斯坦福大学获得了博士学位,导师是着名的Donald E. Knuth。他现任普林斯顿大学计算机科学系的教授,同时在Adobe Systems公司担任董事职务。Sedgewick曾是XeroxPARC的研究人员,还曾在美国国防部防御分析研究所和INRIA工作过。
他的学术生涯中,Sedgewick的贡献不仅限于理论研究,他还积极参与算法的实际应用。他的着作在算法领域享有盛誉,特别是与Philippe Flajolet合着的《算法分析导论》。这本书为理解和应用各种算法提供了深入的理论基础,是许多程序员和研究者的必读之作。
在C语言实现(第1~4部分)中,Sedgewick展示了扎实的编程技巧和对算法的深刻理解。他从基础知识开始讲解,逐步深入到数据结构、排序和搜索等关键概念。通过他的讲解,读者可以系统地学习和掌握C语言在算法中的应用,为提升编程技能和解决复杂问题打下坚实基础。
本书细腻讲解计算机算法的C语言实现。全书分为四部分,共16章。包括基本算法分析原理,基本数据结构、抽象数据结构、递归和树等数据结构知识,选择排序、插入排序、冒泡排序、希尔排序、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,并比较了各种排序方法的性能特征,在进一步讲解符号表、树等抽象数据类型的基础上,重点讨论散列方法、基数搜索以及外部搜索方法。
Ⅱ C语言的题目
第一个:
#include <stdio.h>
main()
{
float s=0.0,t=0.0;
printf("gongzi:\n");
scanf("%f",&s);
if (s<0)
printf("<0");
else if (s<1000)
{t=0.0 ;
printf("gongzi:%5.2f,shui:%5.2f,shifagongzi:%5.2f",s,t,s-t); }
else if (s>=1000 && s<2000)
{t=s*0.05;
printf("gongzi:%5.2f,shui:%5.2f,shifagongzi:%5.2f",s,t,s-t); }
else if (s>=2000 && s<3000)
{t=s*0.08;
printf("gongzi:%5.2f,shui:%5.2f,shifagongzi:%5.2f",s,t,s-t); }
else if (s>=3000 && s<5000)
{t=s*0.10;
printf("gongzi:%5.2f,shui:%5.2f,shifagongzi:%5.2f",s,t,s-t); }
else if (s>=5000)
{t=s*0.15;
printf("gongzi:%5.2f,shui:%5.2f,shifagongzi:%5.2f",s,t,s-t); }
getch();
}
第2个:
main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
x2=x1;
day--;
}
printf("the total is %d\n",x1);
第3个:
#include <stdio.h>
#define N 3
#define M 3
main()
{
int a[N][M],sum[N]={0};
double avg[N];
int i,j;
for(i=0;i<N;i++)
{
printf("Input the %dth student's scores:",i+1);
for(j=0;j<M;j++)
{
scanf("%d",&a[i][j]);
sum[i]+=a[i][j];
}
avg[i]=(double)sum[i]/M;
}
printf("The sums are:");
for(i=0;i<N;i++)
printf("%4d",sum[i]);
printf("\nThe averages are:");
for(i=0;i<N;i++)
printf("%6.2lf",avg[i]);
printf("\n");
}
第4个:
#define N 4
int array[N][N];
void convert(int array[3][3]) /*函数类型可定义为void,也可用默认的int*/
{int i,j,t; /*因为函数形实参是数组,按地址传递*/
/*两个数组所用空间相同,函数无需返回值*/
for(i=0;i<N;i++)
for(j=i+1;j<N;j++) /* j=i+1防止两元素对调后再次恢复原位 */
{t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
main()
{
int i,j;
void convert(int [][]); /*注意此处的 [ ][ ] 形式,表明是二维数组*/
printf("Input array:\n"); /* 因为函数原型处仅检查形参个数、类型名、
for(i=0;i<N;i++) /* 顺序,而不检查形参名。所以只写成[ ][ ] 形式
for(j=0;j<N;j++) /* 即可。仅对void时如此,对int似乎不成立?*/
scanf("%d",&array[i][j]);
printf("\noriginal array:\n");
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%5d",array[i][j]);
printf("\n");
}
convert(array);
printf("convert array:\n");
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%5d",array[i][j]);
printf("\n");
}
}
第5个:
#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);
}
你看懂了吗?看懂就送分吧
如果看不懂你就是瞎问
再送点详解给你
#include <stdio.h>
#define N 50 // 排队人数(可任意更改)
#define CAL 3 //凡报3的人出列(可任意更改)
//下面是排队编号函数:从h 开始的n个人依次编号1到n
void stdline(int *h,int n)
{
int i;
for(i=1;i<n+1;i++) *(h+i-1)=i;
}
/*下面函数表示从指针h处开始的人数为boy个人排队,从1报数,每报到call的人出列*/
void outline(int *h,int boy,int call)
{
int *p, chu, callnum;
/*说明:
p 工作指针,表示从头依次指向每个元素,点名
chu 计数器,记录出列的人数
callnum 计数器,记录点名次序
*/
chu=0;
callnum=0;//各计数器清零
p=h; //开始时,工作指针指向数组首
printf("出列顺序是:\n");
while(chu<boy)
{
if(*p!=0) callnum++; //每次加报数
if(callnum==call) //如果某一个人报到出列数call...
{
printf("%5d",*p); //打印编号,表示出列
chu++; //出列人数加1
if(chu==boy)//如果全部出列....
{
*h=*p; //把最后一个出列人的编号记入地址开始处
return; //结束
}
if(chu%10==0)printf("\n");//每输出10个换行
callnum=0; //出列后,重新报数
*p=0; //出列后,将其编号赋零,以示区别
}
p++; //工作指针移向下一个人,即下一个数组元素
if(p>h+boy-1)p=h;/*如果移到最后一个元素的后面,则让指向地址开头继续报数*/
}
}
void main()
{
int a[N]; //用数组模拟队列,每个元素代表一个人
stdline(a,N);//编号
outline(a,N,CAL);//计算并打印出列顺序
printf("\n最后留下来的是 %d 号\n",*a);/*在函数中,已经把最后一个人的编号写入了数组首地址处,
这里输出就可以了*/
}
第6个:
#include<stdio.h>
struct date
{
int year;
int month;
int day;
}date;
void main()
{
int sum=0,leap;
printf("\n请输入日期(年,月,日)\n");
scanf("%d,%d,%d",&date.year,&date.month,&date.day);
switch(date.month)//先计算某月以前月份的总天数。
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("data error");
break;
}
sum=sum+date.day;//再加上某天的天数。
if(date.year%400==0||(date.year%4==0&&date.year%100!=0))
leap=1;
else
leap=0;
if(leap==1&&date.month>2)//如果是闰年且月份大于2,总天数应该加一天。
sum++;
printf("这天是当年的第 %d 天。\n",sum);
}
写不下了。。。