2014-12-04 2 views
0

"isZero"함수를 사용하여 단어가 아나그램인지 아닌지를 감지하는 데 문제가 있습니다. "isZero"가 main()에서 1과 같으면 "anagram"만 제공합니다. 그리고 0으로 설정하면 그것은 "anagram"이 아닐뿐입니다. 나에게 그것은 아무 것도 계산하지 않고, 지금은 진술이 사실이라면 그냥 인쇄하고있다. 이 문제를 해결하는 방법을 모르고 일부 지침을 사용할 수 있습니다.Anagram 프로젝트

#include <stdio.h> 
#include <ctype.h> 

#define MAX 26 

void intialize(char a[], char b[], int c[]); 
void setLetters(char newCount[], int newNumber[]); 
void checkLetters(char b[], int newNumber[]); 
int isZero(int c[]); 
void getstring(char a[]); 
void getString(char b[]); 

int main(void) 
{ 
    char a[MAX], b[MAX]; 
    int c[MAX]; 

    intialize(a, b, c); 
    getstring(a); 
    getString(b); 
    setLetters(a, c); 
    checkLetters(b, c); 

    if (isZero(c) == 1) { 
     printf("anagram"); 
    } else 
     printf("not anagram"); 
    return 0; 
} 

void intialize(char a[], char b[], int c[]) 
{ 
    int i; 
    for(i = 0; i < MAX; ++i) { 

     a[i] = '\0'; 
     b[i] = '\0'; 
     c[i] = 0; 
    } 
} 
void setLetters(char newCount[], int newNumber[]) 
{ 
    int i, index = 0; 
    for(i = 0; i < MAX; ++i) { 
     if(isalpha(newCount[i])) { 
      newCount[i] = tolower(newCount[i]); 
      index = (int)(newCount[i] - 'a'); 
      newNumber[index] +=1; 
     } 
    } 
} 
void checkLetters(char b[], int newNumber[]) 
{ 
    int i, index; 
    for(i = 0; i < MAX; ++i) { 
     if(isalpha(newNumber[i])) { 
      newNumber[i] = tolower(newNumber[i]); 
      index = (int)(newNumber[i] - 'a'); 
      newNumber[index] -= 1; 
     } 
    } 
} 
int isZero(int c[]) 
{ 
    int i, j = 0; 
    for(i = 0; i < MAX; ++i) { 
     if(c[i] == 0) 
      j = 1; 
     else 
      return 0; 
    } 
    return j; 
} 
void getstring(char a[]) 
{ 
    char line[MAX]; 

    printf("Enter a string: "); 
    gets(line); 
} 
void getString(char b[]) 
{ 
    char line[MAX]; 

    printf("Enter a string: "); 
    gets(line); 
} 
+0

'initialize', 당신은 당신이 단순히 [MAX] = {0} 숯불'선언 할 수 있습니다 알고 {='와'INT의 C [MAX]를 0};'('b'와 동일). 또한 ** 절대로 절대로 사용하지 마십시오. C 라이브러리의 일부 **는 불안정하기 때문에 더 이상 사용되지 않습니다. 'fgets','getline' 또는'scanf'를 사용하십시오. –

답변

0

C를 사용하면 각 줄의 각 부분에서 수행하는 작업을 느리게하고 이해하는 것이 필수적입니다. 이 충분히 근접한 인 부분은 입니다. 즉, 문제에 접근하는 방법에 대한 전반적인 아이디어를 얻었습니다. 그러나 C에서 시작한 것은 매우 분명합니다 (다른 답변과 의견이 있음).

함수 작성을 시작하기 전에 수행 할 함수가 무엇인지 결정하십시오. 그런 다음 해당 작업을 가장 잘 처리 할 수있는 방법을 결정하십시오. 문자열 입력을 얻기위한 함수가 필요하다면 그것을 작성하십시오. 각 문자열을 채우기 위해 하나의 함수를 작성해야한다면 입니다. 방금 함수의 목적을 상실한 것입니다. a[]과 동일한 기능을 수행하는 함수를 작성하고 동일한 함수b[]으로 사용하는 것은 의미가 없습니다. 새로 선언 된 배열을 zero/NULL으로 설정하는 모든 배열을 반복하는 함수가 필요하지 않습니다. 배열 초기화 구문이 사용됩니다.

함수가 작동하기를 기대하기 전에 값을 전달하는 방법 (그리고 반환이 필요한 경우 - 값을 얻는 방법)을 배우는 시간을 가지십시오. 함수에 배열을 전달하면 포인터 감쇠가 발생합니다. 즉, 배열 a[]은 함수에 전달 될 때 *a으로 붕괴합니다. 인자로 *a을 받아들이도록 함수를 선언함으로써 이것을 이용할 수 있습니다. 이것은 단순한 1-D 어레이의 경우 지구가 산산히 부서지지는 않지만, 붕괴는 2-D 배열 이상과 더 관련됩니다.

