计算机二级-C语言-对文件的读写操作。链表的定义与赋值。对字符串的遍历和处理。

//程序填空题:在此程序中,通过定义学生结构体变量,存储了学生的学号,姓名和三门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun()函数的功能是重写形参filename所指文件中最后一个学生的数据,即用新的覆盖旧的,其他的不变。

//重难点:结构体数据的定义。对文件的读写操作。双层for循环输出结构体的数据。

 1 #include  <stdio.h>
 2 #define    N    5
 3 typedef struct  student {
 4   long  sno;
 5   char  name[10];
 6   float  score[3];
 7 } STU;
 8 void fun(char  *filename, STU  n)
 9 { FILE  *fp;
10 /**********found**********/
11   fp = fopen(filename, "rb+");//打开文件,这里填首地址,不加*号
12 /**********found**********/
13   fseek(fp, -(long)sizeof(STU), SEEK_END);//重定位流上的文件指针,第一参数类型为:FILE *stream,把指针指向最后一个数据。
14 /**********found**********/
15   fwrite(&n, sizeof(STU), 1, fp);
16   fclose(fp);
17 }
18 void main()
19 { STU  t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88},
20              {10003,"LiSi", 85, 70, 78},    {10004,"FangFang", 90, 82, 87},
21              {10005,"ZhangSan", 95, 80, 88}};
22   STU  n={10006,"ZhaoSi", 55, 70, 68}, ss[N];
23   int  i,j;      FILE  *fp;
24   fp = fopen("student.dat", "wb");
25   fwrite(t, sizeof(STU), N, fp);
26   fclose(fp);
27   fp = fopen("student.dat", "rb");
28   fread(ss, sizeof(STU), N, fp);
29   fclose(fp);
30   printf("\nThe original data :\n\n");
31   for (j=0; j<N; j++)//for双层循环进行结构体数据的遍历输出。
32   {  printf("\nNo: %ld  Name: %-8s      Scores:  ",ss[j].sno, ss[j].name);
33      for (i=0; i<3; i++)  printf("%6.2f ", ss[j].score[i]);
34      printf("\n");
35   }
36   fun("student.dat", n);
37   printf("\nThe data after modifing :\n\n");
38   fp = fopen("student.dat", "rb");
39   fread(ss, sizeof(STU), N, fp);
40   fclose(fp);
41   for (j=0; j<N; j++)
42   {  printf("\nNo: %ld  Name: %-8s      Scores:  ",ss[j].sno, ss[j].name);
43      for (i=0; i<3; i++)  printf("%6.2f ", ss[j].score[i]);
44      printf("\n");
45   }
46 }

//程序修改题:在此程序中,函数Creatlink的功能是:创建带头节点的单向链表,使它能得出正确结果。

//重难点:结构体类型链表的定义。链表数据的赋值,malloc()函数内存申请。处理前进行表头的备份。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 typedef  struct  aa
 4 {  int  data;
 5    struct  aa  *next;
 6 } NODE;
 7 NODE *Creatlink(int  n, int  m)
 8 {  NODE  *h=NULL, *p, *s;
 9    int  i;
10 /**********found***********/
11    p=(NODE *)malloc(sizeof(NODE));//变量p指向刚分配的结构节点指针,(NODE *)表示类型,就好比(int),这里进行内存申请
12    h=p;//使用临时变量h保存p指针的初始位置。
13    p->next=NULL;
14    for(i=1; i<=n; i++)
15    {  s=(NODE *)malloc(sizeof(NODE));//定义一个s进行数据的复制
16       s->data=rand()%m;      s->next=p->next;
17       p->next=s;             p=p->next;
18    }
19 /**********found***********/
20    return  h;
21 }
22 void outlink(NODE  *h)
23 {  NODE  *p;
24    p=h->next;//从新定义个指针指向h,进行数据的输出
25    printf("\n\nTHE  LIST :\n\n  HEAD ");
26    while(p)
27    {  printf("->%d ",p->data);
28       p=p->next;
29    }
30    printf("\n");
31 }
32 void main()
33 {  NODE  *head;//定义结构体类型链表指针
34    head=Creatlink(8,22);//函数返回链表表头
35    outlink(head);
36 }

//程序设计题:在此程序中,编写fun()函数,它的功能是:统计一行字符串中单词的个数,作为函数的返回值。字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开头没有空格。

//重难点:思路为遍历整个字符串,然后遇见空格,就进行它的前一个字符的判断,如果不为空格就代表一个单词。

 1 #include<string.h>
 2 #include<stdio.h>
 3 #define N 80
 4 int fun(char *s)
 5 {
 6     int i=1;//默认输入的单词最后不是以空格结尾,所以加1。
 7     char a;
 8     for (*s;*s!='\0'; s++)//字符串以‘\0’结尾
 9     {
10         if (*s == ' ')
11         {
12             a = *(s - 1);
13             //a = *(--s);//这里尽量不要使用--s,这样的话指针位置会改变。
14             if (a >= 'a'&&a <= 'z')//这里是大于等于
15             {
16                 i = i + 1;
17                 //s=s+1;
18             }
19         }
20     }
21     return i;
22 }
23 void main()
24 { 
25   FILE *wf;
26   char line[N]; 
27   int num=0;
28   printf("Enter a string:\n "); 
29   gets(line);
30   num=fun(line);
31   printf("The number of word is:%d\n\n ",num);
32 /******************************/
33   wf=fopen("out.dat","w");
34   fprintf(wf,"%d",fun("a big car"));
35   fclose(wf);//断开文件指针和文件之间的联系。
36 /*****************************/
37 }

 

posted @ 2019-01-13 15:55  小大大小  阅读(712)  评论(0编辑  收藏  举报