C程式設計(譚浩強)第五版課後題答案 第十章

来源:https://www.cnblogs.com/lazyheartkx/archive/2022/05/18/16285479.html
-Advertisement-
Play Games

大家好,這篇文章分享了C程式設計(譚浩強)第五版第十章課後題答案,所有程式已經測試能夠正常運行,如果小伙伴發現有錯誤的的地方,歡迎留言告訴我,我會及時改正!感謝大家的觀看!!! ...


1.什麼是文件型指針?通過文件指針訪問文件有什麼好處?

答:緩衝文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”。每個被使用的文件都在記憶體中開闢一個相應的文件信息區,用來存放文件的有關信息(如文件的名字、文件狀態及文件當前位置等)。這些信息是保存在一個結構體變數中的。該結構體類型是由系統聲明的,取名為FILE。

通過文件指針訪問文件的好處是:可以隨機訪問文件,有效表示數據結構,動態分配記憶體,方便使用字元串,有效使用數組。

 

2.對文件的打開與關閉的含義是什麼?為什麼要打開和關閉文件?

答:”打開“是指為文件建立相應的信息區(用來存放有關文件的信息)和文件緩衝區(用來暫時存放輸入輸出的數據)。

”關閉“是指撤銷文件信息區和文件緩衝區,使文件指針變數不再指向該文件,顯然就無法進行對文件的讀寫了。

 

3.從鍵盤輸入一個字元串,將其中的小寫字母全部轉換成大寫字母,然後輸出到一個磁碟文件test中保存,輸入的字元串以“!”結束。

 

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
    FILE *fp;
    char str[100];
    int i=0;
    if((fp=fopen("text","w"))==NULL)
    {
        printf("open file text error!\n");
        exit(0);
    }
    printf("請輸入字元串:\n");
    gets(str);
    while(str[i]!='!')
    {
        if(str[i]>='a' && str[i]<='z')
            str[i]=str[i]-'a' + 'A';
        fputc(str[i],fp);
        i++;
    }
    fclose(fp);
    fp=fopen("text","r");
    fgets(str,strlen(str)+1,fp);
    printf("%s\n",str);
    fclose(fp);
    return 0;
}

 

4.有兩個磁碟文件A和B,各存放一行字母,今要求把這兩個文件中的信息合併(按字母順序排列),輸出到一個新文件C中去。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
    FILE *fa,*fb,*fc;
    char a[1024]={0};
    int len=strlen(a);
    void select_sort(char *);

    fa=fopen("A","r");
    fb=fopen("B","r");
    fc=fopen("C","w");

    fgets(a,1024,fa);            //從指定的流 fa 讀取一行,並把它存儲在 a 所指向的字元串內。
    fgets(a+len,1024-len,fb);    //當讀取 (1024-1) 個字元時,或者讀取到換行符時,或者到達文件末尾時,它會停止,
    select_sort(a);
    fputs(a,fc);

    fclose(fa);
    fclose(fb);
    fclose(fc);
}
void select_sort(char *str)
{
    int i,j,min;
    int len=strlen(str);
    void swap(char *,int,int);
    for(i=0;i<len;i++)
    {
        min=i;
        for(j=i+1;j<len;j++)
        {
            if(str[j]<str[min])
                min=j;
        }
        swap(str,min,j);
    }
}
void swap(char *str,int i,int j)
{
    char t=str[i];
    str[i]=str[j];
    str[j]=t;
}

 

5.有5個學生,每個學生有3門課程的成績,從鍵盤輸入學生數據(包括學號,姓名,3門課程成績),計算出平均成績,將原有數據和計算出的平均分數存放在磁碟文件stud中。

#include <stdio.h>
#include<stdlib.h>

struct student {
    int num;
    char name[40];
    int score[3];
    float avg;
};

