复试编程训练真题——C语言,统计各单词(字符)出现的次数,并将各单词(字符)和其出现的次数输出到屏幕和文件中

119.已有文本文件test.txt,其中的内容为hello,how are you.Welcome you to China!编写一个程序,读取test.txt,统计各单词出现的次数,并将各单词和其出现的次数输出到屏幕和文件中。

仅限一行句子,两行需要稍加修改。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Word      //定义单词链表
{
    char w[20];  //单词
    int count;   //该单词出现的次数
    struct Word *next;
};

void getData(char str[])    //从文件中逐个读入字符,保存到str字符数组中
{
    FILE *fp;
    char ch;
    int i;

    if((fp=fopen("test.txt","r"))==NULL)
    {
        printf("can't open file!\n");
        exit(0);
    }
    i=0;
    while((ch=fgetc(fp))!=EOF)
        str[i++]=ch;
    str[i]='\0';
    fclose(fp);
}

struct Word *Caculate(char str[])   //统计单词及出现的频数
{
    int i=0,j=0;
    char word1[20];     //找字符串中的每一个单词
    struct Word *head=(struct Word *)malloc(sizeof(struct Word));   //建立单词空链表
    head->next=NULL;
    for(; str[i]!='\0'; i++)
    {
        if(!((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z')))  //找到了一个单词使j=0
        {
            word1[j]='\0';    //此时word1中已存放一个单词

            /*构造一个单词结构体*/
            struct Word *q;
            q=(struct Word *)malloc(sizeof(struct Word));
            strcpy(q->w,word1);
            q->next=NULL;

            /*每找到一个单词从表头开始查找,若有此单词,则个数增1;否则将此单词添加进链表*/
            struct Word *p=head;

            while(p->next!=NULL)   //查找
            {
                if(strcmp(p->next->w,word1)==0)
                {
                    p->next->count++;
                    break;
                }
                p=p->next;
            }
            if(p->next==NULL) //链表中无此单词,则插入链表尾
            {
                p->next=q;
                q->count=1;
            }

            j=0;   //为找下一个单词做好准备
        }
        else
            word1[j++]=str[i];
    }
    return head;
}

void print(struct Word *head)
{
    struct Word *p=head;
    while(p->next!=NULL)
    {
        printf("%s:%d\n",p->next->w,p->next->count);
        p=p->next;
    }
}
int main()
{
    char str[1000];
    getData(str);
    printf("test.txt数据:%s\n",str);
    struct Word *head;
    head=Caculate(str);
    printf("统计单词及出现的个数:\n");
    print(head);

    return 0;
}


运行结果:

120.已有文本文件test.txt,其中的内容为Hello,welcome you to Nanjing Normal University!Luck to you! 编写一个程序,读取test.txt,统计各字符出现的次数,并将各字符和其出现的次数输出到屏幕和文件中。

同上题大同小异

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Ch      //定义字符链表
{
    char ch;  //字符
    int count;   //该字符出现的次数
    struct Ch *next;
};

void getData(char str[])    //从文件中逐个读入字符,保存到str字符数组中
{
    FILE *fp;
    char ch;
    int i;

    if((fp=fopen("test.txt","r"))==NULL)
    {
        printf("can't open file!\n");
        exit(0);
    }
    i=0;
    while((ch=fgetc(fp))!=EOF)
        str[i++]=ch;
    str[i]='\0';
    fclose(fp);
}

struct Ch *Caculate(char str[])   //统计字符及出现的频数
{
    int i;
    struct Ch *head=(struct Ch *)malloc(sizeof(struct Ch));   //建立字符空链表
    head->next=NULL;
    for(i=0; str[i]!='\0'; i++)
    {
        if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z'))  //找到了一个字符
        {
            /*构造一个字符结构体*/
            struct Ch *q;
            q=(struct Ch *)malloc(sizeof(struct Ch));
            q->ch=str[i];
            q->next=NULL;

            /*每找到一个字符从表头开始查找,若有此字符,则个数增1;否则将此字符添加进链表*/
            struct Ch *p=head;

            while(p->next!=NULL)   //查找
            {
                if(p->next->ch==str[i])
                {
                    p->next->count++;
                    break;
                }
                p=p->next;
            }
            if(p->next==NULL) //链表中无此字符,则插入链表尾
            {
                p->next=q;
                q->count=1;
            }
        }
    }
    return head;
}

void print(struct Ch *head)
{
    struct Ch *p=head;
    while(p->next!=NULL)
    {
        printf("%c:%d\n",p->next->ch,p->next->count);
        p=p->next;
    }
}
int main()
{
    char str[1000];
    getData(str);
    printf("test.txt数据:%s\n",str);
    struct Ch *head;
    head=Caculate(str);
    printf("统计字符及出现的个数:\n");
    print(head);

    return 0;
}

运行结果:

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
#include<stdio.h> #include<stdlib.h> struct four { double a; struct four *next; //定义结构体,作为链表的节点. }; void main() { double sum(void); //函数声明. 该函数返回等式的计算结果. 有优先级的运算符号在函数内部先进行计算。 double sum1; printf("请输入等式,以 '=' 结束, 例如“ 2*2*3-2/2= ” 结果将自动保留六位有效数字\n"); sum1=sum(); printf("该等式的结果为:\t%f\n\n",sum1); } double sum(void) { struct four *head,*pnew,*ptail,*p,*q; //结构体成员. char ah; double s=0,last; //last作为 pnew->a 的前一个数值. int j=1; q=(struct four *)malloc(sizeof(struct four)); scanf("%lf%c",&q->a,&ah); last=q->a; while(j==1 && ah!='=') //头节点的建立. { switch(ah) //对运算符号的优先级进行选择,优先级高的先进行计算. { case '+': j=0; continue; break; case '-': j=0; continue; break; case '*': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last*q->a; break; case '/': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last/q->a; break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } last=q->a; scanf("%c",&ah); } pnew=(struct four *)malloc(sizeof(struct four)); pnew->a=q->a; //将头节点的信息传递给 head 和 ptail. head=ptail=pnew; while(ah!='=') //接下来节点的建立. { pnew=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&pnew->a); switch(ah) { case '*': pnew->a=last*pnew->a; break; case '/': pnew->a=last/pnew->a; break; case '+': break; case '-': pnew->a=-pnew->a;break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } scanf("%c",&ah); if(ah=='-' || ah=='+'|| ah=='=') //将值进行传递 ptail->next=pnew. { ptail->next=pnew; ptail=pnew; } last=pnew->a; } ptail->next=NULL; p=head; while(p!=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值