找个大神帮我把这段C语言程序的各个部分逻辑作用详细讲解一下

2024-12-25 15:57:15
推荐回答(3个)
回答1:

以下是改写后的代码,原来的代码不能完成预定 任务。
#include
#include
#define MAX_size 2000
int flag = 1,degree = 0;
void change(char s[]) { /* 将大写字母转换为小写 */
int i;
for(i = 0;s[i];i++) { /* 循环条件有改动,也很重要 */
if(s[i] >= 'A' && s[i] <= 'Z') {
s[i] += 'a' - 'A';
}
}
}
int Index(char str[],char word[]) {
int i,j,k,sum = 0;
for(i = 0;str[i];i++) {
if(str[i] == word[0]) { /* 只要当前字符与word中的相同,则继续核对其他字符。 */
k = i;
j = 0;
while((str[k] == word[j]) && (str[k] && word[j])) { /* 核对整个单词 */
++k; ++j;
}
/* 比较到word末尾后,则该单词出现次数增1. */
if(word[j] == '\0' && (str[k] > 'z' || str[k] < 'a')) {
++sum;
i = k;
}
}
}
return sum;
}
int main() {
char str[MAX_size],word[20],ch;
int sum = 0,k = 0;
FILE *fp;
if((fp = fopen("F:\\VC\\example.txt","r")) == NULL) {
printf("打开文件出错!\n");
exit(1);
}
printf("请输入要检索的单词: ");
gets(word);
change(word);
while((ch = fgetc(fp)) != EOF) {
if(ch == '\n') {
str[k] = '\0';
change(str);
sum += Index(str,word);
k = 0;
}
else str[k++] = ch;
}
if(k) {
str[k] = '\0';
sum += Index(str,word);
}
if(sum == 0) printf("您输入的单词不在短文中。\n");
else printf("您输入的单词%s在短文中,它共出现 %-d 次\n",word,sum);
fclose(fp);
getchar();
return 0;
}

回答2:

#include
#include
#define MAX_size 1000
int flag=1,degree=0;
void change(char s[]) //大小写转换
{
int i;
for(i=0;i<=1000;i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
s[i]+=32;
}
}
}

void Index(char str[],char word[],int position[]) //查找单词的功能函数
{
int i,len_str,len_word,pos_str,pos_word,k=0,word_number=0;
//len_str是文章长度,len_word是要查找的单词的长度,pos_str是用来记录当前查找文章字符串的当前位置
len_word=strlen(word);
len_str=strlen(str);
for(i=0;i{
while(str[i]==' '||str[i]==','||str[i]=='.') //遇到空格和标点跳过
i++;
word_number++;
for(pos_str=i,pos_word=0;pos_str{ //这个循环是从第i个字符开始向后对比len_word个长度的字符,如果每个字符都与word一样,则pos_word=len_word,期间有一个字符不一样都会跳出这个循环
if(str[pos_str]!=word[pos_word])
break;
}
if(pos_word==len_word && (str[pos_str]=='\0'|| str[pos_str]==' '||str[pos_str]==','||str[pos_str]=='.')) //如果每个字符都与word一样,则pos_word=len_word,即出现一个匹配单词,增加记录数degree。
{
position[k++]=word_number;
degree++;
flag=0;
}
else
{
while(str[pos_str]!=' '&&str[pos_str]==','&&str[pos_str]=='.'&& pos_strpos_str++;
}
i=pos_str;
}
}
void main() //主函数
{
char str[MAX_size],word[20],ch;
int position[100],i;

int k=0; FILE *fp; //文件指针
if((fp=fopen("d:\\temp.txt","r"))!=NULL) //打开文件
{
while(1) //把文件中的字符串赋值给字符数组str[ ]
{
ch=fgetc(fp);
if(ch==EOF) break;
str[k]=ch;
k++;
}
}
change(str);
printf("请输入要检索的单词: \n");
gets(word);
change(word);
Index(str,word,position); //搜索你要查找的单词,如果有出现过则flag为0。
if(flag)
printf("您输入的单词不在短文中。\n");
else
{
printf("您输入的单词在短文中,它共出现 %-d 次\n",degree); //degree当然是次数啦
}
fclose(fp);
}

先写这些注释吧

回答3:

这个代码实现就不对,为什么把人家的任意输入转换为小写,我就要匹配‘aBcD’怎么办?
还有一个需求不明,查找的单词,这个单词怎么定义为匹配上?比如说输入‘word’,前后没有字母的才是匹配“this is a word?”,这样的“my words” 能不能匹配,“word---word”这样的呢。
你不弄清楚这些问题,先不要说实现,实现了也经不起别人的询问和推敲的。