⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c语言难点分析整理.txt

📁 这篇文章主要是介绍一些在复习C语言的过程中笔者个人认为比较重点的地方
💻 TXT
📖 第 1 页 / 共 2 页
字号:

文件: 

函数调用形式  说明  
fopen("路径","打开方式") 打开文件 
fclose(FILE *) 防止之后被误用 
fgetc(FILE *) 从文件中读取一个字符 
fputc(ch,FILE *) 把ch代表的字符写入这个文件里 
fgets(FILE *) 从文件中读取一行 
fputs(FILE *) 把一行写入文件中 
fprintf(FILE *,"格式字符串",输出表列) 把数据写入文件 
fscanf(FILE *,"格式字符串",输入表列) 从文件中读取 
fwrite(地址,sizeof(),n,FILE *) 把地址中n个sizeof大的数据写入文件里 
fread(地址,sizeof(),n,FILE *) 把文件中n个sizeof大的数据读到地址里 
rewind(FILE *) 把文件指针拨回到文件头 
fseek(FILE *,x,0/1/2) 移动文件指针。第二个参数是位移量,0代表从头移,1代表从当前位置移,2代表从文件尾移。 
feof(FILE *) 判断是否到了文件末尾 

文件打开方式  说明  
r  打开只能读的文件 
w  建立供写入的文件,如果已存在就抹去原有数据 
a  打开或建立一个把数据追加到文件尾的文件 
r+  打开用于更新数据的文件 
w+  建立用于更新数据的文件,如果已存在就抹去原有数据 
a+  打开或建立用于更新数据的文件,数据追加到文件尾 

注:以上用于文本文件的操作,如果是二进制文件就在上述字母后加“b”。 

我们用文件最大的目的就是能让数据保存下来。因此在要用文件中数据的时候,就是要把数据读到一个结构(一般保存数据多用结构,便于管理)中去,再对结构进行操作即可。例如,文件aa.data中存储的是30个学生的成绩等信息,要遍历这些信息,对其进行成绩输出、排序、查找等工作时,我们就把这些信息先读入到一个结构数组中,再对这个数组进行操作。如下例:

#include<stdio.h> 
#include<stdlib.h> 
#define N 30 
typedef struct student /*定义储存学生成绩信息的数组*/ 
{ 
char *name; 
int chinese; 
int maths; 
int phy; 
int total; 
}ST; 

main() 
{ 
ST a[N]; /*存储N个学生信息的数组*/ 
FILE *fp; 
void (*process[3])(ST *)={Output,Bubble,Find}; /*实现相关功能的三个函数*/ 
int choice,i=0; 
Show(); 
printf("\nChoose:\n?"); 
scanf("%d",&choice); 
while(choice>=0&&choice<=2) 
   { 
   fp=fopen("aa.dat","rb"); 
   for(i=0;i<N;i++) 
      fread(&a[i],sizeof(ST),1,fp); /*把文件中储存的信息逐个读到数组中去*/ 
   fclose(fp); 
   (*process[choice])(a); /*前面提到的指向函数的指针,选择操作*/ 
   printf("\n"); 
   Show(); 
   printf("\n?"); 
   scanf("%d",&choice); 
   } 
} 

void Show() 
{ 
printf("\n****Choices:****\n0.Display the data form\n1.Bubble it according to the total score\n2.Search\n3.Quit!\n"); 
} 

void Output(ST *a) /*将文件中存储的信息逐个输出*/ 
{ 
int i,t=0; 
printf("Name Chinese Maths Physics Total\n"); 
for(i=0;i<N;i++) 
   { 
   t=a[i].chinese+a[i].maths+a[i].phy; 
   a[i].total=t; 
   printf("%4s%8d%8d%8d%8d\n",a[i].name,a[i].chinese,a[i].maths,a[i].phy,a[i].total); 
   } 
} 

void Bubble(ST *a) /*对数组进行排序,并输出结果*/ 
{ 
int i,pass; 
ST m; 
for(pass=0;pass<N-1;pass++) 
   for(i=0;i<N-1;i++) 
      if(a[i].total<a[i+1].total) 
         { 
         m=a[i]; /*结构互换*/ 
         a[i]=a[i+1]; 
         a[i+1]=m; 
         } 
Output(a); 
} 

void Find(ST *a) 
{ 
int i,t=1; 
char m[20]; 
printf("\nEnter the name you want:"); 
scanf("%s",m); 
for(i=0;i<N;i++) 
   if(!strcmp(m,a[i].name)) /*根据姓名匹配情况输出查找结果*/ 
   { 
   printf("\nThe result is:\n%s, Chinese:%d, Maths:%d,     Physics:%d,Total:%d\n",m,a[i].chinese,a[i].maths,a[i].phy,a[i].total); 
   t=0; 
   } 
if(t) 
   printf("\nThe name is not in the list!\n"); 
} 
 

链表: 
链表是C语言中另外一个难点。牵扯到结点、动态分配空间等等。用结构作为链表的结点是非常适合的,例如: 

struct node 
{ 
int data; 
struct node *next; 
};  

其中next是指向自身所在结构类型的指针,这样就可以把一个个结点相连,构成链表。

链表结构的一大优势就是动态分配存储,不会像数组一样必须在定义时确定大小,造成不必要的浪费。用malloc和free函数即可实现开辟和释放存储单元。其中,malloc的参数多用sizeof运算符计算得到。

链表的基本操作有:正、反向建立链表;输出链表;删除链表中结点;在链表中插入结点等等,都是要熟练掌握的,初学者通过画图的方式能比较形象地理解建立、插入等实现的过程。 

typedef struct node 
{ 
char data; 
struct node *next; 
}NODE; /*结点*/ 

正向建立链表: 
NODE *create() 
{ 
char ch='a'; 
NODE *p,*h=NULL,*q=NULL; 
while(ch<'z') 
   { 
   p=(NODE *)malloc(sizeof(NODE)); /*强制类型转换为指针*/ 
   p->data=ch; 
   if(h==NULL) h=p; 
      else q->next=p; 
   ch++; 
   q=p; 
   } 
q->next=NULL; /*链表结束*/ 
return h; 
}  

 

逆向建立:

NODE *create() 
{ 
char ch='a'; 
NODE *p,*h=NULL; 
while(ch<='z') 
   { 
   p=(NODE *)malloc(sizeof(NODE)); 
   p->data=ch; 
   p->next=h; /*不断地把head往前挪*/ 
   h=p; 
   ch++; 
   } 
return h; 
}  

 

用递归实现链表逆序输出:

void output(NODE *h) 
{ 
if(h!=NULL) 
   { 
   output(h->next); 
   printf("%c",h->data); 
   } 
}  

插入结点(已有升序的链表):

NODE *insert(NODE *h,int x) 
{ 
NODE *new,*front,*current=h; 
while(current!=NULL&&(current->data<x)) /*查找插入的位置*/ 
   { 
   front=current; 
   current=current->next; 
   } 
new=(NODE *)malloc(sizeof(NODE)); 
new->data=x; 
new->next=current; 
if(current==h) /*判断是否是要插在表头*/ 
   h=new; 
else front->next=new; 
return h; 
}  

 

删除结点:

NODE *delete(NODE *h,int x) 
{ 
NODE *q,*p=h; 
while(p!=NULL&&(p->data!=x)) 
   { 
   q=p; 
   p=p->next; 
   } 
if(p->data==x) /*找到了要删的结点*/ 
   { 
   if(p==h) /*判断是否要删表头*/ 
   h=h->next; 
      else q->next=p->next; 
   free(p); /*释放掉已删掉的结点*/ 
   } 
return h; 
}  

 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -