#include
int main(void)
{
/*********Begin*********/
int n,s,i,l;
for(n=2;n<=1000;n++)
{
s=1;
for(i=2;i<=n-1;i++)
{
l=n%i;
if(l==0)
s=s+i;
}
}
if(s=n)
printf("%d\n",n);
/*********End**********/
return 0;
}
s == n不是s=n
判断完一个数是否是完数之后,没有使用大括号将下面的输出语句包含起来,导致只有最后一个数的结果进行了输出
修改以后的代码
#include<stdio.h>
int main(void)
{
int n, s, i, l;
for (n = 2; n <= 1000; n++)
{
s = 1;
for (i = 2; i <= n - 1; i++)
{
l = n % i;
if (l == 0)
s = s + i;
}
if (s == n)
{
printf("%d\n", n);
}
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:如下是它的结构图
接下来我们从外到内进行分析:这是项目布局
这里面有两种打印方式,一种是stdout,一种是socket网络打印,而debug_manager.c就是用来管理它两的,是不是发现这样写很容易扩展呢,自己还可以添加一个localog.c(日志)。
这与平常最大的不同是有debug_manager.c文件,我们对它进行分析分析。
typedef struct DebugOpr {
char *name; /*打印类型 stdout、netprint*/
int isCanUse;
int (*DebugInit)(void); /* 调试模块的初始化函数 */
int (*DebugExit)(void); /* 退出函数 */
int (*DebugPrint)(char *strData); /* 输出函数 */
struct DebugOpr *ptNext;
}T_DebugOpr, *PT_DebugOpr;
stdout.c文件
static int StdoutDebugPrint(char *strData)
{
/* 直接把输出信息用printf打印出来 */
printf("%s", strData);
return strlen(strData);
}
static T_DebugOpr g_tStdoutDbgOpr = {
.name = "stdout",
.isCanUse = 1, /* 1表示将使用它来输出调试信息 */
.DebugPrint = StdoutDebugPrint, /* 打印函数 */
};
int StdoutInit(void)
{
return RegisterDebugOpr(&g_tStdoutDbgOpr);
}
netprint.c文件
static int NetDbgInit(void)
{
/* socket初始化 */
int iRet;
g_iSocketServer = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == g_iSocketServer)
{
printf("socket error!\n");
return -1;
}
g_tSocketServerAddr.sin_family = AF_INET;
g_tSocketServerAddr.sin_port = htons(SERVER_PORT); /* host to net, short */
g_tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
memset(g_tSocketServerAddr.sin_zero, 0, 8);
iRet = bind(g_iSocketServer, (const struct sockaddr *)&g_tSocketServerAddr, sizeof(struct sockaddr));
if (-1 == iRet)
{
printf("bind error!\n");
return -1;
}
g_pcNetPrintBuf = malloc(PRINT_BUF_SIZE);
if (NULL == g_pcNetPrintBuf)
{
close(g_iSocketServer);
return -1;
}
/* 创建netprint发送线程: 它用来发送打印信息给客户端 */
pthread_create(&g_tSendTreadID, NULL, NetDbgSendTreadFunction, NULL);
/* 创建netprint接收线否: 用来接收控制信息,比如修改打印级别,打开/关闭打印 */
pthread_create(&g_tRecvTreadID, NULL, NetDbgRecvTreadFunction, NULL);
return 0;
}
static int NetDbgExit(void)
{
/* 关闭socket,... */
close(g_iSocketServer);
free(g_pcNetPrintBuf);
return 0;
}
static int NetDbgPrint(char *strData)
{
/* 把数据放入环形缓冲区 */
int i;
for (i = 0; i < strlen(strData); i++)
{
if (0 != PutData(strData[i]))
break;
}
/* 如果已经有客户端连接了, 就把数据通过网络发送给客户端 */
/* 唤醒netprint的发送线程 */
pthread_mutex_lock(&g_tNetDbgSendMutex);
pthread_cond_signal(&g_tNetDbgSendConVar);
pthread_mutex_unlock(&g_tNetDbgSendMutex);
return i;
}
static T_DebugOpr g_tNetDbgOpr = {
.name = "netprint",
.isCanUse = 1,
.DebugInit = NetDbgInit,
.DebugExit = NetDbgExit,
.DebugPrint = NetDbgPrint,
};
int NetPrintInit(void)
{
return RegisterDebugOpr(&g_tNetDbgOpr);
}