程序设计 实验课的准备
----做一个方便的手机关键词搜索库 之后实现及时的信息检索功能
----做一个简单的C语言入门教程 之后发到CSDN上面----感谢汪庭浩大佬提供的头歌支持
----之后的完善:对于出现的所有函数进行一些必要的分析,做一个较为详净的基于计算机原理的解释
----值得一提的是,该文件仅适用于快速入门C语言的新手用于实现简单的程序,许多如静态变量等的相关知识点都没有涉及
实验一
----一些最为常见的基本的基础知识
基础知识
占位符
- %d:用来输出有符号的十进制整数(包括 int / char 类型)
- %u:用来输出无符号的十进制整数(包括 int / char 类型)
- %o:用来输出无符号的八进制整数
- %x:用来输出无符号的十六进制整数
- %c:用来输出单个字符
- %s:用来输出一个字符串
- %f:用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
- %e:用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
- %g:用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别)
- %.2lf :用来输出保留小数点后两位的形式
----大量使用在输入与输出语句
----加粗描黑的为常用的占位符
scanf
scanf("%d%d",&a,&b);
----将获取到的数值按照顺序分别赋值给a 和 b
----注意要使用取地址符&进行数值的赋值操作
----可以注意到printf和scanf都是使用的双引号
----输入的话不需要太考虑占位符之间是否需要空开,像scanf_s("%d%d", &a, &b);与 scanf_s("%d %d", &a, &b); 的输入方式其实是一样的,输入一个数值 回车 再输入一个数值再回车;也就是说 解释器会自动区分两次的输入
printf
printf("a=%d,b=%d",a,b);
----输出的时候 可以在两端加上必要的字符,在不影响格式化的前提下进行输出内容上的调整
----输出的参数可以直接调用变量来实现输出内容的格式化的替换
----可以注意到printf和scanf都是使用的双引号
----需要通过换行符保证每次输出能不紧挨在一起
a++
----是实现a自增的意思
if
if (a==b)
{
printf("a和b相等\n");
printf("a和b相等\n");
}
或
if (a==b)
{
printf("a和b相等\n");
printf("a和b相等\n");
}
else
{
printf("a和b不相等\n");
printf("a和b不相等\n");
}
或
if(i >= 'a' && i != 'q' && i<='z')
{
xiaoxie++;
}
else if(i >= 'A' && i != 'Q' && i<='Z')
{
daxie++;
}
else
{
qita++;
}
----注意 if 和 else if 和 else 的分别的使用方法
常用头文件
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
----先记着 每次都加这几个头文件
运算符号与优先级
运算符 | 含义 | 结合性 |
---|
() | 括号 | | + - | 单目运算,取正、负 | 从右向左 | * / % | 双目运算,乘除,求余 | 从左向右 | + - | 双目运算,加减 | 从左向右 | = | 双目运算,赋值 | 从右向左 |
----越靠上 优先级越高
变量的初始化
double high,faHeight,moHeight,percent1=1.00,percent2=1.00;
----是可以通过合并多行初始化代码实现更简洁的代码初始化操作
----记得要打逗号和分号
switch
char op;
double a,b,result;
scanf("%lf %c %lf",&a,&op,&b);
switch (op)
{
case '+':
printf("%.2lf",(double)a+b);
break;
case '-':
printf("%.2lf",(double)a-b);
break;
case '*':
printf("%.2lf",(double)a*b);
break;
case '/':
if(b==0)
{
printf("除数不能为0");
break;
}
printf("%.2lf",(double)a/(double)b);
break;
default:
printf("运算符有误");
}
----通过switch括号内部的变量的取值判断执行的是哪部分语句
----可以注意到,内部是通过直接case进行变量与条件的比较与判断,在该条判断执行语句结束时需要使用break跳出当前case的代码块;直接在引号后面敲代码即可
----default则是用来进行没有case匹配上的附加操作,不需要break,也是直接在引号后面敲代码即可
----switch其实就是多分支的if else 语句,判断输入变量的值与case的分支内容是否相等,可看作中间通过 == 连接
代码
0-
/*
程序改错
----输入两个整数 求和
----将错误的程序改为正确的
*/
/*
下面的程序是求a和b的和。用户读入a和b的值,计算出结果,并输出。
现在代码中有问题,无法达到预期效果,
请直接在下面代码中将错误的地方修改正确。
*/
#include <stdio.h>
int main()
{
int a,b;
int sum;
scanf("%d%d",&a,&b);
sum=a+b;
printf("sum=%d\n",sum);
return 0;
}
/*
下面的程序是当a和b的值相等的情况下输出“a和b相等”,而a与b的值不相等的话无输出。
现在代码中有问题,无法达到预期效果,
请直接在下面代码中将错误的地方修改正确。
*/
#include <stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
if (a==b)
{
printf("a和b相等\n");
}
return 0;
}
/*
下面的这个程序是当a和b的值相等的情况下a与b的值同时增加1,而a与b的值不相等的话,二者的值保持不变。
现在代码中有问题,无法达到预期效果,
请直接在下面代码中将错误的地方修改正确。
*/
#include <stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
if (a==b)
{
a++;
b++;
}
printf("a=%d,b=%d",a,b);
return 0;
}
1-
/*
下面的这个程序是当a和b的值相等的情况下a与b的值同时增加1,而a与b的值不相等的话,二者的值保持不变。
现在代码中有问题,无法达到预期效果,
请直接在下面代码中将错误的地方修改正确。
*/
#include <stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
if (a==b)
{
a++;
b++;
}
printf("a=%d,b=%d",a,b);
return 0;
}
2-
/*
下面的这个程序是当a和b的值相等的情况下a与b的值同时增加1,而a与b的值不相等的话,二者的值保持不变。
现在代码中有问题,无法达到预期效果,
请直接在下面代码中将错误的地方修改正确。
*/
#include <stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
if (a==b)
{
a++;
b++;
}
printf("a=%d,b=%d",a,b);
return 0;
}
3-
//请在下方完整写出自己的代码
//注意看左侧提示信息,输入输出要求,不要有多余的输入输出
#include<stdio.h>
int main ()
{
double sum;
sum=1.0+1.0/2+1.0/3;//感觉这里应当是在强调运算符号的优先级
printf("%.2lf",sum);//感觉这里应当是在强调关于格式化时占位符的选择与数据类型的对应
return 0;
}
4-
/*
通过输入数据进行身高的预测
设faHeight为其父身高,moHeight为其母身高,身高预测公式为
男性成人时身高=(faHeight + moHeight)×0.54cm
女性成人时身高=(faHeight×0.923 + moHeight)/2cm
喜爱体育锻炼-->增加身高2%
良好卫生饮食习惯-->增加身高1.5%
*/
#include<stdio.h>
int main()
{
double high,faHeight,moHeight,percent1=1.00,percent2=1.00;
char sex,sport,diet;
scanf("%lf %lf %c %c %c",&faHeight,&moHeight,&sex,&sport,&diet);
if(sex=='M')
{
if(sport=='Y')percent1+=0.02;
if(diet=='Y')percent2+=0.015;
high=(faHeight+moHeight)*0.54;high=high*percent1+high*percent2-high;
printf("%.2lf\n",high);
}
if(sex=='F')
{
if(sport=='Y')percent1+=0.02;
if(diet=='Y')percent2+=0.015;
high=(faHeight*0.923+moHeight)/2.0;high=high*percent1+high*percent2-high;
printf("%.2lf\n",high);
}
return 0;
}
5-
/*
计算器应用
----使用switch程序设计简单的计算器应用
----熟悉各类操作符 + - x /
----输出语句的格式转换
*/
#include<stdio.h>
#include<math.h>
int main()
{
char op;
double a,b,result;
scanf("%lf %c %lf",&a,&op,&b);
switch (op)
{
case '+':
printf("%.2lf",(double)a+b);
break;
case '-':
printf("%.2lf",(double)a-b);
break;
case '*':
printf("%.2lf",(double)a*b);
break;
case '/':
if(b==0)
{
printf("除数不能为0");
break;
}
printf("%.2lf",(double)a/(double)b);
break;
default:
printf("运算符有误");
}
return 0;
}
实验二
----循环结构程序设计
基础知识
自运算
#include "stdio.h"
int a = 1;
int main(){
printf("a = %d ", a++);
return a;
}
/*--------------------分割线--------------------*/
#include "stdio.h"
int a = 1;
int main() {
printf("a = %d ", ++a);
return a;
}
/*--------------------分割线--------------------*/
#include "stdio.h"
int a = 1;
int main() {
printf("a = %d ", a+=1);
return a;
}
----C语言自加自减运算符(++i / i++) Leon称之为自运算,方便概述与记忆
---- printf("a = %d ", a++);的含义为先对a进行a的输出操作,再进行+1操作,因为++在变量的后面,所以输出为1
---- printf("a = %d ", ++a);的含义为先进行+1操作,再对a进行a的输出操作,因为++在变量的前面,所以输出为2
----printf("a = %d ", a+=1);的含义为先进行+1操作,再对a进行a的输出操作,输出为2
----其他相似的运算符号同理
for 循环
for(j=1;j<=i;j++)
{
printf("%d",j);
printf("%d",j);
}
/*--------------------分割线--------------------*/
for(;;num++)
{
scanf("%d",&a);
if(a<=0)
{
break;
}
sum+=a;
if(a<60)
{
failed++;
}
}
----第一个参数是进行变量的初始化
----第二个参数是判断是否需要进行迭代,是每个小循环体的起点
----第三个参数是用于for 循环的结束,起到避免无限循环的作用,只有当括号内程序运行结束时才会执行第三个参数的操作
----可以看到 for 循环语句的初始括号可以空着不填,只要代码合理即可
数据转换
avarage=(int)sum/num;
----可以看到,通过 (int) 的形式可以进行强制的数据格式上的转换
ASCI码
if(i >= 'a' && i != 'q' && i<='z')
----是计算机字符与编码的对应
----单引号用来表示内部字符串的对应编码–>比方说,'A’其实对应的是A字符的编码,所以i >= 'a’是在比较变量i对应的字符串的数值在ASCI码上的数值的大小,这里涉及到一个数据类型在运算操作时的自动转换问题,暂时不需要了解,大致知道这种操作方式即可
----这里知道,字符与
代码
0-
/*分析并修改下面程序错误,使之能够正常运行。
该程序用于求从1到100的整数和。错误代码如下.*/
void main()
{ int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/
while( i<=100 )
{ sum += i; /*实现累加*/
i++; /*循环控制变量i增1*/
}
printf("sum=%d\n",sum);
}
1-
/*
要求按如下数字形状输出,代码有错误,请修改正确。
1
123
12345
1234567
代码如下: */
#include<stdio.h>
int main()
{
int i,j;
for(i=1;i<9;)
{
for(j=1;j<=i;j++)
{
printf("%d",j);
}
printf("\n");
i+=2;
}
}
2-
/*
学生成绩录入
----从键盘输入一批学生的成绩(以负数为结束标志)
----计算平均分,并统计不及格成绩的个数。
*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b,sum=0,num=0,avarage=0,failed=0;
for(;;num++)
{
scanf("%d",&a);
if(a<=0)
{
break;
}
sum+=a;
if(a<60)
{
failed++;
}
}
avarage=(int)sum/num;
printf("%d %d",avarage,failed);
}
4-
//题目3(3) 统计键盘输入的不同类型字符个数。
//请给出你的程#include<stdio.h>
int main()
{
char i;
int daxie = 0,xiaoxie = 0,qita = 0,count = 0;
while(1)
{
scanf("%c",&i);
if(i =='q')
{
xiaoxie++;
break;
}
else if(i =='Q')
{
daxie++;
break;
}
if(i >= 'a' && i != 'q' && i<='z')
{
xiaoxie++;
}
else if(i >= 'A' && i != 'Q' && i<='Z')
{
daxie++;
}
else if(i >= '0' && i <= '9')
{
count++;
}
else
{
qita++;
}
}
printf("%d %d %d %d",count,xiaoxie,daxie,qita);
return 0;
}
5-
/*题目4 编写程序,打印99乘法表。
请给出你的程序,并进行测评,注意下面所给的测试集。为方便看代码你在熟悉测试集以后可以删除下面的内容。
1X1=1
1X2=2 2X2=4
1X3=3 2X3=6 3X3=9
1X4=4 2X4=8 3X4=12 4X4=16
1X5=5 2X5=10 3X5=15 4X5=20 5X5=25
1X6=6 2X6=12 3X6=18 4X6=24 5X6=30 6X6=36
1X7=7 2X7=14 3X7=21 4X7=28 5X7=35 6X7=42 7X7=49
1X8=8 2X8=16 3X8=24 4X8=32 5X8=40 6X8=48 7X8=56 8X8=64
1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81
每个表达式之间是空英文的一格,乘号用的是大写英文字母X
*/#include<stdio.h>
int main()
{
int i,j;
for(i=1;i<10;i++)
{
for(j=1;j<10;j++)
{ if(j>i)
{
break;
}
printf("%dX%d=%d ",j,i,i*j);
}
printf("\n");
}
}
6-零钱转换器
/*
零钱转换计算器
----面额为10元倍数的整钱(<=100元)换成1元、2元和5元的零钱组合(每种面值都要有)。
----输入要换的面额(如10元),输出所有可能的换法及其数量。
----要求你的输出要依次按5元、2元、1元的数量从多到少的组合!
----这里采用的是硬算的方法
*/
#include <stdio.h>
int main()
{
int a,b,c,sum,count=0;
scanf("%d",&sum);
//进行3个for的连续迭代
for(a=20;a>=1;a--)
for(b=50;b>=1;b--)
for(c=100;c>=1;c--)
if(sum==a*5+b*2+c)
{
count++;
printf("%d %d %d\n",a,b,c);
}
printf("%d",count);
return 0;
}
实验三
基础知识
数组
一维数组
int num[5]
scanf("%d",&a[0])
int a[5] = {6,2,4}
int a[5] = {6,2,4,0,0}
int a[ ] = {6,2,4,0,0}
a[0]=6,a[1]=2,a[2]=4,a[3]=0,a[4]=0
----定义一个整型数据num,其中包含五个元素分别是num[0],num[1],num[2],num[3],num[4]
----关注数组的使用方式–参考变量,和变量的使用方式差不多
----关注 初始化方式
二维数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4KOxSlv-1640436577694)(头歌文件复习.assets/1640377729903.png)]
int a[3][4] = {{1,2,3,4},{1,2,3,4},{1,2,3,4}}
int a[3][4] = {1,2,3,4,1,2,3,4,1,2,3,4}
int a[3][4] = {{1},{1,5},{1,2,3}}
----第一个数字所在区域对应第一层括号---第一维度
int a[][4] = {1,2,3,4,5,6,7,8,9,0}
int a[][4] = {{0,0,3},{},{0,10}}
函数参数
float avgScore(float score[],int N)
字符数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OiOMZJqE-1640436577695)(头歌文件复习.assets/1640377709380.png)]
----与普通二维数组的使用方法完全相同
----初始化时 A[i] = ‘\0’; //字符串的结尾标志,防止乱码 ----字符和数组这里必须再看看----之后来看
字符处理
puts(str);
gets(str);
{char a[20] =“Visual";
char b[]=“C++";
strcat(a ,b);
printf("%s\n", a);
char b[]= "C++",
c[] =“Visual";
strcpy(a, c);
strcat(a, b);
printf("%s\n", a);
char str1[] =“Hell0!", str2[] =“Hello!";
if(strcmp(strl, str2)>0)
printf(“Hell0!> Hello!");
else if(strcmp(strl, str2)==0)
printf("Hell0!= = Hello!");
else
printf("Hell0!< Hello!");
char str1[] = "Hello!"', str2[] = "How are you?";
int len1,len2,len3;
len1=strlen(str1) ;
len2=strlen(str2);
printf(len1=%d len2=%d",len 1,len2);
a = atof(strA);
冒泡排序
#include <stdio.h> //冒泡排序优化
#define N 6
void main ( )
{
int a[N], i, j, t,flag=1;//为1时表示有交换
//输入N个整数----获取数据
printf ("input %d numbers: \n", N);
for(i=0;i<N; i++)scanf ("%d", &a[i);
//排序
for(i=1;i< N; i++) //N-1趟冒泡排序
{
if(flag== =0) break; //表示上一-趟没有交换----
else {flag=0; //初始为无交换
for(j=0;j<N_i; j++)//一趟冒泡排序
{
if(a[j] > a[j+1]) //交换a[j]和a[j+1]
{t= a[j]; a[j] = a[j+1]; a[j+1]= t; flag=1;}
}
}
printf ("the sorted numbers:\n");
for(i=0;i<N; i++)printf ("%d ", a[i]);,
}
代码
0-
/*
改正下列程序错误,使之能够统计数组元素之和并输出。
*/
#include <stdio.h>
int main(void)
{
int sum=0;
int a[5]={5,4,3,2,1};
int i;
for (i=0;i<5;i++)
{
sum=sum+a[i];
}
printf("sum=%d\n",sum);
return 0;
}
1-
/*
输入数组 输出处理结果
----输入测试集中存入数组 a
----输出 a 中的最大值,最小值及求出其平均值(保留两位小数)。
*/
#include<stdio.h>
int main()
{ int i,j,k,a[i];
int max,min;
double avar,sum=0;
scanf("%d",&i);
for(j=0;j<i;j++)
{
scanf("%d",&k);
a[j]=k;
sum=sum+k;
}
max = a[0];
min = a[0];
for(j=0;j<i;j++)
{
if(a[j]>=max)
{
max=a[j];
}
if(a[j]<=min)
{
min=a[j];
}
}
printf("%d %d ",max,min);
avar=(double)sum/i;
printf("%2.2lf",avar);
}
// 最简单的排序算法
/*
max = a[0];
min = a[0];
for(j=0;j<i;j++)
{
if(a[j]>=max)
{
max=a[j];
}
if(a[j]<=min)
{
min=a[j];
}
}
*/
2-
#include <stdio.h>
int main()
{
int i,score,count;
int a[10]={0};
for(i=0,count=0;i<40;i++)
{
scanf("%d",&score);
switch(score)
{
case 1:
a[0]++;break;
case 2:
a[1]++;break;
case 3:
a[2]++;break;
case 4:
a[3]++;break;
case 5:
a[4]++;break;
case 6:
a[5]++;break;
case 7:
a[6]++;break;
case 8:
a[7]++;break;
case 9:
a[8]++;break;
case 10:
a[9]++;break;
}
}
for(i=0;i<10;i++)
{
printf("%d\t%d\t",i+1,a[i]);
for(;a[i]>0;a[i]--)
{
printf("*");
}
printf("\n");
}
return 0;
}
实验四
基础知识
声明函数
long fact(long a);
----用于避免函数之间顺序相对关系造成的函数无法正常读取
----函数名和参数都要写
代码
0-
/*
通过自定义函数max求两个数最大值
----改错
*/
#include<stdio.h>
int max1(int a, int b)
{
int max;
if(a>b)
max=a;
else
max=b;
return max;
}
int main()
{
int max,x,y;
scanf("%d%d",&x ,&y);
max=max1(x,y);
printf("max=%d",max);
return 0;
}
1-
#include<stdio.h>
long fact(long a);
void main()
{
long n,result=0;
long i,sum;
scanf("%ld",&n);
for(i=1;i<=n;i++)
{
result+=fact(i);
}
printf("1!+2!+...+n!=%ld",result);
}
long fact(long a)
{
int j,sum=1;
for(j=1;j<=a;j++)
{
sum=sum*j;
}
return sum;
}
2-
/*
统计一个班级学生(总人数不超过40)的平均成绩
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 40
void inputScore(float score[],int N);
float avgScore(float score[],int N);
int main()
{
float score[MAXNUM],avg;
int N;
scanf("%d",&N);
/******添加对N的合法性检查的代码,若N不在2-40范围,则输出:输入错误,并退出程序******/
while(N>40||N<2)
{
printf("输入错误");
return 0;
}
/*******end*************************************************************************/
inputScore(score,N);
avg=avgScore(score,N);
printf("平均成绩为%.2f",avg);
return 0;
}
/******请根据任务要求在下面添加定义上面两个函数的代码*******/
void inputScore(float score[],int N)
{
int i=0,k=0;float temp;
for(;i<N;)
{
scanf("%f",&temp);
if(temp>100||temp<0)
{
printf("请重新输入\n");
continue;
}
score[i]=temp;
//printf("%f",score[i]);
i++;
}
}
float avgScore(float score[],int N)
{
float sum=0,avg;
int i=0;
for(;i<N;i++)
{
sum+=score[i];
}
avg=(float)sum/N;
return avg;
}
实验五
基础知识
命令行参数
代码
0-
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
void copy(char* s, char* A, char* B, int index)
{
int len = strlen(s);
int i, j;
for (i = 0; i < index; i++) A[i] = s[i];
A[i] = '\0';
for (i = index + 1, j=0; i < len; i++, j++) B[j] = s[i];
B[i] = '\0';
}
void processUserInputStr(char* s)
{
int len = strlen(s);
int i;
int index = -1;
char strA[100] = "", strB[100] = "";
double a, b, result;
s[len] = '\0';
for (i = 1; i < len; i++)
{
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
index = i;
break;
}
}
if (index == -1)
{
printf("请输入正确的表达式!");
return;
}
copy(s, strA, strB, index);
a = atof(strA);
b = atof(strB);
switch (s[index])
{
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/': result = a / b; break;
default: printf("请确认表达式是否合理!");
}
printf("%.2f", result);
}
1-
void swap(double* x,double* y)
{
double i;
i=*x;
*x=*y;
*y=i;
}
void inputData(double* date,int N)
{
for(int k=0;k<N;k++)
{
scanf("%lf",&date[k]);
}
}
void sortData(double* date,int N,int mode)
{
if(mode==0)
{
for(int i=0;i<N-1;i++)
for(int j=0;j<N-1-i;j++)
if(date[j]>date[j+1])
{
swap(date+j,date+j+1);
}
}
else
{
for(int i=0;i<N-1;i++)
for(int j=0;j<N-1-i;j++)
if(date[j]<date[j+1])
{
swap(date+j,date+j+1);
}
}
}
void outputData(double* a,int N)
{
for(int i=0;i<N;i++)
{
printf("%.2f ",a[i]);
}
}
实验六
基础知识
结构体
初始化与定义
struct student
{
int num ;
char name[20];
char sex;
int age;
float score ;
char addr[30];
};
struct student stu1,stu2;
//------------------------分割线------------------------
struct student
{
int num ;
char name[20];
char sex;
int age;
float score ;
char addr[30];
}stu1,stu2;
----注意:先定义 再命名
引用
stu.name=10;
stu.score=85.5;
代码
----结构体的相关知识,过两天加上
实验七
基础知识
文件读写
fopen(文件名,打开方式);
fclose(fp);
a = fgetc(fp)
fgets(str,n,fp)
fputc(ch,fp)
fputs(str,fp)
fprintf(fp,"%d %d",i,f);
fscanf(fp,"%d %d",&i,&f);
文件处理方式 | 含义 | 指定文件不存在 |
---|
"r” (只读) | 为了输入数据,打开一个已存在的文本文件 | 报错 | “W” (只写) | 为了输出数据,打开一个文本文件 | 为了输出数据,打开一个文本文件建立新文件 | "a” (追加) | 向文本文件尾添加数据 | 出错 | “rb" (只读) | 为了输入数据,打开一个二进制文件 | 出错 | “wb” (只写) | 为了输出数据,打开一个二进制文件 | 建立新文件 | “ab” (追加) | 向二进制文件尾添加数据 | 出错 | “r+” (读写) | 为了读和写,打开一个文本文件 | 出错 | "w+” (读写) | 为了读和写,建立一个新的文本文件 | 建立新文件 | “a+” (读写) | 为了读和写,打开一个文本文件 | 出错 | “rb+" (读写) | 为了读和写,打开一个二进制文件 | 出错 | “wb+” (读写) | 为了读和写,建立一个新的二进制文件 | 建立新文件 | “ab+” (读写) | 为读写打开一个二进制文件 | 出错 |
代码
/*
----输入一个班学生某门课程的成绩信息,包括学号、姓名、平时成绩、考试成绩
----通过计算得到总评成绩(=20%×平时成绩+80%×考试成绩),能够将这些信息存入文本文件;
----能够从文件中读取全部学生信息和查询总评成绩最低和最高的学生信息,并完整无误地显示出来。
学生信息按如下格式保存到文本文件:
001 张三 34.00 56.00 51.60
002 李四 68.00 90.00 85.60
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "student.h"
//请在下面给出程序中所用到的自定义函数的完整定义
void inputInformation(Student* stus, int N)
{
int i;
for (i = 0; i < N; i++)
{
printf("学生%d的学号,姓名,平时成绩,考试成绩(空格分隔):\n", i);//输出信息
scanf("%s%s%f%f", &stus[i].stu_number, &stus[i].stu_name, &stus[i].usual_mark, &stus[i].exam_mark);//获取信息
stus[i].overall_mark = stus[i].usual_mark * 0.2 + stus[i].exam_mark * 0.8;
}//成绩计算
}//void不需要返回值
void saveInformation(Student* stus, int N, char* filename)
{
FILE* fp;//固定操作 先记着
fp = fopen("filename", "w");
for (int i = 0; i < N; i++)
{
fprintf(fp, "%s %s %.2f %.2f %.2f\n", stus[i].stu_number, stus[i].stu_name, stus[i].usual_mark, stus[i].exam_mark, stus[i].overall_mark);
}
fclose(fp);
}
void outputInformation(char* filename)
{
printf("全部学生:\n");
Student min, max, * stus;
stus = (Student*)malloc(sizeof(Student) * 10);
int i = 0;
FILE* fp;
fp = fopen("filename", "r");
while (fscanf(fp, "%s %s %f %f %f", &stus[i].stu_number, &stus[i].stu_name, &stus[i].usual_mark, &stus[i].exam_mark, &stus[i].overall_mark) != EOF)
{
printf("学号=%s,姓名=%s,平时成绩=%.2f,考试成绩=%.2f,总评成绩=%.2f\n", stus[i].stu_number, stus[i].stu_name, stus[i].usual_mark, stus[i].exam_mark, stus[i].overall_mark);
i++;
}
fclose(fp);
min = max = stus[0];
for (int j = 1; j < i; j++)
{
if (min.overall_mark > stus[j].overall_mark)
{
min = stus[j];
}
if (max.overall_mark < stus[j].overall_mark)
{
max = stus[j];
}
}
printf("最低分学生:\n");
printf("学号=%s,姓名=%s,平时成绩=%.2f,考试成绩=%.2f,总评成绩=%.2f\n", min.stu_number, min.stu_name, min.usual_mark, min.exam_mark, min.overall_mark);
printf("最高分学生:\n");
printf("学号=%s,姓名=%s,平时成绩=%.2f,考试成绩=%.2f,总评成绩=%.2f\n", max.stu_number, max.stu_name, max.usual_mark, max.exam_mark, max.overall_mark);
free(stus);
}
实验中没用到但是需要的基础知识
常量-定义
#define PI 3.1415926
const double eps = 0.001; //误差精度
getchar & putchar
a = getchar();
putchar(a);
----输出为a 等价于scanf与printf 是简化版的输入输出语句
do while
/*从1加到100*/
#include <stdio.h>
int main0
int i= 1,sum=0;
do
{
sum=sum+i;
i++;
}
while(i<= 100];
printf("sum=%d\n" ,sum);
return 0;
}
----与while的不同点在于,while先判断再执行,而do while是先执行再判断
continue
void main()
{
int i=0;
while(i<10)
{
if(i<1)continue;
if(i==5)break;
i++;
}
}
----用于实现跳出循环体的此次循环,进入下一次循环;与break相对应
|