筆記試験の面接問題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関数に渡すと、何か面白いことが起こりますか?
#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;
}