C語言常見面試題(經典中的經典)
阿新 • • 發佈:2019-01-02
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 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;
}
#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;
}