筆記試験の面接問題3
4449 ワード
1、変数aで以下の定義を与える
a)1つの整数(An integer)
b)整数を指すポインタ(A pointer to an integer)
c)ポインタを指すポインタであり、そのポインタが整数数を指す(A pointer to a pointer to an integer)
d)10個の整数の配列(An array of 10 integers)
e)整数数を指す10個のポインタを持つ配列(An array of 10 pointers to integers)
f)10個の整数配列を指すポインタ(A pointer to an array of 10 integers)
g)整数パラメータを持ち整数数を返す関数を指すポインタ(A pointer to a function that takes an integer as an argument and returns an integer)
h)10個のポインタを有する配列であり、このポインタは1個の関数を指し、この関数は1個の整数パラメータを有し、1個の整数数を返す(An array of ten pointers to functions that take an integer argument and return an integer)
答えは次のとおりです.
a) int a;//An integer
b) int *a;//A pointer to an integer
c) int **a;//A pointer to a pointer to an integer
d) int a[10];//An array of 10 integers
e) int *a[10];//An array of 10 pointers to integers
f) int (*a)[10];//A pointer to an array of 10 integers
g) int (*a)(int);//A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int);//An array of 10 pointers to functions that take an integer argument and return an integer
2、ポインタを使う3つのメリット
メモリに直接アクセスし、複数の値を返します.ポインタのパラメータを渡すときに一時的なオブジェクトの作成を回避します.
3、0値をmalloc関数に渡すと、何か面白いことが起こりますか?
4、16ビットの整数があって、4ビットごとに1つの数で、関数を書いて彼らの和を求めます.説明:整数11010110110111と1101+0101+1011+0111
5、2つの文字列の中で最大共通のサブ文字列を探し出して、例えば“abccade”、“dgcadde”の最大のサブ列は“cad”です
6、int A[nSize]は、いくつかの0が隠されているが、残りは0以外の整数で、関数int Func(int*A,int nSize)を書き、Aが0を後ろに移動し、0以外の整数を配列の前に移動し、秩序を保ち、戻り値は元のデータの最初の要素が0の下付きである.
7、1つのプログラムを書いて、機能を要求します:1,2,5のこの3つの数で異なる個数の組み合わせの和は100の組み合わせの個数を求めます.
x+2 y+5 z=100なので
したがってx+2 y=100-5 zであり、z<=20 x<=100 y<=50
したがって(x+2 y)<=100であり、(x+5 z)は偶数である
zを循環して、xの可能な値を求めるのは以下の通りです.
z=0, x=100, 98, 96,... 0
z=1, x=95, 93, ...,1
z=2, x=90, 88, ...,0
z=3, x=85, 83, ...,1
z=4, x=80, 78, ...,0
......
z=19, x=5, 3, 1
z=20, x=0
a)1つの整数(An integer)
b)整数を指すポインタ(A pointer to an integer)
c)ポインタを指すポインタであり、そのポインタが整数数を指す(A pointer to a pointer to an integer)
d)10個の整数の配列(An array of 10 integers)
e)整数数を指す10個のポインタを持つ配列(An array of 10 pointers to integers)
f)10個の整数配列を指すポインタ(A pointer to an array of 10 integers)
g)整数パラメータを持ち整数数を返す関数を指すポインタ(A pointer to a function that takes an integer as an argument and returns an integer)
h)10個のポインタを有する配列であり、このポインタは1個の関数を指し、この関数は1個の整数パラメータを有し、1個の整数数を返す(An array of ten pointers to functions that take an integer argument and return an integer)
答えは次のとおりです.
a) int a;//An integer
b) int *a;//A pointer to an integer
c) int **a;//A pointer to a pointer to an integer
d) int a[10];//An array of 10 integers
e) int *a[10];//An array of 10 pointers to integers
f) int (*a)[10];//A pointer to an array of 10 integers
g) int (*a)(int);//A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int);//An array of 10 pointers to functions that take an integer argument and return an integer
2、ポインタを使う3つのメリット
メモリに直接アクセスし、複数の値を返します.ポインタのパラメータを渡すときに一時的なオブジェクトの作成を回避します.
3、0値をmalloc関数に渡すと、何か面白いことが起こりますか?
#include "stdafx.h"
#include "stdlib.h"
#include <string.h>
#include <iostream.h>
int main(int argc, char* argv[])
{
char *ptr=(char*)malloc(0);
int size=sizeof(ptr);
int len=strlen(ptr);
if(ptr==NULL)
cout<<"Got a null pointer"<<endl;
else
cout<<"Got a valid pointer"<<endl; //ptr NULL
if(size==4)
cout<<"Got a null pointer"<<endl; // 4
else
cout<<"Got a valid pointer"<<endl;
if(len==0)
cout<<"Got a null pointer"<<endl;
else
cout<<"Got a valid pointer"<<endl; //strlen(ptr) 24??, ptr
*ptr=6;
cout<<*ptr<<endl; //ok
cout<<strlen(ptr)<<endl; // 22??
return 0;
}
4、16ビットの整数があって、4ビットごとに1つの数で、関数を書いて彼らの和を求めます.説明:整数11010110110111と1101+0101+1011+0111
short SumOfQuaters(unsigned short n)
{
short c = 0;
int i = 4;
do
{
c += n & 15;
n = n >> 4;
} while (--i);
return c;
}
5、2つの文字列の中で最大共通のサブ文字列を探し出して、例えば“abccade”、“dgcadde”の最大のサブ列は“cad”です
#include <stdio.h>
#include <string.h>
#include <iostream.h>
void same_str( char *str1, char const *str2, char const *str3 )
{
int i,j,k,len,max=0,n=0;
const char *temp;
if (strlen(str2) < strlen(str3)) /* */
{
temp = str2;
str2 = str3;
str3 = temp;
}
for ( i=0; *(str2+i)!='\0'; i++ )
{
len = 0;
for ( j=0,k=i; *(str3+j)!='\0'&&*(str2+k)!='\0'; j++,k++ )
{
if ( *(str2+k) == *(str3+j) )
{
len++;
}
else /* , len */
{
if ( max < len )
{
max = len; //
n = k-len; //
}
len = 0;
}
}
if ( max < len ) /* */
{
max = len;
n = k-len;
len = 0;
}
}
for ( j=0; j<max; j++,n++ )
*str1++ = *(str2+n);
*str1 = '\0';
}
void main()
{
char str1[10];
char *str2="aaaaabcd";
char *str3="aaaaabcdefg";
same_str( str1, str2, str3 );
cout<<str1<<endl;
}
6、int A[nSize]は、いくつかの0が隠されているが、残りは0以外の整数で、関数int Func(int*A,int nSize)を書き、Aが0を後ろに移動し、0以外の整数を配列の前に移動し、秩序を保ち、戻り値は元のデータの最初の要素が0の下付きである.
int func(int *A,int Nsize)
{
int i,t=1;
for(i=0;i<Nsize-1;i++)
{
if(A[i]==0&&A[i+1]!=0) // 0
{
A[i+1-t]=A[i+1];
A[i+1]=0;
}
else if(A[i]==0&&A[i+1]==0) // 0
{
t++;
}
}
return t;
}
7、1つのプログラムを書いて、機能を要求します:1,2,5のこの3つの数で異なる個数の組み合わせの和は100の組み合わせの個数を求めます.
x+2 y+5 z=100なので
したがってx+2 y=100-5 zであり、z<=20 x<=100 y<=50
したがって(x+2 y)<=100であり、(x+5 z)は偶数である
zを循環して、xの可能な値を求めるのは以下の通りです.
z=0, x=100, 98, 96,... 0
z=1, x=95, 93, ...,1
z=2, x=90, 88, ...,0
z=3, x=85, 83, ...,1
z=4, x=80, 78, ...,0
......
z=19, x=5, 3, 1
z=20, x=0
int CombCount(int m)
{
int number=0;
for (int i=0;i<=m;i+=5)
{
number+=(i+2)/2;
}
return number;
}