1. 程式人生 > >C語言常見面試題(經典中的經典)

C語言常見面試題(經典中的經典)

1. 輸入一串字元,計算其中空格的個數。 
#include <stdio.h>
#include <string.h>
int function(char *str);
int main()
{
       char str[30];
       int num = 0;
       scanf("%[^\n]", str);
       num = function(str);
       printf("num = %d\n", num);
       return 0;
}
int function(char *str)
{
       int i = 0, ret = 0;
       for(i = 0; i < strlen(str); i++)
       {
             if(str[i] == ' ')
                    ret += 1;
       }
       return ret
}
 2. 青年歌手參加歌曲大獎賽,有10個評委對她的進行打分,試程式設計求這位選手的平均得分(去掉一個最高分和一個最低分)。要求:將排序的程式碼封裝在函式體內。 
#include <stdio.h>
int * sort_1(int a[], int size);
int * sort_2(int a[], int size);
int main()
{
       int i;
       float ave = 0;
       int a[10];
       printf("plz input score like:\n");
       for(i = 0; i < 10; i++)
              scanf("%d", &a[i]);
       sort_2(a, 10);
       for(i = 0; i < 10; i++)
              printf("%d ", a[i]);
       puts("");
       for(i = 1; i < 9; i++)
       {
              printf("ave = %d\n", a[i]);
              ave = ave+a[i];
       }
       printf("final score is:%6.1f", ave/8);
       puts("");
       return 0;
}
int * sort_1(int a[], int size)
{
       int min = 0;
       int i, j;
       for(i = 0; i < size - 1; i++)
       {
              min = i;
              for(j = i + 1; j < size; j++)
              {
                     if(a[j] < a[min])
                            min = j;
              }
              if(min != i)
              {
                     a[i] ^= a[min];
                     a[min] ^= a[i];
                     a[i] ^= a[min];
              }
       }
       return a;
}
int * sort_2(int a[], int size)
{
       int i, j;
       for(i = 0; i < size; i++)
       {
              for(j = 0; j < size - 1 - i; j++)
              {
                     if(a[j] > a[j + 1])
                     {
                            a[j] ^= a[j + 1];
                            a[j + 1] ^= a[j];
                            a[j] ^= a[j + 1];
                    }
              }
       }
       return a;
}
3. 有一個3×4的矩陣,要求輸出其中值最大的元素的值,以及它的行號和列號。 
       int a[3][4] = {
              {123, 94, -10, 218},
              {3, 9, 10, -83},
              {45, 16, 44, -99}
       };        
#include <stdio.h>
int main()
{
       int a[3][4] = {
              {123, 94, -10, 218},
              {3, 9, 10, -83},
              {45, 16, 44, -99}
       };
       int i, j, max, x, y;
       max = a[0][0];
       for(i = 0; i < 3; i++)
              for(j = 0; j < 4; j++)
                     if(a[i][j] > max)
                     {
                            max = a[i][j];
                            x = i; y = j;
                     }
       printf("max = %d, x = %d, y = %d\n", max, x, y);
       return 0;
}


4. 列印以下圖案:  
* * * * * 
   * * * * * 
   * * * * * 
   * * * * * 
      * * * * * 
#include <stdio.h>

 int main(int argc,char **argv) 
{
       char a[5]={'*', '*', '*', '*', '*'}; 
       int i,j,k; 
       char space=' '; 
       for(i=0;i<5;i++) /*輸出5行*/ 
      {
              printf("\n"); /* 輸出每行前先換行*/
       //     printf(" "); /* 每行前面留5個空格 */ 
             for (j=1;j<=i;j++)                      
                     printf("%c",space); /* 每行再留1個空格*/ 
              for( k=0;k<5;k++)
                     printf("%c",a[k]); /*每行輸入5個*號*/ 
       }
       puts("");
       return 0;
}                          
 5. 求矩陣左下三角形元素之和 