int main(void)
{
    int i;
    struct student stu[5];
    FILE *fp=NULL;
    printf("按以下格式輸入各名同學的成績\n");
    printf("num name score1 score2 score3\n");
    for(i=0;i<5;i++)
    {
        scanf("%d%s%d%f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
        stu[i].avg=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
    }

    if((fp=fopen("stud","wb"))==NULL)
    {
        printf("open file stu for write error\n");
        exit(0);
    }

    if(fwrite(stu,sizeof(stu),1,fp)!=1)            //將緩衝區stu中的內容寫到流fp中,每塊的大小為sizeof(stu),塊數為1,返回值為實際寫出塊數
    {
        printf("write error!\n");
        return 1;
    }
    fclose(fp);
}

 

6.將第5題stud文件中的學生數據,按平均分進行排序處理,將已排序的學生數據存入一個新文件stu_ sort 中。

#include <stdio.h>
#include<stdlib.h>

struct student {
    int num;
    char name[40];
    int score[3];
    float avg;
};

int main(void)
{
    struct student stu[5];
    void sort(struct student[],int);
    FILE *fp,*fw;
    fp=NULL;

    if((fp=fopen("stud","rb"))==NULL)
    {
        printf("open file stu for write error\n");
        exit(0);
    }

    if(fread(stu,sizeof(stu),1,fp)!=1)        //從流fp中讀取內容寫到緩衝區stu中,每塊的大小為sizeof(stu),塊數為1,返回值為實際寫出塊數
    {
        printf("write error!\n");
        return 1;
    }
    fclose(fp);

    sort(stu,5);

    fw=fopen("stu_sort","wb");
    fwrite(stu,sizeof(stu),1,fw);
    fclose(fw);
    return 0;
}

void sort(struct student stu[],int len)
{
    int i,j,min;
    struct student temp;
    for(i=0;i<len;i++)
    {
        min=i;
        for(j=i+1;j<len;j++)
        {
            if(stu[j].avg<stu[min].avg)
                min=j;
        }
        temp=stu[min];
        stu[min]=stu[i];
        stu[i]=temp;
    }
}

 

7.將第6題已排序的學生成績文件進行插入處理。插入一個學生的3門課程成績,程式先計算新插入學生的平均成績,然後將它按成績高低順序插入,插入後建立一個新文件。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct student {
    int num;
    char name[40];
    int score[3];
    float avg;
};

int main(void)
{
    struct student stu[5];
    struct student new_stu[6];
    
    void sort(struct student[],int);
    FILE *fp,*fw;
    fp=NULL;

    if((fp=fopen("stud","rb"))==NULL)
    {
        printf("open file stu for write error\n");
        exit(0);
    }

    if(fread(stu,sizeof(stu),1,fp)!=1)
    {
        printf("read error!\n");
        return 1;
    }
    fclose(fp);

    memcpy(new_stu,stu,sizeof(stu));
    printf("請按以下格式輸入第6名同學的信息\n");
    printf("num name score1 score2 score3\n");
    scanf("%d %s %d %d %d",&new_stu[5].num,&new_stu[5].name,&new_stu[5].score[0],&new_stu[5].score[1],&new_stu[5].score[2]);
    new_stu[5].avg=(new_stu[5].score[0]+new_stu[5].score[1]+new_stu[5].score[2])/3.0;

    sort(new_stu,6);

    fw=fopen("tmp_sort","wb");
    fwrite(new_stu,sizeof(new_stu),1,fw);
    fclose(fw);
    return 0;
}

void sort(struct student stu[],int len)
{
    int i,j,min;
    struct student temp;
    for(i=0;i<len;i++)
    {
        min=i;
        for(j=i+1;j<len;j++)
        {
            if(stu[j].avg<stu[min].avg)
                min=j;
        }
        temp=stu[min];
        stu[min]=stu[i];
        stu[i]=temp;
    }
}

 

8.將第7題結果仍存入原有的stu_sort 文件而不另建立新文件。

 

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct student {
    int num;
    char name[40];
    int score[3];
    float avg;
};

int main(void)
{
    struct student stu[6];
    FILE *fp,*fw;
    fp=NULL;

    if((fp=fopen("stud","rb"))==NULL)
    {
        printf("open file stu for write error\n");
        exit(0);
    }

    if(fread(stu,sizeof(stu),1,fp)!=1)
    {
        printf("read error!\n");
        return 1;
    }
    fclose(fp);


    fw=fopen("stu_sort","wb");
    fwrite(stu,sizeof(stu),1,fw);
    fclose(fw);
    return 0;
}

 

9.有一磁碟文件employee,記憶體放職工的數據。每個職工的數據包括職工姓名、職工號、性別、年齡、住址、工資、健康狀況、文化程度。今要求將職工名、工資的信息單獨抽出來另建一個簡明的職工工資文件。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>

struct employee {
    int num;
    char name[40];
    char sex[4];
    int age;
    char addr[80];
    int salary;
    char health[10];
    char clas[10];
};
struct nasa{
    char name[40];
    int salary;
};

int main(void)
{
    int i;
    FILE *fp1,*fp2;
    struct employee employee_n1[5];
    struct nasa nasa_n2[5];
    
    fp1=open("employee","rb");
    fread(employee_n1,sizeof(employee_n1),1,fp1);
    fclose(fp1);

    for(i=0;i<5;i++)
    {
        strcpy(nasa_n2[i].name,employee_n1[i].name);
        nasa_n2[i].salary=employee_n1[i].salary;
    }

    fp2=open("nasa","rb");
    fwrite(nasa_n2,sizeof(nasa_n2),1,fp2);
    fclose(fp2);
    return 0;
}

 

10.從第9題的“職工工資文件”中刪去一個職工的數據,再存回原文件。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>

struct nasa{
    char name[40];
    int salary;
};

int main(void)
{
    int i;
    FILE *fp;
    struct nasa nasa_n[5];
    char name[40];
    
    fp=open("nasa","rb");
    fwrite(nasa_n,sizeof(nasa_n),1,fp);
    fclose(fp);

    printf("請輸入要刪去的名字:\n");
    scanf("%s",name);
    fp=open("nasa","wb");
    for(i=0;i<5;i++)
    {
        if(strcmp(nasa_n[i].name,name)==0)
            continue;
        fwrite(&nasa_n,sizeof(nasa_n),1,fp);
    }
    fclose(fp);
    return 0;
}

 

11.從鍵盤輸入若幹行字元(每行長度不等),輸入後把它們存儲到一磁碟文件中。再從該文件中讀入這些數據,將其中小寫字母轉換成大寫字母後在顯示屏上輸出。

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int i,flag;
    char str[80],c;
    FILE *fp;
    fp=fopen("text.txt","w");        //註意fopen寫成open了不會報錯,但會運行崩潰
    flag=1;
    while(flag==1)
    {
        printf("Input string:");
        gets(str);
        fprintf(fp,"%s",str);                //把字元串str按%s的格式輸出到fp指向的文件text中 
        printf("輸入N或結束迴圈,輸入其他字元結束迴圈:");
        c=getchar();
        getchar();                    //吸收回車產生的換行符 
        if((c=='N')||(c=='n'))
            flag=0;
        printf("\n");
    }
    fclose(fp);
    fp=fopen("text.txt","r");
    printf("轉換後的字元串為:");
    while(fscanf(fp,"%s",str)!=EOF)            //從fp指向的磁碟文件text中讀取字元串送給字元串str 
    {
        for(i=0;str[i]!='\0';i++)
        {
            if((str[i]>='a')&& (str[i]<='z'))            
                str[i]=str[i]-32;                
        }
        printf("%s",str);
    }
    printf("\n");
   fclose(fp);
   return 0;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章是系列文章的第三章,介紹了基於數據流分析的一些優化方法。包括生命周期管理,可獲得表達式,常用表達式,可達性定義。本章在介紹這4中分析方法的基礎上提取出它們的通用模式。這一章形式化的內容比較多,看的時候有點燒腦,最好自己手工推導一下,要不然基本上看不懂:) 本文中的所有內容來自學習DCC888的學 ...
  • 一、吐槽 已經是凌晨12點了我還是睡不著 我所有的實體類時間用的j8的LocalDateTime 這就導致一個問題:jackson不能序列化時間,因為它不支持j8的Api,讓我添加 jackson-datatype-jsr310 解決 二、問題 如果是這樣做統一返回結果集需要 private sta ...
  • 知識回顧 解析完Bean信息的合併,可以知道Spring在實例化Bean之後,屬性填充前,對Bean進行了Bean的合併操作,這裡的操作主要做了對Bean對象標記了@Autowired、@Value、@Resource、@PostConstruct、@PreDestroy註解的欄位或者方法進行解析, ...
  • Cookied的設置會造成XSS攻擊,所以出現了防禦機制HttpOnly標誌(可選),客戶端腳本將無法訪問cookie(如果瀏覽器支持該標誌的話)。因此即使客戶端存在跨站點腳本(XSS)漏洞,瀏覽器也不會將Cookie透露給第三方。Cookie和Session後面還會設計到xss和csrf漏洞的利用... ...
  • 為了修複生產數據,需要執行一段一次性的代碼。 鑒於是spring老項目,就想到了InitializingBean。 代碼如下。服務啟動後,log里發現出現2條“一次性任務開始”。 好在裡面邏輯做了防重控制,沒有受到什麼影響。 @Slf4j @Component public class TransT ...
  • 什麼是隱藏類 隱藏類,是一種不能被其他類直接使用的類。引入隱藏類的主要目的是給框架來使用,使得框架可以在運行時生成類,並通過反射間接使用它們。可能有點抽象,不要緊,下麵我們通過一個例子來直觀的認識它! 隱藏類案例 第一步:先創建一個普通的Java類 public class JEP371Hidden ...
  • 下麵介紹的是JUC包下一些線程安全類的一些簡單使用和一些小demo。 Semaphore 信號量,即可以同時使用的線程數,tryrequire就是將信號量減一,release就是信號量+1,當等於0就會阻塞,大於零才會喚醒。 當需要控制線程訪問數量,可以使用信號量來做控制,比較簡單。 下麵是使用信號 ...
  • Spring Ioc源碼分析系列--Ioc容器註冊BeanPostProcessor後置處理器以及事件消息處理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那麼這一篇繼續在refresh()方法里游蕩,相信對Spring熟悉點的朋友,在看完BeanFactoryPost ...
