센트리 레이트 2013C++펜 시험지 B

4735 단어 StringC 언어
기초 지식 문제
1. 다음 프로그램의 출력 결과:
char *p1= “123”, *p2 = “ABC”, str[50]= "xyz";
strcpy(str+2,strcat(p1,p2));
cout << str;
  • xyz123ABC
  • z123ABC
  • xy123ABC
  • 오류
  • 해석: 이 코드의 실행은 버그가 발생합니다.strcat(p1,p2)에서 오류가 발생합니다. p1은 4바이트의 주소 공간만 분배되어 있기 때문에 p2를 p1 뒤에 연결하면 메모리가 넘쳐납니다.문자열의 글자 상수 주의하기;마지막 항목 선택하기;
    2. 부동점수와 비트 연산:
    모든 비트 연산은 부동점수를 직접 조작할 수 없지만 우리는 간접적으로 부동점수에 대해 비트 연산을 할 수 있다. 예를 들어float 데이터를 취하여 주소(&)를 정형(int 등) 바늘로 강제로 전환한 후 값(*)을 추출한 후 정형변수(int 등)에 값을 부여하면 이 변수에 대해 비트 연산을 할 수 있다.[주] 부동점수에 대해 비트 연산을 하는 것은 일반적으로 의미가 없다. 부동점수의 저장 구조는 세 부분으로 나뉘기 때문에 비트 연산을 한 후에 얻은 결과는 원시 부동점수와 그다지 큰 관계가 없다.
    3. 내연 함수: 클래스에서 내연 함수를 사용하는 곳은 컴파일 단계에서 내연 함수체로 대체됩니다.
    프로그래밍 문제
    1. n 개의 파일 길이가 부호가 없는 64비트 정수 그룹에 unsignedint64 file_length[n], 이 n개의 파일을 논리적으로 순서대로 처음부터 끝까지 연결하여 논리적인 큰 파일을 만들고 각 블록의 길이를 unsigned blocklength는 이 논리적인 큰 파일을 크기가 같은 데이터 블록으로 구분합니다. (물론 마지막 블록은 Block length보다 작을 수 있습니다.) 함수를 정의하고 실현하십시오. 경계 블록의 번호 집합을 함수의 호출자에게 되돌려 주십시오. (첫 번째 데이터 블록의 번호는 0)주: 경계 블록은 여러 파일에 걸쳐 있는 데이터 블록을 가리킨다.
    2. 하나의 함수를 실현하여 두 개의 큰 것부터 작은 것까지의 질서 체인 테이블을 하나의 체인 테이블로 합치십시오. 새로운 체인 테이블은 작은 것부터 큰 것까지의 질서 체인 테이블입니다.
    /*
        
           ,                   ,                。
    */
    
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    struct list
    {
    	int value;
    	list* next;
    };
    
    list * merge(list *list1_head, list*list2_head)
    {
    	if (!list1_head && !list2_head)
    		return NULL;
    	else if (!list1_head)
    		return list2_head;
    	else if (!list2_head)
    		return list1_head;
    	else{
    		list *p = list1_head, *q = list2_head, *r = NULL;
    		list *rHead = NULL, *rEnd = rHead;
    		while (p && q)
    		{
    			if (p->value <= q->value)
    			{
    				r = p->next;
    				if (rHead == NULL)
    				{
    					rHead = p;
    					rEnd = rHead;
    					rEnd->next = NULL;
    				}//if
    				else{
    					rEnd->next = p;
    					p->next = NULL;
    					rEnd = p;
    				}//else
    				p = r;
    			}//if
    			else{
    				r = q->next;
    				if (rHead == NULL)
    				{
    					rHead = q;
    					rEnd = rHead;
    					rEnd->next = NULL;
    				}//if
    				else{
    					rEnd->next = q;
    					q->next = NULL;
    					rEnd = q;
    				}//else
    				q = q->next;
    			}//else
    		}//while
    
    		while (p)
    		{
    			r = p->next;
    			rEnd = p;
    			p->next = NULL;
    			rEnd = p;
    
    			p = r;
    		}//while
    
    		while (q)
    		{
    			r = q->next;
    			rEnd = q;
    			q->next = NULL;
    			rEnd = q;
    
    			q = r;
    		}//while
    
    		return rHead;
    	}//else
    }
    
    
    
    3. 만약 두 개의 영문 단어가 그것들을 구성하는 문자 집합이 같고 같은 문자가 나타나는 횟수도 같다면 이 두 단어가 일치한다고 한다. 예를 들어'abbc'와 단어'babc'가 일치한다고 한다.문자열 그룹 const char* dictionary[n]에 저장된 사전이 있습니다. 그룹의 모든 요소는 하나의 단어입니다.임의로 주어진 문장에 대해.문장의 단어는 공백으로 분할한다.다음 함수를 실현하여 문장에 있는 단어와 사전의 단어가 일치하는지 판단하십시오.
    bool is_matching( const char* dictionary[],int n, const char* sentence);
    /*
        
            ,           ,              ,        :
       : ”abbc”   ”babc”    。     ,        const char* dictionary[n] ,
                。         。            。
    
           ,                 。
    bool is_matching( const char* dictionary[],int n, const char* sentence);
    */
    
    #include <iostream>
    #include <cstdlib>
    #include <vector>
    
    using namespace std;
    
    bool isMatch(const char*str1, const char *str2)
    {
    	int len1 = 0, len2 = 0;
    	const char *p = str1, *q = str2;
    	/*        */
    	while (*p++ != '\0')
    		++len1;
    	while (*q++ != '\0')
    		++len2;
    
    	if (len1 != len2)
    		return false;
    
    	vector<char> vMap(256, 0);
    	p = str1;
    	while (*p != '\0')
    	{
    		++vMap[*p];
    		++p;
    	}//while
    
    	/*     */
    	q = str2;
    	while (*q != '\0')
    	{
    		if (--vMap[*q] < 0)
    			return false;
    		++q;
    	}//while
    	return true;
    }
    
    bool is_matching(const char* dictionary[], int n, const char* sentence)
    {
    	if (!sentence)
    		return false;
    
    	int len = 0;
    	const char *p = sentence;
    	while (*p++ != '\0')
    		++len;
    
    	char *word = new char[len + 1];
    	word[0] = '\0';
    
    	/*      sz*/
    	int sz = 0;
    	p = sentence;
    	while (*p != '\0')
    	{
    		if (*p == ' ')
    		{
    			word[sz] = '\0';
    			for (int i = 0; i < n; ++i)
    			{
    				if (isMatch(word,dictionary[i]))
    					return true;
    			}//for
    			sz = 0;
    			word[sz] = '\0';
    		}
    		else{
    			word[sz++] = *p;
    		}//else
    
    		++p;
    	}//while
    	/*              */
    	word[sz] = '\0';
    	for (int i = 0; i < n; ++i)
    	{
    		if (isMatch(word, dictionary[i]))
    			return true;
    	}//for
    
    	return false;
    }
    
    int main()
    {
    	const char *dictionary[] = { "I", "am", "a", "good", "student." };
    
    	const char *s = "very good ";
    
    	cout << is_matching(dictionary, 5, s) << endl;
    
    	system("pause");
    	return 0;
    
    
    }

    뉴커넷

    좋은 웹페이지 즐겨찾기