当前位置: 首页 > 知识库问答 >
问题:

c - C语言文件中的小数输出是0.0?

锺离自明
2023-09-04

include <stdio.h>

include <stdlib.h>

include <string.h>

define MEDICINE_FILE "medicine.txt" //药品文件名

typedef struct medicine
{

char drug_name[100]; //药品名int drug_number;     //药品编号int price;           //售价int num;             //药品剩余数量

} medicine;

struct med
{

medicine medicine_array[500]; //存放药品的数组int size;                     //数组已使用的大小

} med;

//与药品操作相关函数
void showMenu(); //打印菜单
void read_medicine_file(); //从文件中读入药品信息
void add_medicine(); //添加药品信息
void show_medicine(); //查看所有药品信息
void drug_name_del(); //按名称删除药品信息
void drug_number_revise(); //按编号修改药品信息
int drug_number_find(int num); //按编号查找药品信息,返回下标
void show_drug_number_find(); //输出查找到的药品信息
int drug_name_find(char *name); //按姓名查找药品信息,返回下标
void show_drug_name_find(); //按姓名查找药品信息,并将药品信息输出
void save_medicine(); //保存药品信息到文件

int main(int argc, char *argv[])
{

int select = 15;read_medicine_file(); //读取文件中药品的信息while (1){    showMenu(); //打印菜单    while (scanf("%d", &select) != 1 || select < 0 || select > 10)    {        printf("输入有误,请重新输入\n");        scanf("%*[^\n]%*c"); //将输入缓冲中所有数据丢弃    }    switch (select)    {    case 0:        //退出程序        exit(0);        break;    case 1:        //添加药品信息        add_medicine();        break;    case 2:        //查看所有药品信息        show_medicine();        break;    case 3:        //按名称删除药品信息        drug_name_del();        break;    case 4:        //按编号修改药品信息        drug_number_revise();        break;    case 5:        //按编号查找药品信息,并将药品信息输出        show_drug_number_find();        break;    case 6:        //按名称查找药品信息,并将药品信息输出        show_drug_name_find();        break;    }}return 0;

}

//打印菜单
void showMenu()
{

printf("-----------欢迎来到药房管理系统------------\n");printf("-------------------------------------------\n");printf("请输入你要选择的编号:\n");printf("1、添加药品信息\n");printf("2、查看所有药品信息\n");printf("3、按名称删除药品信息\n");printf("4、按编号修改药品信息\n");printf("5、按编号查找药品信息\n");printf("6、按姓名查找药品信息\n");printf("0、退出本系统\n");printf("-------------------------------------------\n");

}

//从文件中读入药品信息
void read_medicine_file()
{

FILE *fp = fopen(MEDICINE_FILE, "r");if (fp == NULL){    med.size = 0;    memset(&med.medicine_array, 0, sizeof(med.medicine_array));}else{    while (fscanf(fp, "%s %d %f %d", med.medicine_array[med.size].drug_name,                  &med.medicine_array[med.size].drug_number,                  &med.medicine_array[med.size].price,                  &med.medicine_array[med.size].num) != EOF)    {        med.size++;    }}fclose(fp);

}

//添加药品信息
void add_medicine()
{

int flag = 0;int num; //保存编号用于去重printf("请输入你要添加的药品的数量\n");int n, i;while (scanf("%d", &n) != 1 || n < 0){    printf("输入有误,请重新输入\n");    scanf("%*[^\n]%*c");}for (i = 0; i < n; ++i){    printf("第%d个药品的信息\n", i + 1);    printf("--------------------\n");    printf("请输入药品姓名\n");    scanf("%s", med.medicine_array[med.size].drug_name);    printf("请输入药品编号\n");    med.medicine_array[med.size].drug_number = 0;    do    {        while (scanf("%d", &num) != 1)        {            printf("输入有误,请重新输入!\n");            scanf("%*[^\n]%*c");        }        int ret = drug_number_find(num);        if (ret != -1)        {            printf("该编号已经存在,请重新输入\n");        }        else        {            med.medicine_array[med.size].drug_number = num;            break;        }    } while (1);    printf("请输入药品售价\n");    while (scanf("%f", &med.medicine_array[med.size].price) != 1)    {        printf("输入有误,请重新输入!\n");        scanf("%*[^\n]%*c");    }    printf("请输入药品数量\n");    while (scanf("%d", &med.medicine_array[med.size].num) != 1)    {        printf("输入有误,请重新输入!\n");        scanf("%*[^\n]%*c");    }    flag = 1;    med.size++;}if (flag == 1)    save_medicine(); //保存到文件

}

