<li id="yaiu2"><tr id="yaiu2"></tr></li>

  • <button id="yaiu2"><object id="yaiu2"></object></button>
    <li id="yaiu2"><acronym id="yaiu2"></acronym></li>

    1. 2021年華為實習工程師面試題

      小編:管理員 476閱讀 2021.06.22

      第1題:


      刪除子串,只要是原串中有相同的子串就刪掉,不管有多少個,返回子串個數。





      #include <stdio.h>

      #include <stdlib.h>

      #include <assert.h>

      #include <string.h>

      int delete_sub_str(const char *str,const char *sub_str,char *result)

      {

      assert(str != NULL && sub_str != NULL);

      const char *p,*q;

      char *t,*temp;

      p = str;

      q = sub_str;

      t = result;

      int n,count = 0;

      n = strlen(q);

      tmep = (char *)malloc(n+1);

      memset(temp,0x00,n+1);

      while(*p)

      {

      memcpy(temp,p,n);

      if(strcmp(temp,q) == 0 )

      {

      count++;

      memset(temp;0x00,n+1);

      p = p + n;

      }

      else

      {

      *t = *p;

      p++;

      t++;

      memset(temp,0x00,n+1);

      }

      }

      free(temp);

      return count;

      }

      int main()

      {

      char s[100] = {‘\0’};

      int num = delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s);

      printf(“The number of sub_str is %d\r\n”,num);

      printf(“The result string is %s\r\n”,s);

      }



      第2題:


      約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的人全部出列。




      #include<stdio.h>

      #include<stdlib.h>

      typedef struct Node

      {

      int num;

      struct Node *next;

      }LinkList;

      LinkList *creat(int n)

      {

      LinkList *p,*q,*head;

      int i=1;  

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

          p->num=i;

      head=p;

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

          {

              q=(LinkList *)malloc(sizeof(LinkList));

              q->num=i;

              p->next=q;

              p=q;

          }

          p->next=head;          /*使鏈表尾指向鏈表頭 形成循環鏈表*/

         return head;

      }

      void fun(LinkList *L,int m)

      {

      int i;

      LinkList *p,*s,*q;

      p=L;

      printf("出列順序為:");

      while(p->next!=p)

      {

      for(i=1;i<m;i++)

      { q=p;

      p=p->next;

      }

      printf("%5d",p->num);

      s=p;

      q->next=p->next;

      p=p->next;

      free(s);

      }

      printf("%5d\n",p->num);

      }

      int main()

      {

      LinkList *L;

      int n, m;

      n=9;

      m=5;

      L=creat(n);

      fun(L,m);

      return 0;

      }



      第3題:


      比較一個數組的元素 是否為回文數組




      #include <stdio.h>

      #include <string.h>

       

       

      int huiwen(char str[])

      {

      int i,len,k=1;

      len=strlen(str);

      for(i=0;i<len/2;i++)

      {

      if(str[i]!=str[len-i-1])

      {

      k=1;

      break;

      }

      }

      if(k==0)

          printf("%s 不是一個回文數\n",str);

      else

      printf("%s 是一個回文數\n",str);

      }

      void main()

      {       

      char str[100] = {0};     

      int i;  

      int len;

      printf("Input a string:");        /*提示輸入Input a string:*/

      scanf("%s", str);                  /*scan()函數輸入一個字符串:*/

      huiwen(str);

      }



      第4題:


      比較兩個數組,要求從數組最后一個元素開始逐個元素向前比較,如果2個數組長度不等,則只比較較短長度數組個數元素。請編程實現上述比較,并返回比較中發現的不相等元素的個數
      比如:
      數組{1,3,5}和數組{77,21,1,3,5}按題述要求比較,不相等元素個數為0
      數組{1,3,5}和數組{77,21,1,3,5,7}按題述要求比較,不相等元素個數為3
      ? 要求實現函數: 
      int array_compare(int len1, int array1[], int len2, int array2[])
      【輸入】 int len1:輸入被比較數組1的元素個數;
      int array1[]:輸入被比較數組1;
      int len2:輸入被比較數組2的元素個數;
      int array2[]:輸入被比較數組2;
      【輸出】 無 
      【返回】 不相等元素的個數,類型為int
      ? 示例 
      1) 輸入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5
      函數返回:0
      2) 輸入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6
      函數返回:3




      #include<stdlib.h>

      #include<stdio.h>

      #include<string.h>

      int array_compare(int len1, int array1[], int len2, int array2[])

      {

      int count=0;

      for( ;len1>=0&&len2>=0 ;len1--,len2--)

      {

      if(array1[len1-1]==array2[len2-1])

      {

               count++;

      }

      }

      return count;

      }

      int main()

      {

      int result=0;

      int array1[]={1,3,5};

      int len1=3;

      int array2[]={77,12,1,3,5};

      int len2=5;

      result=array_compare( len1, array1,  len2, array2);  ///result=array_compare( len1, array1[],  len2, array2[]);不能這樣

                                                               // 函數形參中永遠只是傳得首地址,不能傳數組                       切記切記。。。。!

      printf("the result is %d", result);

      }



      第5題:


      輸入一個由隨機數組成的數列(數列中每個數均是大于0的整數,長度已知),和初始計數值m。從數列首位置開始計數,計數到m后,將數列該位置數值替換計數值m,并將數列該位置數值出列,然后從下一位置從新開始計數,直到數列所有數值出列為止。如果計數到達數列尾段,則返回數列首位置繼續計數。請編程實現上述計數過程,同時輸出數值出列的順序

      比如: 輸入的隨機數列為:3,1,2,4,初始計數值m=7,從數列首位置開始計數(數值3所在位置)
      第一輪計數出列數字為2,計數值更新m=2,出列后數列為3,1,4,從數值4所在位置從新開始計數
      第二輪計數出列數字為3,計數值更新m=3,出列后數列為1,4,從數值1所在位置開始計數
      第三輪計數出列數字為1,計數值更新m=1,出列后數列為4,從數值4所在位置開始計數
      最后一輪計數出列數字為4,計數過程完成。
      輸出數值出列順序為:2,3,1,4。

      ? 要求實現函數: 
      void array_iterate(int len, int input_array[], int m, int output_array[])
      【輸入】 int len:輸入數列的長度;
      int intput_array[]:輸入的初始數列
      int m:初始計數值
      【輸出】 int output_array[]:輸出的數值出列順序
      【返回】 無

      ? 示例 
      輸入:int input_array[] = {3,1,2,4},int len = 4, m=7
      輸出:output_array[] = {2,3,1,4}




      ////////////循環鏈表實現//////////////////////

      #include<stdio.h>

      #include<stdlib.h>

      #include<string.h>

      typedef struct Node

      {

      int num;

      struct node *next;

      } node;

      node *creat(int len , int input_array[])

      {

      node *h,*s,*p;

      int i;

      h=(node*)malloc(sizeof(node));

      h->num=input_array[0];

      p=h;

      for(i=1;i<len;i++)

       {

       s=(node*)malloc(sizeof(node));

       s->num=input_array[i];

       p->next=s;

       p=s;

       }

       p->next=h;

       

       return (h);

      }

      void array_iterate(int len, int input_array[], int m)

      {

      node *q,*p,*s;

      int i=0,j=0,k;

      int output_array[4];

      p=creat(len,input_array);

      while(p->next!=p)

      {

      for(i=1;i<m;i++)

      {

      q=p;

      p=p->next;

      }

      m=p->num;

          printf("%5d",m);

      output_array[j++]=m;


      s=p;

      q->next=p->next;

      p=p->next;

      free(s);

      s=NULL;

      }

      m=p->num;

          printf("%5d\n",m);

      output_array[j]=p->num;

      k=j;

      for(j=0 ; j<=k; j++)

      {

      printf("%5d",output_array[j]);

      }

       

      }

      int main()

      {

      int input_array[]={3,1,2,4};

      int len=4;

      int m=7;

      int output_array[4];

      array_iterate(len,  input_array, m, output_array);

      }



      第6題:


      我國大陸運營商的手機號碼標準格式為:國家碼+手機號碼,例如:8613912345678。特點如下:

      1、  長度13位;

      2、  以86的國家碼打頭;

      3、  手機號碼的每一位都是數字。

       

      請實現手機號碼合法性判斷的函數要求:

      1)  如果手機號碼合法,返回0;

      2)  如果手機號碼長度不合法,返回1

      3)  如果手機號碼中包含非數字的字符,返回2;

      4)  如果手機號碼不是以86打頭的,返回3;

      【注】除成功的情況外,以上其他合法性判斷的優先級依次降低。也就是說,如果判斷出長度不合法,直接返回1即可,不需要再做其他合法性判斷。

      l 要求實現函數:

      int verifyMsisdn(char* inMsisdn)

      【輸入】 char* inMsisdn,表示輸入的手機號碼字符串。

      【輸出】  無

      【返回】  判斷的結果,類型為int。

      l 示例

      輸入:  inMsisdn = “869123456789“

      輸出:  無

      返回:  1

      輸入:  inMsisdn = “88139123456789“

      輸出:  無

      返回:  3

      輸入:  inMsisdn = “86139123456789“

      輸出:  無

      返回:  0

       




      #include<stdio.h>

      #include<stdlib.h>

      #include<assert.h>

      #include<string.h>

      #define LENGTH  13

       

      int verifyMsisdn(char *inMsisdn)

      {


      char *pchar=NULL;

      assert(inMsisdn!=NULL);

      if(LENGTH==strlen(inMsisdn))

      {

      if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6'))

      {

      while(*inMsisdn!='\0')

      {

      if((*inMsisdn>='0')&&(*inMsisdn<='9'))

      inMsisdn++;

      else 

      return 2 ;

      }

      }

      else

      return 3;

      }

      else

      return 1;

      return 0;

      }

       

      int main()

      {

      char *pchar=NULL;

      unsigned char ichar=0;

      int result;

      switch(ichar)

      {

      case 0:

      pchar="8612345363789";break;

      case 1:

      pchar="861111111111111";break;

      case 2:

      pchar="86s1234536366"; break;

      default: 

      break;

      }

         result =verifyMsisdn(pchar);

          printf("result is %d\n",result);

      }



      第7題:


      比較兩個數組,要求從數組最后一個元素開始逐個元素向前比較,如果2個數組長度不等,則只比較較短長度數組個數元素。請編程實現上述比較,并返回比較中發現的不相等元素的個數
      比如:
      數組{1,3,5}和數組{77,21,1,3,5}按題述要求比較,不相等元素個數為0
      數組{1,3,5}和數組{77,21,1,3,5,7}按題述要求比較,不相等元素個數為3

      ? 要求實現函數: 
      int array_compare(int len1, int array1[], int len2, int array2[])

      【輸入】 int len1:輸入被比較數組1的元素個數;
      int array1[]:輸入被比較數組1;
      int len2:輸入被比較數組2的元素個數;
      int array2[]:輸入被比較數組2;
      【輸出】 無 
      【返回】 不相等元素的個數,類型為int

      ? 示例 
      1) 輸入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5
      函數返回:0
      2) 輸入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6
      函數返回:3




      #include<stdlib.h>

      #include<stdio.h>

      #include<string.h>

       

      int array_compare(int len1, int array1[], int len2, int array2[])

      {

      int count=0;

       

      for( ;len1>=0&&len2>=0 ;len1--,len2--)

      {

      if(array1[len1-1]==array2[len2-1])

      {

               count++;

      }

      }

      return count;

      }

       

      int main()

      {

      int result=0;

      int array1[]={1,3,5};

      int len1=3;

       

      int array2[]={77,12,1,3,5};

      int len2=5;

       

      result=array_compare(len1, array1, len2, array2);  

      ///result=array_compare( len1, array1[],  len2, array2[]);不能這樣

      // 函數形參中永遠只是傳得首地址,不能傳數組                       切記切記。。。。!

      printf("the result is %d", result);

      }



      第8題:


       問題描述: 輸入一個只包含個位數字的簡單四則運算表達式字符串,計算該表達式的值
      注: 1、表達式只含 +, -, *, / 四則運算符,不含括號
      2、表達式數值只包含個位整數(0-9),且不會出現0作為除數的情況
      3、要考慮加減乘除按通常四則運算規定的計算優先級
      4、除法用整數除法,即僅保留除法運算結果的整數部分。比如8/3=2。輸入表達式保證無0作為除數情況發生
      5、輸入字符串一定是符合題意合法的表達式,其中只包括數字字符和四則運算符字符,除此之外不含其它任何字符,不會出現計算溢出情況
      ? 要求實現函數: 
      int calculate(int len,char *expStr)
      【輸入】 int len: 字符串長度;
      char *expStr: 表達式字符串;
      【輸出】 無
      【返回】 計算結果

      ? 示例 
      1) 輸入:char *expStr = “1+4*5-8/3”
      函數返回:19
      2) 輸入:char *expStr = “8/3*3”
      函數返回:6 




      #include <stdio.h>

       

      /*

       * author by wanww

       * time: 2021-09-07

       */

      using namespace std;

      int array_compare(int len1, int array1[], int len2, int array2[])

      {

          if(len1 == len2) {

      int count = 0;

      for (int i=0;i<len1;i++)

      {

      if(array1[i]!=array2[i]) count++;

      }

      return count;

      } else if(len1<len2) {

      return array_compare(len1, array1,len1,array2+len2-len1);

      } else {

      return array_compare(len2,array1+len1-len2,len2,array2);

      }

      }

       

      void array_iterate(int len, int input_array[], int m,int output_array[])

      {

      int * flag = new int[len];

      memset(flag,0,len*4);

      int hasout=0;  //已經出列的數字個數

      int start = 0; //開始的下標號

      int j=0;       //當前以報到的數字

      while(true)

      {

      if(flag[start] == 0) //當前元素還沒出列

      {

                  j++;  

      if(j==m) //已經計數到m,當前start下標的元素出列

      {

          output_array[hasout] = input_array[start];

      flag[start] = 1; //標記當前元素已經出列

      hasout ++;

      if(hasout == len) break; //所有的元素都已經出列,結束程序

      //初始化下一輪的數字

      j = 0;

      m = input_array[start];

      }

      start ++;

      if(start==len) start = 0;


      }

      delete [] flag;


      }

      int calculate(int len,char *expStr)

      {

      struct  {

      char opdata[200];

      int top;

      }opstack;

      //定義操作符棧

      opstack.top = -1;

      int i=0;//遍歷字符串的下標

      int t=0;//當前后綴表達式的長度

      char ch = expStr[i];

      while (ch!='\0')

      {

      switch (ch)

      {

      case '+':

      case '-':

      while (opstack.top != -1)

      {

      expStr[t] = opstack.opdata[opstack.top];

      opstack.top--;

      t++;

      }

      opstack.top++;

      opstack.opdata[opstack.top] = ch;

      break;

      case '*':

      case '/':

      while (opstack.top != -1 && (opstack.opdata[opstack.top] =='*' || opstack.opdata[opstack.top] =='/') )

      {

      expStr[t] = opstack.opdata[opstack.top];

      opstack.top--;

      t++;

      }

      opstack.top++;

      opstack.opdata[opstack.top] = ch;

      break;

      default:

      expStr[t] = ch;

      t++;

      break;

      }

      i++;

      ch = expStr[i];

      }

      while (opstack.top != -1)//將棧中所有的剩余的運算符出棧

      {

          expStr[t] = opstack.opdata[opstack.top];

      opstack.top--;

      t++;

      }

      expStr[t]='\0';

      struct  {

      int numeric[200];

      int top;

      }data;

      data.top = -1;

      i=0;

      ch = expStr[i];

          while (ch!='\0')

          {

      if (ch>='0' && ch <= '9' )

      {

      data.top++;

      data.numeric[data.top] = ch-'0';

      else if('+' == ch)

      {

      int tmp = data.numeric[data.top-1]  + data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      else if('-' == ch)

      {

      int tmp = data.numeric[data.top-1]  - data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      else if('*' == ch)

      {

      int tmp = data.numeric[data.top-1]  * data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      else if('/' == ch)

      {

          if(data.numeric[data.top] == 0)

      {

      printf("cannot be zero of the divide\n");

      exit(1);

      }

      int tmp = data.numeric[data.top-1] / data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      i++;

      ch = expStr[i];

          }

      return data.numeric[data.top];

      }

      void main()

      {

      int array1[] = {1,3,5};

      int len1 = 3;

      int array2[] = {77,21,1,3,5,7};

      int len2 = 6;

      int count = array_compare(sizeof(array1)/sizeof(int),array1,sizeof(array2)/sizeof(int),array2);

      printf("%d\n",count);

               printf("*****************************************************\n");

      int input_array[] = {3,1,2,4};

      int len = 4;

      int m=7;


      int * output_array = new int[sizeof(input_array)/sizeof(int)];


      array_iterate(4,input_array,7,output_array);

           

      for (int i=0;i<sizeof(input_array)/sizeof(int);i++)

      {

      printf("%d ",output_array[i]);

      }

          

      delete [] output_array;

      printf("\n*****************************************************\n");

      char expStr[] = "8/3*3";

          int result = calculate(strlen(expStr),expStr);

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

      printf("%d\n",result);

      }



      第9題:


      選秀節目打分,分為專家評委和大眾評委,score[] 數組里面存儲每個評委打的分數,judge_type[] 里存儲與 score[] 數組對應的評委類別,judge_type[i] == 1,表示專家評委,judge_type[i] == 2,表示大眾評委,n表示評委總數。打分規則如下:專家評委和大眾評委的分數先分別取一個平均分(平均分取整),然后,總分 = 專家評委平均分  * 0.6 + 大眾評委 * 0.4,總分取整。如果沒有大眾評委,則 總分 = 專家評委平均分,總分取整。函數最終返回選手得分。

      函數接口   int cal_score(int score[], int judge_type[], int n) 




      #include<stdio.h>

      #include<string.h>

      #include<iostream.h>

      #include<conio.h>

      #define N 5

       

      int cal_score(int score[], int judge_type[], int n) 

      {

      int expert=0;

          int dazhong=0;

      int zongfen=0;

      int i;

      int number=0;


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

      {

      if(judge_type[i]==1)

      {

      expert=expert+score[i];

      number++;

      }

      else dazhong=dazhong+score[i];

      }

      if(number==N)

      {

      zongfen=(int)(expert/N);

      }

      else

          {

      expert=(int)(expert/number);

      dazhong=(int)(dazhong/(N-number));

      zongfen=int(0.6*expert+0.4*dazhong);

      }

      return zongfen;

      }

      int main()

      {

      int score[N];

      int judge_type[N];

      int numberlast=0;

      int i;

      printf("please input the %d score:\n",N);

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

      scanf("%d",&score[i]);

      printf("please input the level(1:expert,2:dazhong)\n");

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

      scanf("%d",&judge_type[i]);

      numberlast=cal_score(score,judge_type,N);

      printf("the last score is %d\n",numberlast);

      return 0;

      }



      第10題:


      給定一個數組input[] ,如果數組長度n為奇數,則將數組中最大的元素放到 output[] 數組最中間的位置,如果數組長度n為偶數,則將數組中最大的元素放到 output[] 數組中間兩個位置偏右的那個位置上,然后再按從大到小的順序,依次在第一個位置的兩邊,按照一左一右的順序,依次存放剩下的數。 

            例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}




      #include<stdio.h>

      #include<string.h>

      #include<conio.h>

      void sort(int input[], int n, int output[])

      {

      int i,j;

      int k=1;

      int temp;

      int med;

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

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

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

      {temp=input[j];input[j]=input[j+1];input[j+1]=temp;}

      if(n%2!=0)

      {

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

      printf("%2d",input[i]);

      printf("\n");

      med=(n-1)/2;

      output[med]=input[n-1];

      for(i=1;i<=med;i++)

      {

      output[med-i]=input[n-1-k];

      output[med+i]=input[n-2-k];

      k=k+2;


      }

      }

      else

      {


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

      printf("%2d",input[i]);

      printf("\n");

      med=n/2;

      output[med]=input[n-1];

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

      {

      output[med-i]=input[n-1-k];

      output[med+i]=input[n-2-k];

      k=k+2;

      }

      output[0]=input[0];    

      }

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

      printf("%2d",output[i]);

      printf("\n");

      }

      int main()

      {

      int a[6]={3,6,1,9,7,8};

      int b[6]={0};

      for(int i=0;i<6;i++)

      printf("%2d",a[i]);

      printf("\n");

      sort(a,6,b);

      return 0;

      }



      第11題:


      操作系統任務調度問題。操作系統任務分為系統任務和用戶任務兩種。其中,系統任務的優先級 < 50,用戶任務的優先級 >= 50且 <= 255。優先級大于255的為非法任務,應予以剔除,F有一任務隊列task[],長度為n,task中的元素值表示任務的優先級,數值越小,優先級越高。函數scheduler實現如下功能,將task[] 中的任務按照系統任務、用戶任務依次存放到 system_task[] 數組和 user_task[] 數組中(數組中元素的值是任務在task[] 數組中的下標),并且優先級高的任務排在前面,數組元素為-1表示結束。 

            例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}    system_task[] = {0, 3, 1, 7, -1}    user_task[] = {4, 8, 2, 6, -1}

      函數接口    void scheduler(int task[], int n, int system_task[], int user_task[])




      #include<stdio.h>

      #include<string.h>

      #include<malloc.h>

      #include<iostream.h>

       

      void scheduler1(int task[], int n, int system_task[], int user_task[])

      {

      int i;

      int j=0;

      int *p,*pp,*p_user,*pp_user;

      int index=0;

      int count,count2;

      int min=0;

      int k=0;

      p=(int*)malloc(sizeof(int)*n);

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

      p[i]=0;

      pp=(int*)malloc(sizeof(int)*n);

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

      pp[i]=0;

      p_user=(int*)malloc(sizeof(int)*n);

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

      p_user[i]=0;

      pp_user=(int*)malloc(sizeof(int)*n);

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

      pp_user[i]=0;


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

      {

      if(task[i]<50)

      {

      {

      system_task[j]=task[i];

      pp[j]=i;

      j++;

      }

      count=j;

      }


      else if(task[i]<=255)

      {


      {

      user_task[k]=task[i];

      pp_user[k]=i;

      k++;

      }

      count2=k;

      }

      else task[i]=task[i];


      }


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

      printf("%3d",system_task[i]);

      printf("\n");



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

      {

      min=system_task[0];

      for(j=1;j<count;j++)

      {


      if(system_task[j]<min)

      {

      min=system_task[j];

      p[i]=j;  

      }


      }

      system_task[p[i]]=51;

      }


          pp[count]=-1;

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

      printf("%3d",pp[p[i]]);

      printf("%3d\n",pp[count]);



      /***********************************************************/


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

      printf("%4d",user_task[i]);

      printf("\n");


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

      {

      min=user_task[0];

      for(j=1;j<count2;j++)

      {


      if(user_task[j]<min)

      {

      min=user_task[j];

      p_user[i]=j;  

      }


      }

      user_task[p_user[i]]=256;

      }


          pp_user[count2]=-1;

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

      printf("%4d",pp_user[p_user[i]]);

      printf("%3d\n",pp_user[count2]);


      }

       

      int main()

      {

      int task[9]={0, 30, 155, 1, 80, 300,170, 40, 99};

      int system_task[9]={0};

      int user_task[9]={0};

      scheduler1(task,9,system_task,user_task);

      return 0;

      }



      第12題:


      從兩個數組的最后一個元素比較兩個數組中不同元素的個數,如有array1[5]={77,21,1,3,5}, array2[3]={1,3,5},從array1[4]與array2[2]比較開始,到array1[2]與array[0]比較結束。這樣得出它們不同的元素個數為0,若array1[6]={77,21,1,3,5,7},那么他們不同的元素為3。

      函數原型為 int compare_array( int len1, int array1[], int len2, int array2[] );

      其中,len1與len2分別為數組array1[]和array2[]的長度,函數返回值為兩個數組不同元素的個數。




      以下是上題的函數完整實現:

      //diff_num.cpp

       

      #include<stdio.h>

      int compare_array(int len1,int array1[],int len2,int array2[])

      {

      int i,t,small,num=0;

      //把兩數組倒置

      for(i=0;i<len1/2;i++)

      {

      t=array1[i];

      array1[i]=array1[len1-i-1];

      array1[len1-i-1]=t;

      }

      for(i=0;i<len2/2;i++)

      {

      t=array2[i];

      array2[i]=array2[len2-i-1];

      array2[len2-i-1]=t;

      }

      //輸出倒置后的兩數組

      /* for(i=0;i<len1;i++)

      printf("%d ",array1[i]);

      printf("\n");

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

      printf("%d ",array2[i]);

      */ printf("\n");

      if(len1>len2)

      small=len2;

      else

      small=len1;

      num=small;

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

      {

      if(array1[i]==array2[i])

      num--;

      }

      printf("num=%d\n",num);

      return num;

      }

      void main()

      {

      int array1[5]={77,21,1,3,5},array2[3]={1,3,5};

      int len1=5,len2=3;

      compare_array(len1,array1,len2,array2);

      }



      第13題:


      輸入一個字符串,用指針求出字符串的長度。




      #include <stdio.h>

      int main()

      {

         char str[20],  *p;

         int length=0;

         printf(“Please input a string: ”);

         gets(str);

         p=str;

         while(*p++)

         {

      length++;

      }

      printf(“The length of string is %d\n”, length);

      return 0;

      }



      第14題:


      使用C語言實現字符串中子字符串的替換

      描述:編寫一個字符串替換函數,如函數名為 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc為原字符串,strFind是待替換的字符串,strReplace為替換字符串。

      舉個直觀的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”這個字符串,把其中的“RST”替換為“ggg”這個字符串,結果就變成了:

      ABCDEFGHIJKLMNOPQgggUVWXYZ




      答案一:

      #include <stdio.h>

      #include <string.h>

      void StrReplace(char* strSrc, char* strFind, char* strReplace);

      #define M 100;

      void main()

      {char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

      char s1[]="RST";

      char s2[]="ggg";

      StrReplace(s,s1,s2);

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

      }

      void StrReplace(char* strSrc, char* strFind, char* strReplace)

      {

              int i=0;

              int j;

              int n=strlen(strSrc);

              int k=strlen(strFind);

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

              {

                      if(*(strSrc+i)==*strFind)

                      {

                              for(j=0;j<k;j++)

                              {

                                      if(*(strSrc+i+j)==*(strFind+j))

                                      {

                                              *(strSrc+i+j)=*(strReplace+j);

                                      }

                                      else continue;

                              }

                      }

              }

      }

      答案二:

      #include <stdio.h>

      #define MAX 100

      StrReplace(char *s, char *s1, char *s2) {

          char *p;

          for(; *s; s++) {

              for(p = s1; *p && *p != *s; p++);

              if(*p) *s = *(p - s1 + s2);

          }

      }

      int main()

      {

          char s[MAX];            //s是原字符串

          char s1[MAX], s2[MAX];  //s1是要替換的

                                  //s2是替換字符串

          puts("Please input the string for s:");

          scanf("%s", s);

          puts("Please input the string for s1:");

          scanf("%s", s1);

          puts("Please input the string for s2:");

          scanf("%s", s2);

          StrReplace(s, s1, s2);

          puts("The string of s after displace is:");

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

          return 0;

      }

      答案三:

      #include <stdio.h>

      #include <stdlib.h>

      #include <string.h>

      #define M 100

      void StrReplace(char* strSrc, char* strFind, char* strReplace);

      int main()

      {

      char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

      char s1[]="RST";

      char s2[]="gggg";

      StrReplace(s,s1,s2);

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

      return 0;

      }

      void StrReplace(char* strSrc, char* strFind, char* strReplace)

      {

      while(*strSrc != '\0')

      {

      if(*strSrc == *strFind)

      {

      if(strncmp(strSrc,strFind,strlen(strFind)) == 0 )

      {

      int i = strlen(strFind);

      int j = strlen(strReplace);

      printf("i = %d,j = %d\n",i,j);

      char *q = strSrc + i;

      printf("*q = %s\n",q);

      while((*strSrc++ = *strReplace++) != '\0');

      printf("strSrc - 1 = %s\n",strSrc - 1);

      printf("*q = %s\n",q);

      while((*strSrc++ = *q++) != '\0');

      }

      else

      {

      strSrc++;

      }

      }

      else

      {

      strSrc++;

      }

      }

      }



      第15題:


      編寫一個程序實現功能:將字符串”Computer Secience”賦給一個字符數組,然后從第一個字母開始間隔的輸出該串,用指針完成。




      #include <stdio.h>

      #include <string.h>

      int main()

      {

      char str[]=”Computer Science”;

          int flag=1;

      char *p=str;

      while(*p)

      {

         if ( flag )

         { 

             printf(“%c”,*p);

             }

             flag = (flag + 1) % 2;

             p++;

          }

      printf(“\n”);

          return 0;

      }



      第16題:


      使用C語言實現字符串中子字符串的替換

      描述:編寫一個字符串替換函數,如函數名為 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc為原字符串,strFind是待替換的字符串,strReplace為替換字符串。

      舉個直觀的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”這個字符串,把其中的“RST”替換為“ggg”這個字符串,結果就變成了:

      ABCDEFGHIJKLMNOPQgggUVWXYZ




      答案一:

      #include <stdio.h>

      #include <string.h>

      void StrReplace(char* strSrc, char* strFind, char* strReplace);

      #define M 100;

      void main()

      {char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

      char s1[]="RST";

      char s2[]="ggg";

      StrReplace(s,s1,s2);

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

      }

      void StrReplace(char* strSrc, char* strFind, char* strReplace)

      {

              int i=0;

              int j;

              int n=strlen(strSrc);

              int k=strlen(strFind);

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

              {

                      if(*(strSrc+i)==*strFind)

                      {

                              for(j=0;j<k;j++)

                              {

                                      if(*(strSrc+i+j)==*(strFind+j))

                                      {

                                              *(strSrc+i+j)=*(strReplace+j);

                                      }

                                      else continue;

                              }

                      }

              }

      }

      答案二:

      #include <stdio.h>

      #define MAX 100

      StrReplace(char *s, char *s1, char *s2) {

          char *p;

          for(; *s; s++) {

              for(p = s1; *p && *p != *s; p++);

              if(*p) *s = *(p - s1 + s2);

          }

      }

      int main()

      {

          char s[MAX];            //s是原字符串

          char s1[MAX], s2[MAX];  //s1是要替換的

                                  //s2是替換字符串

          puts("Please input the string for s:");

          scanf("%s", s);

          puts("Please input the string for s1:");

          scanf("%s", s1);

          puts("Please input the string for s2:");

          scanf("%s", s2);

          StrReplace(s, s1, s2);

          puts("The string of s after displace is:");

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

          return 0;

      }

      答案三:

      #include <stdio.h>

      #include <stdlib.h>

      #include <string.h>

      #define M 100

      void StrReplace(char* strSrc, char* strFind, char* strReplace);

      int main()

      {

      char s[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

      char s1[]="RST";

      char s2[]="gggg";

       

      StrReplace(s,s1,s2);

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

       

      return 0;

      }

      void StrReplace(char* strSrc, char* strFind, char* strReplace)

      {

      while(*strSrc != '\0')

      {

      if(*strSrc == *strFind)

      {

      if(strncmp(strSrc,strFind,strlen(strFind)) == 0 )

      {

      int i = strlen(strFind);

      int j = strlen(strReplace);

      printf("i = %d,j = %d\n",i,j);

      char *q = strSrc + i;

      printf("*q = %s\n",q);

      while((*strSrc++ = *strReplace++) != '\0');

      printf("strSrc - 1 = %s\n",strSrc - 1);

      printf("*q = %s\n",q);

      while((*strSrc++ = *q++) != '\0');

      }

      else

      {

      strSrc++;

      }

      }

      else

      {

      strSrc++;

      }

      }

      }



      第17題:


      編寫一個程序實現功能:將兩個字符串合并為一個字符串并且輸出,用指針實現。

         char str1[20]={“Hello ”}, str2[20]={“World ”};




      #include <stdio.h>

       

      int main()

      {

         char str1[20]={“Hello ”}, str2[20]={“World ”};

         char *p=str1, *q=str2;

       

         while( *p ) p++;

         while( *q ) 

         {

            *p = *q;

            p++;

            q++;

          }

          *p = ‘\0’;

          printf(“%s\n”, str1);

       

          return 0;

      }



      第18題:


      算分數的問題,去掉一個最高分一個最低分,求平均分 




      #include<stdio.h>   

      float avescore(float score[],int n)  

      {  

          float min=0;  

          float max=0;  

          int minindex=0;  

          int maxindex=0;  

          float sum=0;  

          min=score[0];  

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

              if(score[i]<min)  

              {  

                  min=score[i];  

                  minindex=i;  

              }  

              score[minindex]=0;  

              max=score[0];  

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

                  if(score[i]>max)  

                  {  

                      max=score[i];  

                      maxindex=i;  

                  }  

                  score[maxindex]=0;  

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

                      sum+=score[i];  

                  sum=sum/(n-2);  

                  return sum;           

      }  

      void main()  

      {  

          float score[6]={70,80,90,98,87,86};  

          float lastscore;  

          lastscore=avescore(score,6);  

          printf("the last score is :%5.2f\n",lastscore);  

            

      }  

      運行結果:

      the last score is :85.75



      第19題:


      對一個數組,將數組中偶數從大到小排序,奇數從小到大排序,奇數和偶數交叉著放且輸出數組第一位放奇數  若奇數和偶數不等長,則把剩下的直接放到數組中。

      思路:先進行奇偶判斷,得到奇數和偶數數組。然后對兩數組排序,進行長度判斷,最后組織數據。




      #include<stdio.h>   

      #include<malloc.h>   

        

      void jiou(int a[],int n)  

      {  

          int *p1;  

          int *p2;  

          int i,j;  

          int k=0;  

          int kk=0;  

          int count1=0;  

          int count2=0;  

          int temp;  

          int temp2;  

          int m=0;  

          p1=(int*)malloc(sizeof(int)*n);  

          p2=(int*)malloc(sizeof(int)*n);  

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

          {  

              p1[i]=0;  

              p2[i]=0;  

          }  

            

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

          {  

                

              if((a[i]%2)!=0)  

              {p2[kk++]=a[i];}  

              else  

              {p1[k++]=a[i];}  

          }  

          count1=k;  

          count2=kk;  

            

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

              printf("%3d",p2[i]);  

          printf("\n");  

            

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

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

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

                  {temp2=p2[j];p2[j]=p2[j+1];p2[j+1]=temp2;}  

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

                      printf("%3d",p2[i]);  

                  printf("\n");  

                    

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

                      printf("%3d",p1[i]);  

                  printf("\n");  

                    

                    

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

                      for(j=0;j<count1-i;j++)  

                          if(p1[j]<p1[j+1])  

                          {temp=p1[j];p1[j]=p1[j+1];p1[j+1]=temp;}  

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

                              printf("%3d",p1[i]);  

                          printf("\n");  

                            

                            

                            

                          if(count1>count2)  

                                

                          {  

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

                              {  

                                  a[i+m]=p2[i];  

                                  a[i+1+m]=p1[i];  

                                  m=m+1;  

                              }  

                              for(i=0;i<count1-count2;i++)  

                                  a[2*count2+i]=p1[i+count2];  

                                

                          }  

                          else  

                          {  

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

                              {  

                                  a[i+m]=p2[i];  

                                  a[i+1+m]=p1[i];  

                                  m=m+1;  

                                    

                              }  

                              for(i=0;i<count2-count1;i++)  

                                  a[2*count1+i]=p2[i+count1];  

                                

                          }  

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

                              printf("%3d",a[i]);  

                          printf("%\n");                

                            

      }  

      void main()  

      {  

          int a[10]={2,3,14,6,2,15,12,14,4,11};  

          jiou(a,10);  

            

      }  

      運行結果:
       3 15 11
       3 11 15
       2 14  6  2 12 14  4
       14 14 12  6  4  2  2
       3 14 11 14 15 12  6  4  2  2



      第20題:


      問題描述: 輸入一個只包含個位數字的簡單四則運算表達式字符串,計算該表達式的值
      注: 1、表達式只含 +, -, *, / 四則運算符,不含括號
      2、表達式數值只包含個位整數(0-9),且不會出現0作為除數的情況
      3、要考慮加減乘除按通常四則運算規定的計算優先級
      4、除法用整數除法,即僅保留除法運算結果的整數部分。比如8/3=2。輸入表達式保證無0作為除數情況發生
      5、輸入字符串一定是符合題意合法的表達式,其中只包括數字字符和四則運算符字符,除此之外不含其它任何字符,不會出現計算溢出情況
      ? 要求實現函數: 
      int calculate(int len,char *expStr)
      【輸入】 int len: 字符串長度;
      char *expStr: 表達式字符串;
      【輸出】 無
      【返回】 計算結果

      ? 示例 
      1) 輸入:char *expStr = “1+4*5-8/3”
      函數返回:19
      2) 輸入:char *expStr = “8/3*3”
      函數返回:6 




      #include <stdio.h>

       

      /*

       * author by wanww

       * time: 2021-09-07

       */

      using namespace std;

      int array_compare(int len1, int array1[], int len2, int array2[])

      {

          if(len1 == len2) {

      int count = 0;

      for (int i=0;i<len1;i++)

      {

      if(array1[i]!=array2[i]) count++;

      }

      return count;

      } else if(len1<len2) {

      return array_compare(len1, array1,len1,array2+len2-len1);

      } else {

      return array_compare(len2,array1+len1-len2,len2,array2);

      }

      }

       

      void array_iterate(int len, int input_array[], int m,int output_array[])

      {

      int * flag = new int[len];

      memset(flag,0,len*4);

      int hasout=0;  //已經出列的數字個數

      int start = 0; //開始的下標號

      int j=0;       //當前以報到的數字

      while(true)

      {

      if(flag[start] == 0) //當前元素還沒出列

      {

                  j++;  

      if(j==m) //已經計數到m,當前start下標的元素出列

      {

          output_array[hasout] = input_array[start];

      flag[start] = 1; //標記當前元素已經出列

      hasout ++;

      if(hasout == len) break; //所有的元素都已經出列,結束程序

      //初始化下一輪的數字

      j = 0;

      m = input_array[start];

      }

      start ++;

      if(start==len) start = 0;


      }

      delete [] flag;


      }

      int calculate(int len,char *expStr)

      {

      struct  {

      char opdata[200];

      int top;

      }opstack;

      //定義操作符棧

      opstack.top = -1;

      int i=0;//遍歷字符串的下標

      int t=0;//當前后綴表達式的長度

      char ch = expStr[i];

      while (ch!='\0')

      {

      switch (ch)

      {

      case '+':

      case '-':

      while (opstack.top != -1)

      {

      expStr[t] = opstack.opdata[opstack.top];

      opstack.top--;

      t++;

      }

      opstack.top++;

      opstack.opdata[opstack.top] = ch;

      break;

      case '*':

      case '/':

      while (opstack.top != -1 && (opstack.opdata[opstack.top] =='*' || opstack.opdata[opstack.top] =='/') )

      {

      expStr[t] = opstack.opdata[opstack.top];

      opstack.top--;

      t++;

      }

      opstack.top++;

      opstack.opdata[opstack.top] = ch;

      break;

      default:

      expStr[t] = ch;

      t++;

      break;

      }

      i++;

      ch = expStr[i];

      }

      while (opstack.top != -1)//將棧中所有的剩余的運算符出棧

      {

          expStr[t] = opstack.opdata[opstack.top];

      opstack.top--;

      t++;

      }

      expStr[t]='\0';

      struct  {

      int numeric[200];

      int top;

      }data;

      data.top = -1;

      i=0;

      ch = expStr[i];

          while (ch!='\0')

          {

      if (ch>='0' && ch <= '9' )

      {

      data.top++;

      data.numeric[data.top] = ch-'0';

      else if('+' == ch)

      {

      int tmp = data.numeric[data.top-1]  + data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      else if('-' == ch)

      {

      int tmp = data.numeric[data.top-1]  - data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      else if('*' == ch)

      {

      int tmp = data.numeric[data.top-1]  * data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      else if('/' == ch)

      {

          if(data.numeric[data.top] == 0)

      {

      printf("cannot be zero of the divide\n");

      exit(1);

      }

      int tmp = data.numeric[data.top-1] / data.numeric[data.top];

      data.top--;

      data.numeric[data.top] = tmp;

      }

      i++;

      ch = expStr[i];

          }

      return data.numeric[data.top];

      }

      void main()

      {

      int array1[] = {1,3,5};

      int len1 = 3;

      int array2[] = {77,21,1,3,5,7};

      int len2 = 6;

      int count = array_compare(sizeof(array1)/sizeof(int),array1,sizeof(array2)/sizeof(int),array2);

      printf("%d\n",count);

               printf("*****************************************************\n");

      int input_array[] = {3,1,2,4};

      int len = 4;

      int m=7;


      int * output_array = new int[sizeof(input_array)/sizeof(int)];


      array_iterate(4,input_array,7,output_array);

           

      for (int i=0;i<sizeof(input_array)/sizeof(int);i++)

      {

      printf("%d ",output_array[i]);

      }

          

      delete [] output_array;

      printf("\n*****************************************************\n");

      char expStr[] = "8/3*3";

          int result = calculate(strlen(expStr),expStr);

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

      printf("%d\n",result);

      }



      第21題:


      選秀節目打分,分為專家評委和大眾評委,score[] 數組里面存儲每個評委打的分數,judge_type[] 里存儲與 score[] 數組對應的評委類別,judge_type[i] == 1,表示專家評委,judge_type[i] == 2,表示大眾評委,n表示評委總數。打分規則如下:專家評委和大眾評委的分數先分別取一個平均分(平均分取整),然后,總分 = 專家評委平均分  * 0.6 + 大眾評委 * 0.4,總分取整。如果沒有大眾評委,則 總分 = 專家評委平均分,總分取整。函數最終返回選手得分。

      函數接口   int cal_score(int score[], int judge_type[], int n) 



       

      #include<stdio.h>

      #include<string.h>

      #include<iostream.h>

      #include<conio.h>

      #define N 5

       

      int cal_score(int score[], int judge_type[], int n) 

      {

      int expert=0;

          int dazhong=0;

      int zongfen=0;

      int i;

      int number=0;


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

      {

      if(judge_type[i]==1)

      {

      expert=expert+score[i];

      number++;

      }

      else dazhong=dazhong+score[i];

      }

      if(number==N)

      {

      zongfen=(int)(expert/N);

      }

      else

          {

      expert=(int)(expert/number);

      dazhong=(int)(dazhong/(N-number));

      zongfen=int(0.6*expert+0.4*dazhong);

      }

      return zongfen;

      }

      int main()

      {

      int score[N];

      int judge_type[N];

      int numberlast=0;

      int i;

      printf("please input the %d score:\n",N);

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

      scanf("%d",&score[i]);

      printf("please input the level(1:expert,2:dazhong)\n");

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

      scanf("%d",&judge_type[i]);

      numberlast=cal_score(score,judge_type,N);

      printf("the last score is %d\n",numberlast);

      return 0;

      }



      第22題:


      給定一個數組input[] ,如果數組長度n為奇數,則將數組中最大的元素放到 output[] 數組最中間的位置,如果數組長度n為偶數,則將數組中最大的元素放到 output[] 數組中間兩個位置偏右的那個位置上,然后再按從大到小的順序,依次在第一個位置的兩邊,按照一左一右的順序,依次存放剩下的數。 

      例如:

      input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             

      input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}




      #include<stdio.h>

      #include<string.h>

      #include<conio.h>

      void sort(int input[], int n, int output[])

      {

      int i,j;

      int k=1;

      int temp;

      int med;

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

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

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

      {temp=input[j];input[j]=input[j+1];input[j+1]=temp;}

      if(n%2!=0)

      {

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

      printf("%2d",input[i]);

      printf("\n");

      med=(n-1)/2;

      output[med]=input[n-1];

      for(i=1;i<=med;i++)

      {

      output[med-i]=input[n-1-k];

      output[med+i]=input[n-2-k];

      k=k+2;


      }

      }

      else

      {


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

      printf("%2d",input[i]);

      printf("\n");

      med=n/2;

      output[med]=input[n-1];

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

      {

      output[med-i]=input[n-1-k];

      output[med+i]=input[n-2-k];

      k=k+2;

      }

      output[0]=input[0];    

      }

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

      printf("%2d",output[i]);

      printf("\n");

      }

      int main()

      {

      int a[6]={3,6,1,9,7,8};

      int b[6]={0};

      for(int i=0;i<6;i++)

      printf("%2d",a[i]);

      printf("\n");

      sort(a,6,b);

      return 0;

      }



      第23題:


      操作系統任務調度問題。操作系統任務分為系統任務和用戶任務兩種。其中,系統任務的優先級 < 50,用戶任務的優先級 >= 50且 <= 255。優先級大于255的為非法任務,應予以剔除,F有一任務隊列task[],長度為n,task中的元素值表示任務的優先級,數值越小,優先級越高。函數scheduler實現如下功能,將task[] 中的任務按照系統任務、用戶任務依次存放到 system_task[] 數組和 user_task[] 數組中(數組中元素的值是任務在task[] 數組中的下標),并且優先級高的任務排在前面,數組元素為-1表示結束。 

      例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}    system_task[] = {0, 3, 1, 7, -1}

      user_task[] = {4, 8, 2, 6, -1}

      函數接口    void scheduler(int task[], int n, int system_task[], int user_task[])




      #include<stdio.h>

      #include<string.h>

      #include<malloc.h>

      #include<iostream.h>

       

      void scheduler1(int task[], int n, int system_task[], int user_task[])

      {

      int i;

      int j=0;

      int *p,*pp,*p_user,*pp_user;

      int index=0;

      int count,count2;

      int min=0;

      int k=0;

      p=(int*)malloc(sizeof(int)*n);

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

      p[i]=0;

      pp=(int*)malloc(sizeof(int)*n);

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

      pp[i]=0;

      p_user=(int*)malloc(sizeof(int)*n);

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

      p_user[i]=0;

      pp_user=(int*)malloc(sizeof(int)*n);

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

      pp_user[i]=0;


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

      {

      if(task[i]<50)

      {

      {

      system_task[j]=task[i];

      pp[j]=i;

      j++;

      }

      count=j;

      }


      else if(task[i]<=255)

      {


      {

      user_task[k]=task[i];

      pp_user[k]=i;

      k++;

      }

      count2=k;

      }

      else task[i]=task[i];


      }


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

      printf("%3d",system_task[i]);

      printf("\n");



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

      {

      min=system_task[0];

      for(j=1;j<count;j++)

      {


      if(system_task[j]<min)

      {

      min=system_task[j];

      p[i]=j;  

      }


      }

      system_task[p[i]]=51;

      }


          pp[count]=-1;

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

      printf("%3d",pp[p[i]]);

      printf("%3d\n",pp[count]);



      /***********************************************************/


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

      printf("%4d",user_task[i]);

      printf("\n");


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

      {

      min=user_task[0];

      for(j=1;j<count2;j++)

      {


      if(user_task[j]<min)

      {

      min=user_task[j];

      p_user[i]=j;  

      }


      }

      user_task[p_user[i]]=256;

      }


          pp_user[count2]=-1;

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

      printf("%4d",pp_user[p_user[i]]);

      printf("%3d\n",pp_user[count2]);


      }

       

      int main()

      {

      int task[9]={0, 30, 155, 1, 80, 300,170, 40, 99};

      int system_task[9]={0};

      int user_task[9]={0};

      scheduler1(task,9,system_task,user_task);

      return 0;

      }

       



      關聯標簽: