计算机二级C语言

本文介绍了C语言中文件操作函数fopen、fseek和fwrite的使用,包括打开文件、设置文件指针位置和写入数据。同时,展示了如何修改文件中的数据以及创建单向链表并填充数值。此外,还提供了一个统计字符串中单词数量的函数。
摘要由CSDN通过智能技术生成

本人自用,没有电脑的时候方便练题,也欢迎一起探讨!有什么问题可以提出来!!加油ヾ(◍°∇°◍)ノ゙

第一套

第一题

【填空题】源程序文件 blank1.c。程序通过定义学生结构体变量,存储了学生的学号、姓名和三门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参 filename所指文件中最后一个学生的数据,即用新的学生数据覆羞该学生原来的数据,其他学生的数据不变。

#include  <stdio.h>
#define    N    5
typedef struct  student {
  long  sno;
  char  name[10];
  float  score[3];
} STU;
void fun(char  *filename, STU  n)
{ FILE  *fp;
/**********found**********/
  fp = fopen(filename, "rb+");	// fp = fopen(__1__, "rb+");
/**********found**********/
  fseek(fp, -(long)sizeof(STU), SEEK_END);	// fseek(__2__, -(long)sizeof(STU), SEEK_END);
/**********found**********/
  fwrite(&n, sizeof(STU), 1,fp);	// fwrite(&n, sizeof(STU), 1, __3__);
  fclose(fp);
}
void main()
{ STU  t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88},
             {10003,"LiSi", 85, 70, 78},    {10004,"FangFang", 90, 82, 87},
             {10005,"ZhangSan", 95, 80, 88}};
  STU  n={10006,"ZhaoSi", 55, 70, 68}, ss[N];
  int  i,j;      FILE  *fp;
  fp = fopen("student.dat", "wb");
  fwrite(t, sizeof(STU), N, fp);
  fclose(fp);
  fp = fopen("student.dat", "rb");
  fread(ss, sizeof(STU), N, fp);
  fclose(fp);
  printf("\nThe original data :\n\n");
  for (j=0; j<N; j++)
  {  printf("\nNo: %ld  Name: %-8s      Scores:  ",ss[j].sno, ss[j].name);
     for (i=0; i<3; i++)  printf("%6.2f ", ss[j].score[i]);
     printf("\n");
  }
  fun("student.dat", n);
  printf("\nThe data after modifing :\n\n");
  fp = fopen("student.dat", "rb");
  fread(ss, sizeof(STU), N, fp);
  fclose(fp);
  for (j=0; j<N; j++)
  {  printf("\nNo: %ld  Name: %-8s      Scores:  ",ss[j].sno, ss[j].name);
     for (i=0; i<3; i++)  printf("%6.2f ", ss[j].score[i]);
     printf("\n");
  }
}

fopen()

描述

C 库函数 FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。

声明

FILE *fopen(const char *filename, const char *mode)

  • filename – 这是 C 字符串,包含了要打开的文件名称。
  • mode – 这是 C 字符串,包含了文件访问模式,模式如下:
    在这里插入图片描述
返回值

该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。

fseek()

描述

C 库函数 int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

声明

int fseek(FILE *stream, long int offset, int whence)

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • offset – 这是相对 whence 的偏移量,以字节为单位。
  • whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
    在这里插入图片描述
返回值

如果成功,则该函数返回零,否则返回非零值。

fwrite()

描述

C 库函数 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中。

声明

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

参数
  • ptr – 这是指向要被写入的元素数组的指针。
  • size – 这是要被写入的每个元素的大小,以字节为单位。
  • nmemb – 这是元素的个数,每个元素的大小为 size 字节。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
返回值

如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。

第二题

【改错题】在此程序中,函数 Creatlink的功能是:创建带头结点的单向链表,并为各结点数据域赋0到m-1的值请改正函数 Creatlink中指定部位的错误,使它能得出正确的结果。

#include <stdio.h>
#include <stdlib.h>
typedef  struct  aa
{  int  data;
   struct  aa  *next;
} NODE;
NODE *Creatlink(int  n, int  m)
{  NODE  *h=NULL, *p, *s;
   int  i;
/**********found***********/
   p=(NODE * )malloc(sizeof(NODE));	// p=(NODE )malloc(sizeof(NODE));
   h=p;
   p->next=NULL;
   for(i=1; i<=n; i++)
   {  s=(NODE *)malloc(sizeof(NODE));
      s->data=rand()%m;      s->next=p->next;
      p->next=s;             p=p->next;
   }
/**********found***********/
   return  h;	// return  p;
}
void outlink(NODE  *h)
{  NODE  *p;
   p=h->next;
   printf("\n\nTHE  LIST :\n\n  HEAD ");
   while(p)
   {  printf("->%d ",p->data);
      p=p->next;
   }
   printf("\n");
}
void main()
{  NODE  *head;
   head=Creatlink(8,22);
   outlink(head);
}


第三题

【编程题】在此程序中,编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。请勿改动main函数和其他函数中的任何内容,仅在函数fn的花括号中填入所编写的若干语句

#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
  int i,j=0;
  for(i=0;s[i]!='\0';i++)
     if(s[i]!=' '&&(s[i+1]==' '||s[i+1]=='\0'))   /*如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束*/
        j++;
  return j;           /*返回单词个数*/
}
void main()
{ 
  FILE *wf;
  char line[N]; 
  int num=0;
  printf("Enter a string:\n "); 
  gets(line);
  num=fun(line);
  printf("The number of word is:%d\n\n ",num);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%d",fun("a big car"));
  fclose(wf);
/*****************************/
}

第二套

第一题

【填空题】在此程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值规定所有数均为正数),作为函数值返回,并将大于平均值的数放在形参y所指数组中,在主函数中输出例如,有10个正数:46、30、32、40、6、17、45、15、48、26,其平均值为30.500000主函数中输出:46 32 40 45 48。

#include <stdlib.h>
#include <stdio.h>
#define   N   10
double fun(double  x[],double  *y)
{ int  i,j;    double  av;
/**********found**********/
  av=0.0;	// av=__1__;
/**********found**********/
  for(i=0; i<N; i++)  
	  av=av+x[i]/N;	// av=av+__2__;
  for(i=j=0; i<N; i++)
/**********found**********/
    if(x[i]>av)  y[j++]= x[i];	// if(x[i]>av)  y[__3__]= x[i];
  y[j]=-1;
  return  av;
}
void main()
{ int  i;    double  x[N],y[N];
  for(i=0; i<N; i++){ x[i]=rand()%50; printf("%4.0f ",x[i]);}
  printf("\n");
  printf("\nThe average is: %f\n",fun(x,y));
  for(i=0; y[i]>=0; i++)  printf("%5.1f ",y[i]);
  printf("\n");
}


第二题

【改错题】在这里插入图片描述

#include  <stdlib.h>
#include  <conio.h>
#include  <stdio.h>
/*************found**************/
double fun (int m)	// fun (int m)
{ double y=0, d;
  int i;
/*************found**************/
  for(i=100;i<=m;i+=100)	// for(i=100,i<=m,i+=100)
     {d=(double)i*(double)i;
      y+=1.0/d;
     }
  return(y);
}
void main()
{ int n=2000;
  system("CLS");
  printf("\nThe result is %1f\n",fun(n));
}


第三题

【编程题】在此程序中,已知学生的记录由学号和学习成绩构成,N名学生的数据己存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(規定只有一个最低分)。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N 10
typedef struct ss
{ char num[10]; 
  int s;
} STU;
void fun(STU a[], STU *s)
{
   int i;
  *s=a[0];                         /*先认为第1个值最小*/
  for(i=0;i<N;i++)                  /*如果在循环的过程中再发现比第1个值更小的则赋给*s*/
    if(s->s>a[i].s)
      *s=a[i];
}
void main()
{ 
  FILE *wf;
  STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},
  { "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;
  int i;
  system("CLS");
  printf("*****The original data*****\n");
  for(i=0;i<N;i++) 
    printf("No=%s Mark=%d\n", a[i].num,a[i].s);
  fun(a,&m);
  printf("*****THE RESULT*****\n");
  printf("The lowest :%s, %d\n",m.num,m.s);
/******************************/
  wf=fopen("out.dat","w");
  fprintf(wf,"%s, %d",m.num,m.s);
  fclose(wf);
/*****************************/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忱铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值