㈠ C語言演算法設計主要需要掌握哪些
你如果只問C語言的話,它與其他語言最大的不同就是指針了,很多針對C語言的演算法都會用到它,每種語言雖然大體相同但都有獨特之處的。我們老師常說:
不懂指針的人,就等於不會C/C++
不懂委託、引用的人,就等於不會C#
除此之外就是演算法設計的共同基礎了,像樓上所說的,
你需要熟悉各種數據結構的特性,才能在設計你的演算法時用最適合的方法
你需要熟悉各種變數的結構,C語言是可以手動管理內存的,靈活掌握物理地址與邏輯地址對C語言演算法設計很有幫助
你需要熟悉各種循環控制結構,這才是程序的真諦,讓計算機代替人完成重復性的工作,而演算法就是教機器該如何這樣做的命令集
㈡ 編程——C語言與演算法
#請回答,你的年度知識點#
C語言是國際上廣泛使用的一種計算機語言,它適合作為系統描述語言,既可以用來編寫系統軟體,又可以用來編寫應用軟體。C語言從發布之日起就得到了廣泛傳播,為大多數程序員所接受,C語言使用率也一直在編程語言排行榜中穩居前三位,因此學習C語言前景也是非常可觀的。
一個程序通常包含演算法、數據結構、程序設計方法及語言工具和環境4個方面,其中,演算法是核心,演算法就是解決「做什麼」和「如何做」的問題。演算法與程序設計以及數據結構密切相關,是解決一個問題的完整的步驟描述,是解決問題的策略、規則、方法,是求解特定問題的一組有限的操作序列。比如建造一棟樓之前,要先在圖紙上繪出其構造圖,演算法就是在編寫程序前先整理出基本思路。演算法的描述形式有很多種,如傳統流程圖、結構化流程圖及計算機程序語言等。
一個程序應該包括對數據的描述和對數據的操作。其中,對數據的描述是指在程序中要指定數據結構,即數據的類型和數據的組織形式;對數據的操作也就是對數據進行操作的步驟,即演算法。 著名的計算機科學家沃思(Nikiklaus Wirth)曾經提出過一個公式: 演算法+數據結構=程序 隨著時代的發展以及計算機技術的進步,這個公式已經不夠准確了。
實際上,一個程序還應該包括採用一種程序設計方法進行程序設計並用計算機語言描述,經常採用的是結構化的程序設計方法。
演算法一般可以分為兩大類,一類是解決科學與工程計算方面的演算法,如求解數值積分、微分方程、線性方程組和代數方程等,這類演算法稱為數值運算演算法;另一類是解決數據處理方面問題的演算法,稱為非數值運算演算法,如各種各樣的查找演算法、排序演算法以及遍歷演算法等。目前,計算機在非數值運算方面的應用遠遠超過了在數值運算方面的應用。
㈢ 請設計一個演算法C語言C程序C編程(很難)
沒看清題目,原來你還要求——每一次的交換必須是上一組兩個同學之間的交換,其實用遞歸函數遞歸還是可以的呀!只需要增加一個數組n[4](如果是N個同學之間的交換就設n[N-1]).
deal(l)函數——它只負責找出l號位置該站哪位同學,這名同學只能從上次0~(l-1)位置上已經站好的同學中選擇出,並與l位置的同學作交換,(deal(l)函數會把「具體」找l號以下位置應該站哪些同學的任務交由deal(l-1)來處理),直到deal(0)負責0位置該站誰(此時已經結束,0號位置以下已經沒同學可與0位置同學作交換了)。
這種思想仍然是遞歸,也就是回答者: sujie325 所說的思想!
問題的關鍵是:
對於deal(l)函數,我們必須要保證每一次被交換到l號位置的同學都是不同的,用什麼來保證呢?設置一個數組n[4]!
它的作用是:
記錄l號位置的同學變動情況(l號位置的同學只能與l號位置以下的同學交換),然後利用以下語句,在0~(l-1)位置中尋找出在n[4]中沒有的同學(這名同學的位置是k),然後把此同學交換到l號位置。另外也不要忘記把l號位置的同學記錄到n[]數組中!!
============================================================================
for(k=0;k<l;k++)
{ flagy=1;
for(n_i=0;n_i<=n_p;n_i++)
{
if(b[ml][k]==n[n_i])
{flagy=0;break;}
}
if(flagy)
{break;}
}
n[++n_p]=b[ml][l];
b[m][l]=b[ml][k],b[m][k]=b[ml][l];/*第k號位置處的同學與第l號位置的同學交換位置*/
==================================================================================
整個程序在如下:
#include<stdio.h>
#define N 5
int b[120][N]={1,2,3,4,5};
int m=0;
int deal(int l)
{int i,j;
int ml;
int n[4]={0};
int n_p=-1,n_i,n_j;
int k=0;
int flagy;
if(l==0)
return ++m;
deal(l-1);
for(i=0;i<l;i++)
{ ml=m-1;
for(j=0;j<5;j++)
{
b[m][j]=b[ml][j];
}
for(k=0;k<l;k++)
{ flagy=1;
for(n_i=0;n_i<=n_p;n_i++)
{
if(b[ml][k]==n[n_i])
{flagy=0;break;}
}
if(flagy)
{break;}
}
n[++n_p]=b[ml][l];
b[m][l]=b[ml][k],b[m][k]=b[ml][l];/*第k號位置處的同學與第l號位置的同學交
換位置*/
deal(l-1);
}
}
void main()
{
int l=N-1;int i,j;unsigned char pause=0x80;
deal(l);
for(i=0;i<120;i++)
{if((pause=pause>>1)==0)
{getchar();pause=0x80;}
for(j=4;j>=0;j--)
printf("%d ",b[i][j]);
printf("\n");
}
printf("It has %d categorys in total!\n",m);
}
=====================================================================================
上次的程序(只找出120種組合情況)
#include<stdio.h>
int b[120][5]={1,2,3,4,5};
int m=0;
int deal(int l)
{int i,j;
int ml=m;
if(l==0)
return ++m;
deal(l-1);
for(i=0;i<l;i++)
{
for(j=0;j<5;j++)
{
b[m][j]=b[ml][j];
}
b[m][l]=b[ml][i],b[m][i]=b[ml][l];/*第i號同學與l號同學交換位置*/
deal(l-1);
}
}
void main()
{
int l=4;int i,j;char c=0x10;
deal(l);
for(i=0;i<120;i++)
{if((c=c>>1)==1)/*由於數據組合種類很多,這條if語句實現的是顯示暫停(getchar())*/
{getchar();c=0x10;}
for(j=4;j>=0;j--)/*輸出組合*/
printf("%d ",b[i][j]);
printf("\n");
}
printf("the m is %d\n",m);
}
㈣ 排序演算法的設計(c語言)根據程序畫流程圖及對每句程序加註釋
#include "stdio.h"//標准io頭文件
#include "stdlib.h"//庫文件
#include "time.h"//時間系頭文件
#define N0 100000 //定義常量
typedef int keytype; //類型命名
typedef struct node //定義結構體
{ keytype key; //只是類型命名成keytype,其實就是int的
}Etp;//結構體類型叫做Etp
Etp R[N0+1]; // R[1]..R[n] //定義數組
int n=50, count;//全局變數
void readData( Etp R[], int n)//讀數據的函數
{ int i;
count=0;
srand( time( NULL ));//初始化時間種子
for( i=1; i<=n; i++) //對數組初始化
R[i].key=1000+
(int)((9999.0-1000)*rand()/RAND_MAX); // 0..RAND_MAX
}
void printData( Etp R[], int n )//列印顯示數據的函數
{ int i;
for( i=1; i<=n; i++)
printf("%8d%s", //格式化顯示數組的數據
R[i].key, i%5==0?"\n":"");
printf("\ncount=%d\n", count);
}
void bubberSort( Etp R[], int n )//冒泡排序的函數
{ int i,j;//(這個函數塊就是冒泡排序的演算法程序)
bool swap;
for( i=1; i<=n-1; i++)
{ swap=false;
for( j=1; j<=n-i; j++)
if( count++,R[j].key>R[j+1].key )
{ R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];
swap=true;
}
if( !swap ) break;
}
}
void bubberSort1( Etp R[], int n )//這個也是另一個冒泡排序的函數
{ int j;//跟上面不同的是這個演算法用的是遞歸的方式,上面的是非遞歸的
for( j=1; j<=n-1; j++)
if( count++,R[j].key>R[j+1].key )
{ R[0]=R[j];
R[j]=R[j+1];//________;//就是兩個變數交換值
R[j+1]=R[0];
}
if( n>1 ) bubberSort1( R, n-1); //___________;//遞歸調用
}
void selectSort( Etp R[], int n )//這個是選擇排序
{ int i,j,k;//(這個函數塊就是選擇排序的演算法程序)
for( i=1; i<=n-1; i++)
{
k=i;
for( j=i+1; j<=n; j++)
if( count++,R[j].key<R[k].key ) k=j;
if( k!=i )
{ R[0]=R[i];
R[i]=R[k];
R[k]=R[0];
}
}
}
void insertSort( Etp R[], int n )//這個是插入排序
{ int i,j;
for( i=2; i<=n; i++)
{
R[0]=R[i];
j=i-1;
while( count++,R[j].key>R[0].key ) R[j+1]=R[j--];
R[j+1]=R[0];
count++;
}
}
void sift( Etp R[], int i, int m)//堆排序中的步驟
{ int k=2*i;
R[0]=R[i];
while( k<=m )
{ if( count++, k+1<=m && R[k+1].key>R[k].key) k++;
if( count++,R[0].key<R[k].key ) R[i]=R[k];
else break;
i=k;
k=2*i;
}
R[i]=R[0];
}
void heapSort( Etp R[], int n )//這個是堆排序
{ int j;
for( j=n/2; j>=1; j--) sift( R, j, n);
for( j=n; j>=2; j--)
{ R[0]=R[1];
R[1]=R[j];
R[j]=R[0];
sift( R, 1, j-1 );
}
}
int main()//主函數的進入口
{
readData( R, n );//讀取數據
bubberSort1( R, n );//調用遞歸冒泡排序
printData( R, n);//顯示數據
readData( R, n );//讀取數據
selectSort( R, n );//調用選擇排序
printData( R, n);//顯示數據
readData( R, n );//讀取數據
insertSort( R, n );//調用插入排序
printData( R, n);//顯示數據
readData( R, n );//讀取數據
heapSort( R, n );//調用堆排序
printData( R, n);//顯示數據
return 0;
}
//誒·~注釋完我總算看出來了,難道你要我解釋各個排序的過程?
//那你還不如直接或者看書,你要是不理解原理是不可能看懂過程的。
//注釋也只是語句的解釋,但是過程的含義是無法描述的
㈤ 設計演算法,並用c語言實現。
#include<stdio.h>
intchange(intamount,intindex,intconstcoins[]){
if(amount==0)return1;
if(index<=0)return0;
for(inti=amount/coins[index-1];i>=0;--i){
if(change(amount-i*coins[index-1],index-1,coins)){
if(i)
printf("%d*%d",i,coins[index-1]);
return1;
}
}
return0;
}
intmain()
{
intcoins[]={20,50};
intconstsize=sizeof(coins)/sizeof(int);
intamount;
for(inti=0;i<size;++i){
for(intj=i+1;j<size;++j){
if(coins[i]>coins[j]){
inttemporary=coins[i];
coins[i]=coins[j];
coins[j]=temporary;
}
}
}
if(coins[0]<=0){
printf("數據有誤,零錢必須大於0 ");
return-1;
}
printf("請輸入要兌換的貨幣金額:");
scanf("%d",&amount);
if(change(amount,size,coins))
printf(" 兌換成功 ");
elseprintf(" 兌換失敗 ");
return0;
}
㈥ 設計一個演算法,完成一個鏈表的創建,輸入,插入和刪除的實現(使用C語言環境)
/* 線性表-鏈表的操作: 只提供核心語句 */ #include "stdio.h" #include "stdlib.h" #define N 100 typedef int ElemType; /* 鏈表的存儲結構 */ typedef struct LNode{ ElemType data; struct LNode *next; } LNode,*LinkList; /* 鏈表的基本操作 */ /******* 1.初始化鏈表 ******/ void InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; } /******* 2.銷毀鏈表 ******/ void DestroyList(LinkList *L) { LinkList p; while(*L!=NULL) { p=*L; *L=(*L)->next; free(p); } } /******* 10.在順序表第n個位置插入元素e ******/ void ListInsert(LinkList *L, int n, ElemType e) { LinkList p,q,new; int i; q=*L; p=(*L)->next; i=1; while (p!=NULL && i<n) { q=p; p=p->next; i++; } new=(LinkList)malloc(sizeof(LNode)); new->data=e; q->next=new; new->next=p; } /******* 11.刪除鏈表中第n個位置的元素 ******/ void ListDelete(LinkList *L, int n, ElemType *e) { LinkList p,q; int i; q=*L; p=(*L)->next; i=1; while (p!=NULL && i<n) { q=p; p=p->next; i++; } *e=p->data; q->next=p->next; free(p); } /******* 12.遍歷鏈表並輸出 ******/ void ListTraverse(LinkList L) { LinkList p; printf("\nList:\t"); p=L->next; while (p!=NULL) { printf("%d\t",p->data); p=p->next; } } /******* A(2).後接法建立順序鏈表 ******/ void CreateList2(LinkList *L, ElemType a[], int n) { LinkList p,new; int i; p=*L; for(i=0; i<n; i++) { new=(LinkList)malloc(sizeof(LNode)); new->data=a[i]; p->next=new; p=p->next; } p->next=NULL; } /* 主函數 */ main() { LinkList La; ElemType a[]={1,3,5,7,9},x; InitList(&La);//初始化鏈表 CreateList2(&La,a,5);//建立鏈表並用數組賦值 ListTraverse(La);//遍歷鏈表 ListInsert(&La, 3, 100);//第三個位置插入100 ListTraverse(La);//遍歷鏈表 ListDelete(&La,5,&x);//刪除第五個元素,用x返回 ListTraverse(La);//遍歷鏈表 DestroyList(&La);//銷毀鏈表 } 真是恭喜您了 我們剛上完這章,以上答案絕對正確簡潔