//查看所有药品信息
void show_medicine()
{

int i;for (i = 0; i < med.size; ++i){    printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[i].drug_name,           med.medicine_array[i].drug_number,           med.medicine_array[i].price,           med.medicine_array[i].num);}

}

//按姓名删除药品信息
void drug_name_del()
{

int flag = 0;int i, j, n;char name[100];printf("请输入你要删除的药品数量\n");while (scanf("%d", &n) != 1 || n < 0){    printf("输入有误,请重新输入\n");    scanf("%*[^\n]%*c");}for (i = 0; i < n; ++i){    printf("第%d个药品的姓名\n", i + 1);    printf("--------------------\n");    printf("请输入要删除的药品姓名\n");    scanf("%s", name);    int ret = drug_name_find(name);    if (ret != -1)    {        flag = 1;        printf("删除成功,删除的信息为\n");        printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,               med.medicine_array[ret].drug_number,               med.medicine_array[ret].price,               med.medicine_array[ret].num);        for (j = ret; j < med.size - 1; j++)        {            med.medicine_array[j] = med.medicine_array[j + 1];        }        med.size--;    }    else    {        printf("未找到该药品,删除失败\n");    }}if (flag == 1)    save_medicine();

}

//按编号修改药品信息
void drug_number_revise()
{

int flag = 0;int i, j, n, number; //保存要修改的编号int num;             //保存新编号,用于去重printf("请输入你要修改的药品数量\n");while (scanf("%d", &n) != 1 || n < 0){    printf("输入有误,请重新输入\n");    scanf("%*[^\n]%*c");}for (i = 0; i < n; ++i){    printf("第%d个药品的编号\n", i + 1);    printf("--------------------\n");    printf("请输入要修改的药品编号\n");    while (scanf("%d", &number) != 1)    {        printf("输入有误,请重新输入\n");        scanf("%*[^\n]%*c");    }    int ret = drug_number_find(number);    if (ret != -1)    {        flag = 1;        printf("找到该编号的药品,该药品信息为\n");        printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,               med.medicine_array[ret].drug_number,               med.medicine_array[ret].price,               med.medicine_array[ret].num);        printf("请输入新信息\n");        printf("请输入药品新姓名\n");        scanf("%s", med.medicine_array[ret].drug_name);        printf("请输入药品编号\n");        med.medicine_array[ret].drug_number = -1; //将该药品编号改为-1防止新输入的编号和当前编号相同,导致无法成功输入该编号        do        {            while (scanf("%d", &num) != 1)            {                printf("输入有误,请重新输入!\n");                scanf("%*[^\n]%*c");            }            int res = drug_number_find(num);            if (res != -1)            {                printf("该编号已经存在,请重新输入\n");            }            else            {                med.medicine_array[ret].drug_number = num;                break;            }        } while (1);        printf("请输入药品售价\n");        while (scanf("%f", &med.medicine_array[ret].price) != 1)        {            printf("输入有误,请重新输入!\n");            scanf("%*[^\n]%*c");        }        printf("请输入药品数量\n");        while (scanf("%d", &med.medicine_array[ret].num) != 1)        {            printf("输入有误,请重新输入!\n");            scanf("%*[^\n]%*c");        }        printf("修改成功!\n");    }    else    {        printf("未找到该编号的药品\n");    }}if (flag == 1)    save_medicine();

}

//按编号查找药品信息,返回下标
int drug_number_find(int number)
{

int i;for (i = 0; i < med.size; ++i){    if (number == med.medicine_array[i].drug_number)    {        return i;    }}return -1;

}

//输出查找到的药品信息
void show_drug_number_find()
{

int number;printf("请输入要查找的编号编号\n");while (scanf("%d", &number) != 1){    printf("输入有误,请重新输入\n");    scanf("%*[^\n]%*c");}int ret = drug_number_find(number);if (ret == -1){    printf("未找到\n");}else{    printf("找到了,信息为\n");    printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,           med.medicine_array[ret].drug_number,           med.medicine_array[ret].price,           med.medicine_array[ret].num);}

}

