Ⅰ 演算法: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);
}
寫不下了。。。