上機總結

fan_rockrock發表於2015-03-07

1.素數

for(i=2;i<=sqrt(num);i++)//有等號

{

if(num%i==0)

return 0;

}

2.進位制

void print(int x)//把一個整數轉化為二進位制輸出

{

if(x)

{

      print(x/2);

  putchar(x%2 + '0');

}

}

3.冒泡優化

 void sort(int a[],int n)

 {

int i,j,temp,flag;

for(i=0;i<n-1;i++)

{

flag=0;

for(j=0;j<n-1-i;j++)

{

if(a[j]>a[j+1])

{

flag=1;

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

if(flag==0)

break;

 }

  }

4.字串轉為數值(二進位制字串為例)

int  str_to_num(char x[])

{

    int len = strlen(x);

    int ret = 0;

    int i;

int k=0;

for(i=len-1;i>=0;i--)

{

   ret+=(x[i]-'0')*pow(2,k);

   ++k;

 }

    return ret;

}

5.兩字串加法

 Char* GetSum(char *a,char *b)  

{  

    int m,carry=0,s=0;  

    int pos_a = strlen(a)-1,pos_b=strlen(b)-1;  

    int pos_c = pos_a>pos_b?pos_a:pos_b;  

    int i=pos_a,j=pos_b,k=pos_c;      

    char *c = (char *)malloc(sizeof(char)*(pos_c)+1);  

  

    for(;i>=0 && j>=0;i--,j--,k--)  

    {  

        m = a[i] + b[j] - 2*'0' + carry;  

        carry = m/10;  

        c[k] = m>9 ? m-10+'0' : m+'0';  

    }  

    for(;i>=0;i--,k--)  

    {  

        m = a[i] - '0' + carry;  

        carry = m/10;  

        c[k] = m>9 ? m-10+'0' : m+'0';  

    }  

    for(;j>=0;j--,k--)  

    {  

        m = b[j] - '0' + carry;  

        carry = m/10;  

        c[k] = m>9 ? m-10+'0' : m+'0';  

    }  

  

    char *sum = (char *)malloc(sizeof(char)*(carry?pos_c+3:pos_c+2));  

    if(carry){  

        sum[0]='1';  

        s++;  

    }  

    for(m=0;m<=pos_c;)sum[s++]=c[m++];  

    sum[s]='\0';  

    return sum;  

}  

5.二進位制左右移操作

/*①unsigned long int資料高低位元組交換 

②在①的基礎上對2、3位元組迴圈左移n位 

③按二進位制格式輸出②,每八位一個空格*/

#include<stdio.h>

unsigned long int ulint;

void fun(unsigned long int ulint)

{

//實現第一步

unsigned long int hbyte=ulint>>24;

unsigned long int lbyte=ulint<<24;

    unsigned long int temp=ulint&0x00ffff00;//注意十六進位制要用0x開頭

ulint=temp|hbyte;

ulint=ulint|lbyte;

printf("第一步轉化的結果是: %x\n",ulint);

//實現第二步

    int n;

scanf("%d",&n);

n=n%16;

temp=ulint&0x00ffff00;

temp=temp>>8;

temp=temp<<n;

hbyte=(temp&0xffff0000)>>16;

lbyte=temp&0x0000ffff;

temp=hbyte|lbyte;

temp=temp<<8;

ulint=temp|(ulint&0xff0000ff);

    printf("第二步轉化的結果是: %x\n",ulint);

   //實現第三步

unsigned long int num=1;

int i;

printf("第三步後的轉化結果為:\n")

for(i=0;i<=31;i++)

{

if(i%8==0)

putchar(' ');

num=num<<(31-i);

        num=num&ulint;

        num=num>>(31-i);

printf("%d",num);

num=1;

}

putchar(10);

}

int main()

{

scanf("%x",&ulint);

fun(ulint);

return 0;

}

6.檔案操作

  //使用者輸入一個文字,程式設計實現輸出文字中最長的一行和最短的一行。如果最長和最短的不止一行,請全部輸出

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define N 50

char temp[N][N];//儲存文字行

int maxLine=0,minLine=100;//儲存最大,最小行下表

int main()

{

//建立檔案並輸入文字

FILE *fp;

char ch;

char str[N];

int i=0,j;

    if((fp=fopen("test.txt","w"))==NULL) //fp=fopen(“c:\a.txt”, “w”)

{

printf("開啟檔案失敗!\n");

exit(0);

}

printf("請輸入文字內容:\n");

while((ch=getchar())!=EOF)

        fputc(ch,fp);//相應的fputs(str,fp)寫入一串字串到檔案中,str為字串指標

printf("已把內容寫入檔案之中!\n");

fclose(fp);

    

//開啟檔案,計算最長的最短的文字,並且輸出

    if((fp=fopen("test.txt","r"))==NULL)

{

printf("開啟檔案失敗!\n");

exit(0);

}

while(!feof(fp))//不到達檔案尾

{

//ch=fgetc(fp);//得到單個字元

fgets(str,N,fp);//從fp所指檔案讀n-1個字元,然後在其後補充一個字串結束標記’\0’存入字元陣列str中;

//如果在讀完n-1個字元之前遇到回車換行符或EOF(檔案尾),讀入結束;

        strcpy(temp[i++],str);//這裡多存了一次,因為沒有到達檔案尾

}

fclose(fp);

return 0;

}

7.函式指標

   #include<stdio.h>

void taski()

{

printf("taski called!\n");

}

....

void execute(void (*p[])(),int i)

{

(*(p[i]))();//或者p[i]();

}

void shedule(void (*p[])(),char s[])

{

while((*s)!='\0')//以後就這樣用(*s),不用strlen

{

execute(p,(*s)-'0');

s++;

}

}

void main()

{

   char s[30];

   gets(s);

void (*p[9])()={task0,task1,task2,task3,task4,task5,task6,task7,task8};

shedule(p,s);

}

8.冗餘操作

  //無冗餘地實現兩個字串的連線

#include<stdio.h>

#include<stdlib.h>

int main()

{

char *s1=(char *)malloc(sizeof(char));

   char *s2=(char *)malloc(sizeof(char));

char ch;

int k1=1,k2=1,i;

printf("請輸入兩個字串,換行隔開:\n");

while((ch=getchar())!='\n')

{

s1=(char *)realloc(s1,k1*sizeof(char));

*(s1+k1-1)=ch;

k1++;

}

    *(s1+k1-1)='\0';//s1長k1-1

    

    while((ch=getchar())!='\n')

{

s2=(char *)realloc(s2,k2*sizeof(char));

*(s2+k2-1)=ch;

k2++;

}

    *(s2+k2-1)='\0';//s2長k2-1

//連線,接到s1上去

    for(i=0;i<k2;i++)

   *(s1+k1-1+i)=*(s2+i);

printf("%s\n",s1);

return 0;

}

//字元竄陣列

    char** a=(char**)malloc(n*sizeof(char*));  

 c=getchar();//接受回車符

    for(i=0;i<n;i++)  

    {  

        count=0;        

        a[i]=(char*)malloc(sizeof(char));  

        while((c=getchar())!='\n')  

        {  

     count++;

            a[i]=(char*)realloc(a[i],count*(sizeof(char)));  

            a[i][count-1]=c;

        }  

        a[i][count]='\0';  

}

9.命令列

//命令列形式:mycopy 1.txt 2.txt 3.txt 4.txt ...

#include<stdio.h>

#include<stdlib.h>

int main(int argc,char* argv[])

{

FILE* in,*out;

int i;

if(argc<3)

{

printf("error\n");

exit(0);

}

if((out=fopen(argv[argc-1],"w"))==NULL)

{

printf("cannot open outfile\n");

exit(0);

}

for(i=1;i<argc-1;i++)

{

if((in=fopen(argv[i],"r"))==NULL)

{

printf("cannot open outfile\n");

exit(0);

}

while(!feof(in))

   fputc(fgetc(in),out);

}

fclose(in);

fclose(out);

return 0;

}

     

10.二叉樹

 void CreateBiTree(BiTree &T)//先序構建二叉樹

{

char ch;

ch=getchar();

if(ch=='#')

T=NULL;

else

{

 T=(BitNode *)malloc(sizeof(BitNode));

 T->data=ch;

 CreateBiTree(T->lchild);

 CreateBiTree(T->rchild);

}

}

int Node0(BiTree T)//統計度數為0的結點(葉子結點)

{

int n1,n2,n=0;//n在遞迴呼叫時每次要初始化為0

if(T==NULL)

return 0;

else

{

if(T->lchild==NULL&&T->rchild==NULL)

n=1;

n1=Node0(T->lchild);

        n2=Node0(T->rchild);

return n+n1+n2;

}

}

int High(BiTree T)//求樹高

{

int lhigh,rhigh;

if(T==NULL)

return 0;

else

{

lhigh=High(T->lchild);

    rhigh=High(T->rchild);

return (lhigh>rhigh? lhigh+1:rhigh+1);

}

}

void ChangeLR(BiTree &T)//交換左右子樹,類似後序遍歷

{

BitNode *temp;

if(T==NULL)

return;

else

{

 ChangeLR(T->lchild);

 ChangeLR(T->rchild);

 temp=T->lchild;

 T->lchild=T->rchild;

         T->rchild=temp;

}

}

void CreatePaiXu(BiTree &T,char num)

{

if(T==NULL)

{

T=(BitNode*)malloc(sizeof(BitNode));

T->data=num;

T->lchild=T->rchild=NULL;//這一步置左右子樹為空一定不要掉了

}

else

{

if(num>(T->data))

           CreatePaiXu(T->rchild,num);

else

   CreatePaiXu(T->lchild,num);

}

}

int Width(BiTree T)//樹的寬度(背下來)

{

static int max=0;//樹的寬度的最大值

static int n[6]={0,0,0,0,0,0};//每一層的節點數

static int i=1;//層數

if(T)

{

      if(i==1)

  {

n[i]=1;

++i;

if(T->lchild )

n[i]++;

if(T->rchild )

n[i]++;

  }

      else

  {

i++;

if(T->lchild)

n[i]++;

if(T->rchild )

n[i]++;

  }

 if(n[i]>max)

max=n[i];

 Width(T->lchild );//遞迴遍歷左子樹

    i--;//返回上一層

 Width(T->rchild );//遞迴遍歷右子樹

}

return max;

}

//知道一顆二叉樹的先序和中序,構造二叉樹

BiTree PlanTree(char prior[],char middle[],int pf,int pr,int mf,int mr)

{

    BiTree T=(BitNode*)malloc(sizeof(BitNode));

int k=mf;

if(pr-pf<0)//以pr-pf<0結束遞迴

return NULL;

while(prior[pf]!=middle[k])

k++;

if(k>mr)

{

printf("該先序和中序不能構造二叉樹!\n");

    exit(0);

}

T->data=middle[k];

T->lchild=PlanTree(prior,middle,pf+1,pf+k-mf,mf,k-1);//pf+k-mf記住

T->rchild=PlanTree(prior,middle,pf+k-mf+1,pr,k+1,mr);

return T;

}

11.連結串列

void Sort(StuList &L)//對連結串列就地排序,類似插排的思想(此方法要記住)

{

StuNode *q=L,*p=L->next;

StuNode *np=p->next;

p->next=NULL;

p=np;

while(p)//兩個while迴圈要記住

{

np=p->next;//儲存p的下一結點

while(q->next)

{

      if(p->avg>=(q->next)->avg)

{

     p->next=q->next;

     q->next=p;

q=L;//插完重置

break;

}

else

q=q->next;

}

if((q->next)==NULL)

{

p->next=q->next;

     q->next=p;

q=L;//插完重置

}

p=np;

}

}

12.圖

   /*

typedef struct ArcNode{

   int adjVex;

   double info;

   struct ArcNode *nextArc;

}ArcNode;

typedef struct VexNode{

   char *vexName;

   struct ArcNode *firstArc;

}VexNode,AdjList[MAXVEX];

typedef struct Net{

   AdjList vexs;

   int arcNum,vexNum;

}Net;

int FindVex(Net ga,char *name)//找頂點的位置

{

int i;

for(i=0;i<ga.vexNum;i++)

{

if(strcmp(name,ga.vexs[i].vexName)==0)

return i;

}

return -1;

}

void CreateNet(Net &ga)

{

 int i,li,lj;

 char name1[10],name2[10];

 double w=0;

 ArcNode *p;

     printf("輸入頂點數和弧數:\n");

 scanf("%d%d",&ga.vexNum,&ga.arcNum);//scanf裡面的&不要忘了

 printf("輸入%d個頂點名:\n",ga.vexNum);

 for(i=0;i<ga.vexNum;i++)

 {

 ga.vexs[i].vexName=(char *)malloc(sizeof(char));

 scanf("%s",ga.vexs[i].vexName);

 ga.vexs[i].firstArc=NULL;

 }

     for(i=0;i<ga.arcNum;i++)

 {

 printf("輸入兩個相鄰的點和權值:\n");

         scanf("%s%s%lf",name1,name2,&w);

 li=FindVex(ga,name1);

 lj=FindVex(ga,name2);

         p=(ArcNode *)malloc(sizeof(ArcNode));

 p->adjVex=lj;

 p->info=w;

 p->nextArc=ga.vexs[li].firstArc;//頭插法建立

         ga.vexs[li].firstArc=p;

 }

}

void DFS(Net ga,char *name,int visited[])//深搜

{

int l=FindVex(ga,name);

visited[l]=1;//表示訪問了

printf("%s",ga.vexs[l].vexName);

ArcNode *p=ga.vexs[l].firstArc;

while(p)

{

int adj=p->adjVex;

if(!visited[adj])

DFS(ga,ga.vexs[adj].vexName,visited);

else

p=p->nextArc;

}

}

void DFSTravel(Net ga,char *name)

{

int visited[MAXVEX];

int i;

for(i=0;i<ga.vexNum;i++)

visited[i]=0;

int l=FindVex(ga,name);

if(visited[l]==0)

DFS(ga,name,visited);

*/

typedef struct Graph{//鄰接矩陣資料結構

   char vexs[MAXVEX][MAXVEX];//儲存結點字元陣列

   double matric[MAXVEX][MAXVEX];

   int vexNum,arcNum;

}Graph;

typedef struct Knode //用於克魯斯卡爾演算法中儲存一條邊及其對應的2個節點

{

char *ch1; //節點1

char *ch2; //節點2

double value;//權值

}Knode,Temp[MAXVEX];

int FindVex(Graph G,char *name)//找頂點位置

{

int i;

for(i=0;i<G.vexNum;i++)

{

if(strcmp(name,G.vexs[i])==0)

return i;

}

return -1;

}

void CreateGraph(Graph &G,Temp &T)//建立無向加權圖

{

int i,j;

double d;

char *ch1,*ch2;

int li,lj;

printf("請輸入頂點數和弧數:\n");

scanf("%d%d",&G.vexNum,&G.arcNum);

printf("請輸入%d個頂點:\n",G.vexNum);

    for(i=0;i<G.vexNum;i++)

scanf("%s",&G.vexs[i]);

for(i=0;i<G.vexNum;i++)

{

for(j=0;j<G.vexNum;j++)

G.matric[i][j]=MAX;//初始化矩陣為很大的值

}

printf("請輸入兩個頂點和邊的權值:\n");

for(i=0;i<G.arcNum;i++)

{

ch1=(char *)malloc(sizeof(char));

ch2=(char *)malloc(sizeof(char));

scanf("%s%s%lf",ch1,ch2,&d);

li=FindVex(G,ch1);

lj=FindVex(G,ch2);

G.matric[li][lj]=d;//矩陣賦值

G.matric[lj][li]=d;//注意這是無向加權圖

T[i].ch1=ch1;

T[i].ch2=ch2;

T[i].value=d;

}

}

void Sort(Temp &T,Graph G)

{

int i,j;

double temp;

char *ch1,*ch2;

for(i=0;i<G.arcNum-1;i++)

{

for(j=0;j<G.arcNum-1-i;j++)

{

if(T[j].value>T[j+1].value)

{

temp=T[j].value;

T[j].value=T[j+1].value;

T[j+1].value=temp;

ch1=T[j].ch1;

T[j].ch1=T[j+1].ch1;

T[j+1].ch1=ch1;

            ch2=T[j].ch2;

T[j].ch2=T[j+1].ch2;

T[j+1].ch2=ch2;

}

}

}

}

void KRSL(Graph G,Temp &T)//最小生成樹的演算法

{

int i,j,ii,jj;

int flag[MAXVEX];//標記陣列

Sort(T,G);//首先按權值排序

for(i=0;i<G.vexNum;i++)

flag[i]=i;

for(i=0;i<G.arcNum;i++)

{

ii=flag[FindVex(G,T[i].ch1)];

jj=flag[FindVex(G,T[i].ch2)];

if(ii!=jj)

{

printf("%s%s%lf\n",T[i].ch1,T[i].ch2,T[i].value);

for(j=0;j<G.vexNum;j++)

{

   if(flag[j]==jj)

       flag[j]=ii;

}

}

}

}