C 中的 Anagram:如何知道 int 数组的每个元素是否都设置为零?
Anagram in C: How do I know if every element of the int array is set to zero?
此代码部分有效,它识别出一些变位词是变位词,而其他则不是。我认为错误发生在 isZero 中。非常感谢一些反馈。以下是每个功能的说明。
算法
读取第一个字符串,然后使用一个包含 26 个整数的数组来计算每个字母被看到的次数。
读取第二个字符串,这次减少 int 数组中每个字母的计数。当且仅当 int 数组中的每个元素都为 0 时,字符串才是变位词。
忽略任何不是字母的字符。将大写字母视为与其对应的小写字母相同。下面给出了这方面的帮助。
main()
声明两个char数组和int数组,然后调用下面描述的函数来解决问题。
初始化()
在读取第一个字符串之前清除所有 char 和 int 数组的内容。 (将 char 数组中的每个元素设置为空字符“\0”。)
getString()
提示并从输入中读取字符串。
执行此操作时调用标准库函数 gets()。
setLetters()
遍历第一个字符串中的每个字符,并更新 int 数组中该字母的计数。
执行此操作时从中调用以下标准库函数。 int isalpha & char tolower
在 setLetters() 中,您需要将“a”...“z”范围内的小写字符转换为 0..25 范围内的索引。使用这个想法:
整数索引;
index = (int) (ch – ‘a’);
checkLetters()
遍历第二个字符串中的每个字符,并从 int 数组中该字母的计数中减去 1。与 setLetters() 非常相似。
isZero()
遍历 int 数组。 Returns 当且仅当每个元素都为 0 时为 TRUE,否则为 FALSE。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 26
#define TRUE 1
#define FALSE 0
void initialize (char string1[], char string2[], int count[]);
void getString (char string1[], char string2[]);
void setLetters (char string1[], int count[]);
void checkLetters (char string2[], int count[]);
int isZero (int count[]);
void main (void)
{
char string1[MAX], string2[MAX];
int count[MAX];
while (TRUE)
{
initialize (string1, string2, count);
getString (string1, string2);
setLetters (string1, count);
checkLetters (string2, count);
//printf("\n");
if (isZero(count))
{
printf("Anagram ");
}
else
{
printf("Not anagram ");
}
printf("\n");
}
}
void initialize (char string1[], char string2[], int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
string1[i] = '[=11=]';
string2[i] = '[=11=]';
count[i] = 0;
}
}
void getString (char string1[], char string2[])
{
printf("\n");
printf("Enter string: ");
gets(string1);
printf("Enter string: ");
gets(string2);
}
void setLetters (char string1[], int count[])
{
int i,
index = 0;
for (i = 0; i < MAX; i++)
{
if (isalpha(string1[i]))
{
string1[i] = tolower(string1[i]);
index = (int) (string1[i] - 'a');
count[index] = (count[index] + 1);
}
}
}
void checkLetters (char string2[], count[])
{
int i,
index = 0;
for (i = 0; i < MAX; i++)
{
if (isalpha(string2[i]))
{
string2[i] = tolower(string2[i]);
index = (int) (string2[i] - 'a');
count[index] = (count[index] - 1);
}
}
}
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return TRUE;
}
else
{
return FALSE;
}
}
}
现在你的函数 isZero
将 return
True
一旦遇到 number > 0
。所以你可以像这样重写你的函数 -
int isZero (int count[])
{
int i;
for(i=0;i<MAX;i++){
if(count[i])
return 1 ; //as soon as number other than 0 is ecnountered function return 1
}
return 0; // return 0 if all elements are 0
}
注意- 1 - False
和 0-True
。
我查了你isZero,两个问题
1.你要return true 是全为零,不是false。
2. 你应该 return 检查所有元素后不在第一个元素。
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return FALSE;
}
}
return TRUE;
}
您的 isZero 应该如下所示。
如果数组具有非零值,您将返回 TRUE
。
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return FALSE;
}
}
return TRUE;
}
此代码部分有效,它识别出一些变位词是变位词,而其他则不是。我认为错误发生在 isZero 中。非常感谢一些反馈。以下是每个功能的说明。
算法 读取第一个字符串,然后使用一个包含 26 个整数的数组来计算每个字母被看到的次数。 读取第二个字符串,这次减少 int 数组中每个字母的计数。当且仅当 int 数组中的每个元素都为 0 时,字符串才是变位词。 忽略任何不是字母的字符。将大写字母视为与其对应的小写字母相同。下面给出了这方面的帮助。
main() 声明两个char数组和int数组,然后调用下面描述的函数来解决问题。
初始化() 在读取第一个字符串之前清除所有 char 和 int 数组的内容。 (将 char 数组中的每个元素设置为空字符“\0”。)
getString() 提示并从输入中读取字符串。 执行此操作时调用标准库函数 gets()。
setLetters() 遍历第一个字符串中的每个字符,并更新 int 数组中该字母的计数。 执行此操作时从中调用以下标准库函数。 int isalpha & char tolower 在 setLetters() 中,您需要将“a”...“z”范围内的小写字符转换为 0..25 范围内的索引。使用这个想法: 整数索引;
index = (int) (ch – ‘a’);
checkLetters() 遍历第二个字符串中的每个字符,并从 int 数组中该字母的计数中减去 1。与 setLetters() 非常相似。
isZero() 遍历 int 数组。 Returns 当且仅当每个元素都为 0 时为 TRUE,否则为 FALSE。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 26
#define TRUE 1
#define FALSE 0
void initialize (char string1[], char string2[], int count[]);
void getString (char string1[], char string2[]);
void setLetters (char string1[], int count[]);
void checkLetters (char string2[], int count[]);
int isZero (int count[]);
void main (void)
{
char string1[MAX], string2[MAX];
int count[MAX];
while (TRUE)
{
initialize (string1, string2, count);
getString (string1, string2);
setLetters (string1, count);
checkLetters (string2, count);
//printf("\n");
if (isZero(count))
{
printf("Anagram ");
}
else
{
printf("Not anagram ");
}
printf("\n");
}
}
void initialize (char string1[], char string2[], int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
string1[i] = '[=11=]';
string2[i] = '[=11=]';
count[i] = 0;
}
}
void getString (char string1[], char string2[])
{
printf("\n");
printf("Enter string: ");
gets(string1);
printf("Enter string: ");
gets(string2);
}
void setLetters (char string1[], int count[])
{
int i,
index = 0;
for (i = 0; i < MAX; i++)
{
if (isalpha(string1[i]))
{
string1[i] = tolower(string1[i]);
index = (int) (string1[i] - 'a');
count[index] = (count[index] + 1);
}
}
}
void checkLetters (char string2[], count[])
{
int i,
index = 0;
for (i = 0; i < MAX; i++)
{
if (isalpha(string2[i]))
{
string2[i] = tolower(string2[i]);
index = (int) (string2[i] - 'a');
count[index] = (count[index] - 1);
}
}
}
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return TRUE;
}
else
{
return FALSE;
}
}
}
现在你的函数 isZero
将 return
True
一旦遇到 number > 0
。所以你可以像这样重写你的函数 -
int isZero (int count[])
{
int i;
for(i=0;i<MAX;i++){
if(count[i])
return 1 ; //as soon as number other than 0 is ecnountered function return 1
}
return 0; // return 0 if all elements are 0
}
注意- 1 - False
和 0-True
。
我查了你isZero,两个问题 1.你要return true 是全为零,不是false。 2. 你应该 return 检查所有元素后不在第一个元素。
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return FALSE;
}
}
return TRUE;
}
您的 isZero 应该如下所示。
如果数组具有非零值,您将返回 TRUE
。
int isZero (int count[])
{
int i;
for (i = 0; i < MAX; i++)
{
if (count[i])
{
return FALSE;
}
}
return TRUE;
}