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;
}
       


 




 




 




 




 




 
  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值