本文目录一览:
杂志订阅管理的c语言
#include<stdio.h>
#include "string.h"
#include "stdlib.h"
#include "conio.h"
#define max 20
struct magazine {
char name[11];
char sex[6];
char addr[11];
char phone_number[12];
char unit_price[5];
char amount[4];
char time_limit[11];
} order[max];
void save(int n);
int load_record();
void search();
void printf_n(int n);
void printf_one(int i);
void input(int i);
void statistic();
void add();
void menu();
void main() {
FILE *fp;
fp = fopen("record.txt", "w"); /*在C:\Documents and Settings\Administrator里建立一个"record.txt"记事本*/
fclose(fp);
menu();
}
void menu() {
int w, n;
do {
printf("\n");
printf("\t\t* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\t\t \n");
printf("\t\t \n");
printf("\t\t 欢迎来到杂志订阅系统! \n");
printf("\t\t \n");
printf("\t\t \n");
printf("\t\t* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\n\n\t\t *********************************************\n\n");
printf("\t\t 1:add_new_subscriber\n");
printf("\t\t 2:browse\n");
printf("\t\t 3:statistic\n");
printf("\t\t 4:exit\n\n");
printf("\t\t *********************************************\n\n");
printf(" Choice your number(1-4):[ ]\b\b");
scanf("%d", &n);
if (n < 1 || n > 4) w = 1;
else w = 0;
} while (w == 1);
switch(n) {
case 1: add(); break; /*增加新订户记录*/
case 2: search(); break; /*查找过期的订户记录并删除*/
case 3: statistic(); break; /*统计*/
case 4: break; /*退出*/
}
}
void add() {
int t, i, m;
system("cls");
t = load_record();
printf("您需要添加多少用户的信息?\n");
printf("输入号码:[ ]\b\b\b");
scanf("%d", &m);
for(i = 0; i < m; i++) {
printf("\n输入 %dth subscriber record.\n", i+1);
input(t+i); /*调用输入函数*/
}
save(t+m); /*调用保存函数 保存t+m组数据*/
system("cls"); /*******清屏*********/
menu(); /*返回登陆界面*/
}
void input(int i) {
printf("请输入:\n姓名 性别 地址 电话 杂志单价 数量 订阅期限\n");
scanf("%s%s%s%s%s%s%s", order[i].name, order[i].sex, order[i].addr, order[i].phone_number, order[i].unit_price, order[i].amount, order[i].time_limit);
}
void statistic() {
int t;
t = load_record();
printf("订阅者的数量[%d]\b\b\b", t);
printf_n(t);
printf("\n\n\n按任意键返回...\n\n");
getch();
menu();
}
void printf_one(int i) {
printf("%-10s %-5s %-10s %-11s %-4s %-3s %-10s\n\n", order[i].name, order[i].sex, order[i].addr, order[i].phone_number, order[i].unit_price, order[i].amount, order[i].time_limit);
}
void printf_n(int n) {
int j;
system("cls"); /**********清屏************/
printf("姓名 性别 地址 电话号码 价格 数量 时间期限\n\n");
for(j = 0; j < n; j++) {
if((j+1) % 10 == 0) {
printf("\n\n按任意键继续 ...");
getch();
puts("\n\n");
}
printf_one(j); /*调用显示一个仪器记录的函数*/
}
}
void search() {
FILE *fp;
char date[11], str[2];
int t, i, sum = 0;
t = load_record();
system("cls");
printf("请输入日期:[ ]\b\b\b\b\b\b\b\b\b\b\b");
scanf("%s", date);
printf("\n");
if((fp = fopen("record.txt", "w")) == NULL) {
printf("\n无法打开文件\n");
exit(0);
}
system("cls");
printf("\n");
for(i = 0; i < t; i++) {
if(strcmp(order[i].time_limit, date) > 0) {
sum++;
printf("\n");
printf_one(i);
printf("\n\n记录已过期!");
printf("\n\n你想要删除此条信息吗?('Y'or'N'):[ ]\b\b");
scanf("%s", str);
if(strcmp(str, "Y") == 0 || strcmp(str, "y") == 0)
continue;
}
fwrite(&order[i], sizeof(struct magazine), 1, fp);
}
fclose(fp);
if(sum == 0) {
printf("***************************************************\n\n");
printf("很遗憾! 无法找到您想要的条件\n\n");
printf("***************************************************\n\n");
}
printf("\n\n\n按任意键返回前一步...\n");
getch();
menu();
}
int load_record() {
FILE *fp;
int i;
if((fp = fopen("record.txt", "r")) == NULL) {
printf("\n无法打开文件\n");
exit(0);
}
for(i = 0; !feof(fp); i++)
fread(&order[i], sizeof(struct magazine), 1, fp);
fclose(fp);
return(i - 1);
}
void save(int n) {
FILE *fp;
int i;
fp = fopen("record.txt", "w");
if(fp == NULL) {
printf("\n无法打开文件\n");
exit(0);
}
for(i = 0; i < n; i++) {
fwrite(&order[i], sizeof(struct magazine), 1, fp);
}
fclose(fp);
}
关于c语言动态指针相关问题?
N应该是一个宏定义的常量
#define N 111 //将这一句写在结构体的前面;
N就代表111了,当然也可以是其他数;
关于mosquitto怎么用c语言实现消息的订阅和发送(mqtt)
- 目标:测试Mosquitto使用MQTT协议发消息的相关性能指标,包含发送速度,并发负载能力,资源占用,消息到达率。
- MQTT协议简介:
- 建立长连接。客户端发起请求和服务端建立长连接,建立成功后,服务端会返回ACK(CONNACK)
- 客户端订阅:客户端发起订阅,订阅成功后,服务端会返回ACK(SUBACK)
- 发消息:发布者会给服务端发消息,服务端在把消息给合适的客户端。
- Qos=0(服务质量):客户端消息收到后,不会发出ACK给服务端(PUBACK)。
- Qos=1:服务端会发ACK给发布者,客户端收到消息后会发ACK给服务端。
- 取消订阅:客户端发起取消订阅,服务端返回ACK(UNSUBACK)
- Pingreq/Pingresp:客户端和服务端会保持心跳。
- 存在问题:
- 如何模拟出40W的用户
- 如何长连接,订阅,发消息,取消订阅,Pingreq行为如何实现。
- python开源库 Mosquitto.py,解决所有问题
- 模拟40W用户
- 可以使用虚拟机和Mosquitto.py实现,具体为:一般一台虚拟机最多是6W+的模拟数据(需要修改句柄数,我使用5W),方法是Client_id可以简单的做出5W个来,然后调用Mosquitto里面的connect方法,建立长连接。准备8台虚拟机就可以实现40W客户端的模拟
- 行为的模拟
- 订阅:Mosquitto.subscribe / 发消息:Mosquitto.publish / 取消订阅:Mosquitto.unsubscribe。简单一句话 Mosquitto库实现所有的行为.
- 模拟40W用户
- 指标:发送速度,到达率,并发负载,资源占用。
- 发送速度:服务端日志记录,分析解决
- 到达率:1.客户端记录下收到消息,分析计算。2.计算服务端收到的PUBACK(客户端收到消息返回的ACK),进行计算
- 并发负载:5W 用户不断增加,注意观察服务端的负载情况。
- 资源占用:其实主要是cpu/mem/带宽:cpu多核的话需要观察top命令下的_id字段, mem可以观察free -h命令的剩余mem, 带宽可以使用mpstat进行观察
- 可以预见问题:
- 模拟客户端的虚拟机需要修改句柄数才能支持5W的客户端模拟数量
- 要先吃透MQTT协议的流程,吃透了进行测试会非常的方便
- Clear session,设置为true则不为客户端保留消息,设置为false保留消息。其实就是客户端离线后在连接上可以收到之前推出的消息。
C语言课程设计题目:杂志订阅管理软件
你呀,干点正事吧,整天到晚的啊,你整天到晚的混得一点正型也没有,你看看人家,开车的买大楼房,你看看你,你一无所有,你脚下的地在抖,你身边的水在流。