实验平台:VS2013+Opencv2.4.9
程序:
#define _CRT_SECURE_NO_WARNINGS//对应错误二
#include<stdio.h>
#include <stdlib.h> //system("cls")头文件
#include<conio.h>//getch()头文件
#include<string.h>//strcmp()头文件
#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf\n"
#define DATA stu[i].num,stu[i].name,stu[i].elec,stu[i].expe,stu[i].requ,stu[i].sum
#define LEN sizeof(struct student) //sizeof:长度=最长成员所占的字节数
float Felec, Fexpe, Frequ;
#include<stdio.h>
#include <stdlib.h> //system("cls")头文件
#include<conio.h>//getch()头文件
#include<string.h>//strcmp()头文件
#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf\n"
#define DATA stu[i].num,stu[i].name,stu[i].elec,stu[i].expe,stu[i].requ,stu[i].sum
#define LEN sizeof(struct student) //sizeof:长度=最长成员所占的字节数
float Felec, Fexpe, Frequ;
struct student//定义学生成绩结构体
{
int num;//学号
char name[15];//姓名
double elec;//选修课
double expe;//实验
double requ;//必修课
double sum;//总分
};
struct student stu[50];//定义结构体数组
void in();
void show();
void menu();
void main()/*主函数*/
{
int n; //输入选择功能编号
menu();
scanf("%d", &n);
while (n)
{
switch (n)
{
case 1:
in();//学生成绩录入函数
break;
default:break;
}
_getch();//对应错误一,将getch()改为_getch()
menu();/*执行完功能再次显示菜单界面*/
scanf("%d", &n);
}
}
void in()
{
int i,m = 0;
char ch[2];
FILE *fp;
if ((fp =fopen("data", "ab+")) == NULL)
{
printf("can not open\n");
return;
}
while (!feof(fp))
{
if (fread(&stu[m], LEN, 1, fp) == 1)
m++;
}
fclose(fp);
if (m == 0)
printf("No record!\n");
else
{
system("cls");
show();//调用show函数,显示原有信息
}
if ((fp = fopen("data", "wb")) == NULL)
{
printf("can not open\n");
return;
}
for (i = 0; i < m; i++)
fwrite(&stu[i], LEN, 1, fp);//向指定的磁盘文件写入信息
printf("please input(y/n)");
scanf("%s", ch);
if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
{
printf("please input per centum:");//输入百分比
printf("\nelective:");
scanf("%f", &Felec);
printf("\nexperiment:");
scanf("%f", &Fexpe);
printf("\nrequired course:");
scanf("%f", &Frequ);
}
while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
{
printf("number:");
scanf("%d", &stu[m].num);
for (i = 0; i < m; i++)
if (stu[i].num == stu[m].num)
{
printf("the number is existing ,press any to continue!");
_getch();
fclose(fp);
return;
}
printf("name:");
scanf("%s", stu[m].name); //此处可以不加地址符
printf("elective:");
scanf("%lf", &stu[m].elec);
printf("experiment:");
scanf("%lf", &stu[m].expe);
printf("required course:");
scanf("%lf", &stu[m].requ);
stu[m].sum = stu[m].elec*Felec + stu[m].expe*Fexpe + stu[m].requ*Frequ;
if (fwrite(&stu[m], LEN, 1, fp) != 1)
{
printf("can not save!");
_getch();
}
else
{
printf("%s saved!\n", stu[m].name);
m++;
}
printf("continue?(y/n):");
scanf("%s", ch);
}
fclose(fp);
printf("OK!\n");
}
void show()
{
FILE *fp;
int i, m = 0;
fp = fopen("data", "ab+");
while (!feof(fp)) //feof检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
{
if (fread(&stu[m], LEN, 1, fp) == 1)
m++;
}
fclose(fp);
printf("number name elective experiment required sum\t\n");
for (i = 0; i<m; i++)
{
printf(FORMAT, DATA);/*将信息按指定格式打印*/
}
}
void menu()/*自定义函数实现菜单功能*/
{
system("cls");//清理屏幕,头文件 #include <stdlib.h>
printf("\n\n\n\n\n");
printf("\t\t/---------------STUDENT---------------------/\n");
printf("\t\t/\t 0.exit /\n");
printf("\t\t/\t 1.input record /\n");
printf("\t\t/\t 2.search record /\n");
printf("\t\t/\t 3.delete record /\n");
printf("\t\t/\t 4.modify record /\n");
printf("\t\t/\t 5.insert record /\n");
printf("\t\t/\t 6.order /\n");
printf("\t\t/\t 7.number /\n");
printf("\t\t/-------------------------------------------/\n");
printf("\t\t\tchoose(0-7):");
}
错误 1 error C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch.
错误2 提示scanf等类似的函数已经不太安全,修改为_s结尾的安全版本。但是很多以前的程序可能还是使用不安全的版本,或者个别函数修改为安全版本较为复杂,需要改变参数个数等。那么下面给出去掉这种错误提示的几种常用办法。
方法一:
在VS中新建项目的时候去掉“安全开发生命周期(SDL)检查”即可将错误转变成警告,使得使用不安全版本也不影响编译和运行,如下图所示。
方法2:
在头文件包含的最前面,记住是最前面(在include的前面)加上:#define _CRT_SECURE_NO_WARNINGS这个宏定义即可。
(本项目采用该方法,并且需要注意当在程序中加上这个宏定义以后就不需要将函数改为加_的安全版本函数,不然编译没有错误但会一直运行失败。)
getchar()与getch()函数:
1.包含头文件不同
2.用法稍微不同
getchar();从键盘读取一个字符并输出,该函数的返回值是输入第一个字符的ASCII码;若用户输入的是一连串字符,函数直到用户输入回车时结束,输入的字符连同回车一起存入键盘缓冲区。若程序中有后继的getchar();函数,则直接从缓冲区逐个读取已输入的字符并输出,直到缓冲区为空时才重新读取用户的键盘输入。
getch();接受一个任意键的输入,不用按回车就返回。该函数的返回值是所输入字符的ASCII码,且该函数的输入不会自动显示在屏幕上,需要putchar();函数输出显示。getch();函数常用于中途暂停程序方便调试和查看。
3.函数功能基本相同