大家好,這篇文章分享了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;
}