어떤 코드가 함수로 이해되는지 알아내는 것 외에도 구문에서와 마찬가지로 C에서 논리와 정확하게 일치해야합니다. 확실하지 않은 라인이 있다면, 사용하고있는 함수의 맨 페이지를 보거나 컴파일러 (Gnu/MS) 등의 언어 참조를 참조하여 알고 있는지 확인하십시오 정확히 코드가하는 일. 장기간에 걸쳐 시간을 절약 할 수 있습니다. 새로운 C 프로그래머를 끌어들이는 가장 큰 일은 또는 을 훑어보고을 훑어보고 코드 작성을 시작하는 것입니다. C를 배우는 열쇠는 으로 줄었습니다.

절대 사용 안 함, 사용하지 않음 gets()을 사용하지 마십시오. 수업을 듣고 선생님이 그것을 사용하는 과제를 건 경우, 행정부에 가서 환불을 요청하십시오.gets()은 더 이상 표준 C 라이브러리에 포함되지 않습니다. 이는 쉽게 손상되고 악용되기 때문입니다. fgets, getline 또는 scanf을 사용하십시오 (형식 문자열 사용을 선택한 경우 전체 섹션 참조). 그것은 훌륭한 기능이지만 부분적으로 사용법을 이해하는 사람을 기다리는 많은 함정이 있습니다.

즉, 당신은 anagrams에 대한 하나의 접근 방식에 대한 전반적인 논리를 가졌습니다. 아래에서 코드를 정렬하는 위의 예를 제공했습니다. 시간을내어 읽고 그것을 읽었으며 제가 왜 변경했는지 이해하십시오. 또한 단어 입력에 빠른 length 체크를 추가했습니다. 길이가 같지 않으면 더 이상 갈 필요가 없습니다. 질문이 있으면 알려주세요. 기꺼이 도와 주신 많은 분들이 여기 있습니다.

#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 

#define MAX 26 

void setLetters(char *newCount, int *newNumber); 
void checkLetters(char *newCount, int *newNumber); 
int isZero (int *c); 
void getstring (char *a); 

int main (void) 
{ 
    char a[MAX] = {0}; /* initialize all to zero/NULL */ 
    char b[MAX] = {0}; 
    int c[MAX] = {0}; 

    getstring(a); 
    getstring(b); 
    printf ("\n You entered:\n\n a: %s\n b: %s\n\n", a, b); 

    /* test lengths - if differ, not anagram */ 
    if (strlen(a) != strlen(b)) { 
     printf (" Lenghts differ, cannot be an anagram.\n\n"); 
     return 1; 
    } 

    setLetters (a, c);  /* set key array (c) */ 
    checkLetters (b, c); /* check key array (c) */ 

    if (isZero(c)) 
     printf(" The words form an anagram.\n\n"); 
    else 
     printf(" The words are not and anagram.\n\n"); 

    return 0; 
} 

void setLetters (char *newCount, int *newNumber) 
{ 
    int i = 0; 
    int index = 0; 

    for (i = 0; i < MAX; ++i) { 
     if (isalpha (newCount[i])) { 
      newCount[i] = tolower (newCount[i]); 
      index = (int)(newCount[i] - 'a'); 
      newNumber[index] +=1; 
     } 
    } 
} 

void checkLetters(char *newCount, int *newNumber) 
{ 
    int i = 0; 
    int index = 0; 

    for (i = 0; i < MAX; ++i) { 
     if (isalpha (newCount[i])) { 
      newCount[i] = tolower (newCount[i]); 
      index = (int)(newCount[i] - 'a'); 
      newNumber[index] -= 1; 
     } 
    } 
} 

int isZero (int *c) 
{ 
    int i = 0; 
    for (i = 0; i < MAX; ++i) 
     if (c[i] == 1) 
      return 0; 

    return 1; 
} 

void getstring (char *a) 
{ 
    printf ("\n Enter a string: "); 
    scanf ("%[^\n]%*c", a); 
} 

출력 : 대신

$ ./bin/anaproj 

Enter a string: yekcim 

Enter a string: mickey 

You entered: 

    a: yekcim 
    b: mickey 

The words form an anagram. 

$ ./bin/anaproj 

Enter a string: yekcim 

Enter a string: mickez 

You entered: 

    a: yekcim 
    b: mickez 

The words are not and anagram. 
+0

고맙습니다. 당신의 코드에 대해 물어보고 싶은 몇 가지 질문이 있습니다. 당신이 구현하거나 변경했거나 이해하지 못하는 것들이 있습니다. 현재로서는 매우 늦어서 잠을 자야합니다. 그러나 나는이 토론으로 돌아올 것이다. 다시 한번 감사드립니다. –

+0

물론입니다. 댓글을 남겨주세요. 내가 켜져 있으면 기꺼이 채팅 창을 열어 드리겠습니다. –

1
void getstring(char a[]); 

이 API는 당신이하고자하는 일을하지 않습니다. 로컬 변수 행에 문자열이 있고 문자 배열이 main() 인 경우 a에 아무 것도 채워지지 않습니다.

계속 발생하지 않는 getstring()을 호출하여 값이 채워져 있다고 생각하는 문자 배열 a을 계속 사용합니다. 먼저 anagram에 대한 알고리즘을 수정해야합니다. 도움이 될만한 참고 자료가 있습니다.