| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1548 人关注过本帖
标题:求大佬帮忙看看我的程序算法出了什么问题
取消只看楼主 加入收藏
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
结帖率:83.33%
收藏
 问题点数:0 回复次数:6 
求大佬帮忙看看我的程序算法出了什么问题
题目是编写一个打开两个文件的程序,让程序打印第一个文件的第一行、第二个文件的第一行、第一个文件的第二行、第二个文件的第二行,依此类推,直到打印完行数较多的文件的最后一行。
这是我编写的程序:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define LEN 256

int main(void)
{
    FILE *fp1, *fp2;
    char name1[LEN], name2[LEN];
    char ch1, ch2;
    int i = 1;

   

    puts("请输入第一个文件名:");
    gets(name1);
    if((fp1 = fopen(name1, "r")) == NULL)
    {
        fprintf(stderr, "不能打开文件%s\n", name1);
        exit(EXIT_FAILURE);
    }
    puts("请输入第二个文件名:");
    gets(name2);
    if((fp2 = fopen(name2, "r")) == NULL)
    {
        fprintf(stderr, "不能打开文件%s\n", name2);
        exit(EXIT_FAILURE);
    }
    while((ch1 = getc(fp1)) != EOF || (ch2 = getc(fp2)) != EOF)
    {
        printf("第%d行\n", i++);
        while(ch1 != EOF && ch1 != '\n')
        {
            putchar(ch1);
            ch1 = getc(fp1);
        }
        if(ch1 != EOF)
        {
            putchar('\n');
        }
        while(ch2 != EOF && ch2 != '\n')
        {
            putchar(ch2);
            ch2 = getc(fp2);
        }
        if(ch2 != EOF)
        {
            putchar('\n');
        }       

    }
    if(fclose(fp1) != 0)
        printf("不能关闭文件%s", name1);
    if(fclose(fp2) != 0)
        printf("不能关闭文件%s", name2);   

   

    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

程序运行是这样的:

我把ch1=getc(fp1) 放到最外层的while循环里,但是程序输出却是打印第二个文件的第一行,然后全部打印了第一个文件的每一行和一个空行,再全部打印第二个文件。
这是照答案修改的代码
搜索更多相关主题的帖子: 文件 打印 一行 while EOF 
2018-09-07 16:34
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define LEN 256

int main(void)
{
    FILE *fp1, *fp2;
    char name1[LEN], name2[LEN];
    char ch1, ch2;
    int i = 1;

   

    puts("请输入第一个文件名:");
    gets(name1);
    if((fp1 = fopen(name1, "r")) == NULL)
    {
        fprintf(stderr, "不能打开文件%s\n", name1);
        exit(EXIT_FAILURE);
    }
    puts("请输入第二个文件名:");
    gets(name2);
    if((fp2 = fopen(name2, "r")) == NULL)
    {
        fprintf(stderr, "不能打开文件%s\n", name2);
        exit(EXIT_FAILURE);
    }
    ch1 = getc(fp1);
    ch2 = getc(fp2);
    while(ch1 != EOF || ch2 != EOF)
    {
        printf("第%d行\n", i++);
        while(ch1 != EOF && ch1 != '\n')
        {
            putchar(ch1);
            ch1 = getc(fp1);
        }
        if(ch1 != EOF)
        {
            putchar('\n');
            ch1 = getc(fp1);
        }
        while(ch2 != EOF && ch2 != '\n')
        {
            putchar(ch2);
            ch2 = getc(fp2);
        }
        if(ch2 != EOF)
        {
            putchar('\n');
            ch2 = getc(fp2);
        }       

    }
    if(fclose(fp1) != 0)
        printf("不能关闭文件%s", name1);
    if(fclose(fp2) != 0)
        printf("不能关闭文件%s", name2);   

   

    return 0;
}
2018-09-07 16:36
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
这是正确的输出
图片附件: 游客没有浏览图片的权限,请 登录注册


我的疑问是,为什么不能省去if循环里的ch1=getc(fp1),而把ch1=getc(fp1)放在while循环的括号里?这样做有什么算法错误?
2018-09-07 16:37
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
我的程序错误的输出
图片附件: 游客没有浏览图片的权限,请 登录注册

2018-09-07 16:39
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
回复 4楼 心空之上
你说的这段语句是答案的正确语句,这段语句先执行while循环,遇到'\n'和EOF退出while循环。再进入if循环,因为上个循环的结束可能是遇到'\n'或者EOF,if循环是解决了遇到'\n'的情况,如果遇到'\n',就给ch1重新赋值,再回到外层的while循环,然后打印下一行语句。
我的错误的地方是最外层的while循环那里while((ch1 = getc(fp1)) != EOF && (ch2 = getc(fp2))!=EOF),在while循环中给ch1赋值,程序就出错了
2018-09-10 19:44
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
回复 5楼 Mr_doge
你说的这段语句是答案的正确语句,这段语句先执行while循环,遇到'\n'和EOF退出while循环。再进入if循环,因为上个循环的结束可能是遇到'\n'或者EOF,if循环是解决了遇到'\n'的情况,如果遇到'\n',就给ch1重新赋值,再回到外层的while循环,然后打印下一行语句。
我的错误的地方是最外层的while循环那里while((ch1 = getc(fp1)) != EOF && (ch2 = getc(fp2))!=EOF),在while循环中给ch1赋值,程序就出错了
2018-09-10 20:58
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
收藏
得分:0 
回复 8楼 Mr_doge
非常感谢啊,已经明白自己问题所在了。本人还是新手一枚,因为书上打印字符都是把ch在while循环的括号里进行的,这次按照书上这样做了,没有考虑到||的逻辑判断,以后会改正的。
2018-09-11 22:23
快速回复:求大佬帮忙看看我的程序算法出了什么问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024882 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved