#include<string.h>
/********************************************/
struct word_num
{
char ws[21]
int count
}
typedef struct word_num WRD
int find(WRD a[], char *t,int n)
/********************************************/
int main()
{
WRD s[MAX]//定义结构体数组,用来保存不重复的单词
char t[21]
int i=0,k,j//i:单词总数,初始值是0
while(scanf("%s",&t)!=EOF) //循环输入,"@@@"或者Ctrl+z结束循环
//可以改为while(1),只能用"@@@""结束循环
{
if(strcmp(t,"@@@")==0)//是否要结束循环
break
s[i].count=0//第i个单词计数器初始化:开始肯定是0
k=find(s,t,i) //确认输入单词t在数组s中的保存位置:
// 如果重复,得到重复单词在结构体数组的下标位置,
// 不重复,返回总单词数量i,即表明保存到s[i]
strcpy(s[k].ws,t)//保存进数组
s[k].count+=1//该单词计数器加1.
if(k==i)i++ //如果不重复,总单词计数器增加
}
for (j=0j!=ij++)//输出.i是总数
{
printf("%s,%d\n",s[j].ws,s[j].count )
}
return 0
}
/********************************************/
int find(WRD a[], char t[],int n)
{
int i
for(i=0i<ni++)
{
if(strcmp(a[i].ws,t)==0)//相等,说明已存在该词,返回该词在数组中的序号
{
// printf("%s\n", t)
break //退出循环,i的位置即单词位置下标值
}
}
return i
}
看我旁边做的注解
cnt(s,array)/*调用子函数cnt,并传给参数s, array。s是字符数组,相当于字符串指针;array是数组好理解*/
for(i=0i<26i++)
printf("%d",array[i]) /* for循环 依次输出26个字母出现的次数。这里%d后面加个空格或逗号分隔才好 */
printf("\n")
子函数
void cnt(char *p,int arr[]) /* 第一个参数是字符串指针,第二个参数是整型数组 */
{
int i
for(i=0i<26i++) /*数组初始化*/
arr[i]=0 /* 26个字母的个数全初始设置为0 */
while(*p) /* 循环,*p表示取指针p所指的字符,如果为0则表示字符串结束,退出循环 */
{
if(*p>='a'&&*p<='z') /*数组元素判断*/ /* 判断是否是a到z的字母,若是才统计*/
arr[*p-'a']++/*p与字母a的差值刚好就是数组arr下标*/ /* 字母a对应数组的下标是0, b是1,依次类推 */
p++ /* 指针加1, 指向后面一个字符 */
}
}
这样可以么?
#include<stdio.h>#define SIZE 26
main()
{
int c,i
int capital[SIZE]={0}//用来存放26个大写字母字母出现的频数
int lower[SIZE]={0}//用来存放26个小写字母字母出现的频数
while((c=getchar())!=EOF){ //遇到文件结束符输出结果
if (c>='A'&&c<='Z')
++capital[c-'A']
else if (c>='a'&&c<='z')
++lower[c-'a']
}
printf("Capital=\n")
for(i=0i<26i++)
printf("%d",capital[i])
printf("\n")
printf("Lower=\n")
for(i=0i<26i++)
printf("%d",lower[i])
printf("\n")
}