//按姓名查找药品信息
int drug_name_find(char *name)
{

int i;for (i = 0; i < med.size; ++i){    if (strcmp(name, med.medicine_array[i].drug_name) == 0)        return i;}return -1;

}

//按姓名查找药品信息,并将药品信息输出
void show_drug_name_find()
{

char name[100];printf("请输入你要查找的药品姓名\n");scanf("%s", name);int ret = drug_name_find(name);if (ret == -1){    printf("未找到\n");}else{    printf("找到了,药品信息为\n");    printf("%s\t\t\t%d\t\t\t%.1f\t\t\t%d\n", med.medicine_array[ret].drug_name,           med.medicine_array[ret].drug_number,           med.medicine_array[ret].price,           med.medicine_array[ret].num);}

}

//保存药品信息到文件
void save_medicine()
{

int i;FILE *fp = fopen(MEDICINE_FILE, "w");if (fp == NULL){    return;}for (i = 0; i < med.size; ++i){    fprintf(fp, "%s %d %f %d\n", med.medicine_array[i].drug_name,            med.medicine_array[i].drug_number,            med.medicine_array[i].price,            med.medicine_array[i].num);}fclose(fp);

}
文件
999感冒灵 1 14.9 200
氯雷他定片 2 65.0 150
肠炎宁片 3 28.0 150
布洛芬胶囊 4 29.8 230
板蓝根颗粒 5 23.8 300
输出的为什么是这样子的
999感冒灵 1 0.0 200
氯雷他定片 2 0.0 150
肠炎宁片 3 0.0 150
布洛芬胶囊 4 0.0 230
板蓝根颗粒 5 0.0 300

共有1个答案

司英彦
2023-09-04

因为你用的 int price;后面又用%f输出
换成float price;就好了

 类似资料:
  • 主要内容:文件流我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。 在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据; 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数

  • 主要内容:无符号数的输出在数学中,数字有正负之分。在C语言中也是一样,short、int、long 都可以带上正负号,例如: 如果不带正负号,默认就是正数。 符号也是数字的一部分,也要在内存中体现出来。符号只有正负两种情况,用1位(Bit)就足以表示; C语言规定,把内存的最高位作为符号位。以 int 为例,它占用 32 位的内存,0~30 位表示数值,31 位表示正负号。如下图所示: 在编程语言中,计数往往是从0开始,

  • 输入就是将程序外部的数据输入到程序内部,输出就是将程序内部运行的结果等内容从程序内部输出到显示器,打印机或者存放到文件中。 编程语言中的输入输出担负着程序与用户的交互工作。 1. 标准输入输出 C 语言中的标准输入输出包含 3 部分。标准输入,标准输出,标准错误输出。 表中列举了标准输入输出和与之关联的物理设备。 输入输出 设备 标准输入 键盘 标准输出 显示器屏幕 标准错误输出 显示器屏幕 标准

  • 主要内容:小数的输出,数字的后缀,小数和整数相互赋值小数分为整数部分和小数部分,它们由点号 分隔,例如 0.0、75.0、4.023、0.27、-937.198 -0.27 等都是合法的小数,这是最常见的小数形式,我们将它称为 十进制形式。 此外,小数也可以采用 指数形式,例如 7.25×10 2、0.0368×10 5、100.22×10 -2、-27.36×10 -3 等。任何小数都可以用指数形式来表示。 C语言同时支持以上两种形式的小数。但是

  • 作为 C 语言中主力的标准输出函数, printf 为我们提供了丰富的格式选项。 1. 格式参数 首先列举一下 printf 全部的参数: % [标志位] [显示占位宽度] [精度] [数字长度] 说明符 这里面用括号包裹的内容为可选参数,我们分项来介绍上面的各项参数,首先从最常用的说明符开始介绍: 说明符 参数含义 输出示例 o 无符号八进制数 410 x 无符号十六进制数 7ff X 无符号

  • 本文向大家介绍Objective-C语言NSLog输出格式,包括了Objective-C语言NSLog输出格式的使用技巧和注意事项,需要的朋友参考一下 示例 NSLog在Console.app中查看时,通过调用打印的消息具有以下格式: 日期 时间 程序名称 进程ID 线程ID 信息 2016-07-16 08:58:04.681 test [46259 : 1244773] NSLog messa