#include <stdio.h>
#define N 6 
int main(int argc,char **argv){
       int i,j,sum=0; 
       int a[N][N] = {0};
       printf("input 5×5 data:\n"); 
      for(i=1;i<N;i++){ 
             printf("Input the %d line data:\n",i); 
              for(j=1;j<N;j++) 
                     scanf("%d",&a[i][j]); 
       } 
      for(i=1;i<N;i++) {
              for(j=1;j<N;j++) 
                    printf("%5d",a[i][j]); 
              printf("\n"); 
       } 
       for(i=1;i<N;i++){ 
              for(j=1;j<=i;j++) {
                    printf("%d\n", a[i][j]);
                     sum=sum+a[i][j]; 
             }
       }
       printf("sum=%d\n",sum); 
}

  6. 寫一個函式,統計一個int型別的值中有多少位為1 
#include <stdio.h>
int fun(int data);
int main()
{
       int a;
       int num;
       scanf("%d", &a);
       num = fun(a);
       printf("num = %d\n", num);
      return 0;
}
int fun(int data)
{
       int i = 0, count = 0;
       int temp = data;
        for(i = 0; i < 32; i++)
       {
              if((temp & 1) == 1)
                     count++;
        temp = temp >> 1;
       }
       return count;
}
 7. 請實現類似atoi函式,把字串“123456”轉換成數值123456 int atoi(char *str); 

#include <stdlib.h>
#define N 32
int my_atoi(char *s);
int main()
{
       char a[N];
       scanf("%s", a);
       int num = 0;
       num = my_atoi(a);
       printf("%d\n", num);
       return 0;
}
int my_atoi(char *s)
{
       char *p = s;
       char c;
       int i = 0;
       while(c=*p++)
       {
              if(c>='0' && c<='9')
              {
                     i = i*10 + (c-'0');
              }
              else
                     return -1;                
       }
       return i;
}
 8. 設計將陣列s[N]中所有奇數移到所有偶數之前的演算法。要求不另增加儲存空間; 
#include <stdio.h>
#define N 10
void sort(int *a, int n);
int main()
{
       int a[N] = {1,2,3,4,5,6,7,8,9,10};
       int i, j;
       sort(a, N);
       for(i = 0; i < N; i++)
       {
              printf("%d ", a[i]);
       }
       puts("");
       return 0;
}
void sort(int *a, int n)
{
       int i,len,temp;
       len=n-1;
       for(i=0;i<len;)
       {
              if((a[i]%2)==0) //判斷是否為偶數
              {
                     a[len] ^= a[i];
                     a[i] ^= a[len];
                     a[len] ^= a[i];
                     len--;
              }
              else
                     i++;
       }
       return;
}

9. 實現函式char *fun(char *str1, char *str2); 從字串str1中返回字串str2的地址,若str2不存在,返回-1。 
#include <stdio.h>
#include <string.h>
#define N 32
char * strstr1 (char * str1,char * str2);
int main()
{
       char str1[N], str2[N];
       char *str3;
       scanf("%[^\n]", str1);
       getchar();
       scanf("%[^\n]", str2);
       str3 = strstr1(str1, str2);
       printf("%s\n", str3);
       return 0;
}
char * strstr1 (char * str1,char * str2)
{
       char *cp = str1;
       char *s1, *s2;

       if ( !*str2 )
              return -1;
       while (*cp)
       {
              s1 = cp;
              s2 = str2;
              while (*s1 && *s2 && !(*s1-*s2))
                            s1++, s2++;
              if (!*s2)
                     return cp;
              cp++;
      }
       return cp;
}
     
 10. 實現下列函式 unsigned int sum(unsigned int val); 將val中每個位元組的值取出累加後返回。 
#include <stdio.h>
int function(int val);

int main()

{
       int a;
       scanf("%d", &a);
       int sum;
       sum = function(a);
       printf("sum = %d\n", sum);
       return 0;
}
int function(int val)
{
       int sum = 0;
       sum = ((0xFF000000&val)>>24)  +((val& 0x00FF0000)>>16)+
              ((val&0x0000FF00)>>8) +(val&0x000000FF);
       return sum;
}