一周排行
    -Advertisement-
    Play Games
  • Github / Gitee QQ群(1群) : 813100564 / QQ群(2群) : 579033769 視頻教學 介紹 MiniWord .NET Word模板引擎,藉由Word模板和數據簡單、快速生成文件。 Getting Started 安裝 nuget link : https:// ...
  • Array.Sort Array類中相當實用的我認為是Sort方法,相比起冗長的冒泡排序,它的出現讓排序更加的簡化 結果如下: 還可以聲明一個靜態方法用來專門調用指定數組排序,從名為 array 的一維數組中 a 索引處開始,到 b 元素 從小到大排序。 註意: a + b 不能大於 array 的 ...
  • 前言 在上一篇文章CLR類型系統概述里提到,當運行時掛起時, 垃圾回收會執行堆棧遍歷器(stack walker)去拿到堆棧上值類型的大小和堆棧根。這裡我們來翻譯BotR里一篇專門介紹Stackwalking的文章,希望能加深理解。 順便說一句,StackWalker在中文里似乎還沒有統一的翻譯,J ...
  • 使用過 nginx 的小伙伴應該都知道,這個中間件是可以設置跨域的,作為今天的主角,同樣的 反向代理中間件的 YARP 毫無意外也支持了跨域請求設置。 有些小伙伴可能會問了,怎樣才算是跨域呢? 在 HTML 中,一些標簽,例如 img、a 等,還有我們非常熟悉的 Ajax,都是可以指向非本站的資源的 ...
  • 什麼是Git Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。 Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的 ...
  • 首先CR3是什麼,CR3是一個寄存器,該寄存器內保存有頁目錄表物理地址(PDBR地址),其實CR3內部存放的就是頁目錄表的記憶體基地址,運用CR3切換可實現對特定進程記憶體地址的強制讀寫操作,此類讀寫屬於有痕讀寫,多數驅動保護都會將這個地址改為無效,此時CR3讀寫就失效了,當然如果能找到CR3的正確地址... ...
  • 說明 onlyoffice為一款開源的office線上編輯組件,提供word/excel/ppt編輯保存操作 以下操作均基於centos8系統,officeonly鏡像版本7.1.2.23 鏡像下載地址:https://yunpan.360.cn/surl_y87CKKcPdY4 (提取碼:1f92 ...
  • 二叉樹查找指定的節點 前序查找的思路 1.先判斷當前節點的no是否等於要查找的 2.如果是相等,則返回當前節點 3.如果不等,則判斷當前節點的左子節點是否為空,如果不為空,則遞歸前序查找 4.如果左遞歸前序查找,找到節點,則返回,否繼續判斷,當前的節點的右子節點是否為空,如果不為空,則繼續向右遞歸前 ...
  • ##Invalid bound statement (not found)出現原因和解決方法 ###前言: 想必各位小伙伴在碼路上經常會碰到奇奇怪怪的事情,比如出現Invalid bound statement (not found),那今天我就來分析以下出現此問題的原因。 其實出現這個問題實質就是 ...
  • ###一、背景知識 爬蟲的本質就是一個socket客戶端與服務端的通信過程,如果我們有多個url待爬取,只用一個線程且採用串列的方式執行,那隻能等待爬取一個結束後才能繼續下一個,效率會非常低。 需要強調的是:對於單線程下串列N個任務,並不完全等同於低效,如果這N個任務都是純計算的任務,那麼該線程對c ...