用C语言解决一个实际问题(不要太长)

不好意思,随便一个问题就可以了,我们老师布置的作业,让自由发挥~~~听说是期末考试题,谢谢各位大虾~~~~~也可以在书上找个,但别是谭浩强那本就行~~呵呵
~~~~~~~~~程序太长了,能不能再短一点呀~~~~~~~~

约瑟夫环(很有名的数学问题)

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
{
/* p为当前结点 r为辅助结点,指向p的前驱结点 list为头节点*/
LinkList p,r,list;

/*建立循环链表*/
for(int i=0,i<n,i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=i;
if(list==NULL)
list=p;
else
r->link=p;
r=p;
}
p>link=list; /*使链表循环起来*/
p=list; /*使p指向头节点*/

/*把当前指针移动到第一个报数的人*/
for(i=0;i<k;i++)
{
r=p;
p=p->link;
}

/*循环地删除队列结点*/
while(p->link!=p)
{
for(i=0;i<m;i++)
{
r=p;
p=p->link;
}
r->link=p->link;
printf("被删除的元素:%4d ",p->data);
free(p);
p=r->link;
}
printf("\n最后被删除的元素是:%4d",P->data);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-01-13
给你一个dev c++的sample:
工程包含两个文件,main.c和main.h
main.c代码:
#include <windows.h>
#pragma hdrstop

#include "Main.h"

static char g_szClassName[] = "MyWindowClass";
static HINSTANCE g_hInst = NULL;

#define IDC_MAIN_TEXT 1001

BOOL LoadFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;

hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
if(dwFileSize != 0xFFFFFFFF)
{
LPSTR pszFileText;
pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
if(pszFileText != NULL)
{
DWORD dwRead;
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
{
pszFileText[dwFileSize] = 0; // Null terminator
if(SetWindowText(hEdit, pszFileText))
bSuccess = TRUE; // It worked!
}
GlobalFree(pszFileText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}

BOOL SaveFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;

hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwTextLength;
dwTextLength = GetWindowTextLength(hEdit);
if(dwTextLength > 0)// No need to bother if there's no text.
{
LPSTR pszText;
pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
if(pszText != NULL)
{
if(GetWindowText(hEdit, pszText, dwTextLength + 1))
{
DWORD dwWritten;
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
bSuccess = TRUE;
}
GlobalFree(pszText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}

BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)
{
OPENFILENAME ofn;
char szFileName[MAX_PATH];

ZeroMemory(&ofn, sizeof(ofn));
szFileName[0] = 0;

ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = "txt";

if(bSave)
{
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT;

if(GetSaveFileName(&ofn))
{
if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "Save file failed.", "Error",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
else
{
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "Load of file failed.", "Error",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
return TRUE;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_CREATE:
CreateWindow("EDIT", "",
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |
ES_WANTRETURN,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL);

SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,
(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
break;
case WM_SIZE:
if(wParam != SIZE_MINIMIZED)
MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),
HIWORD(lParam), TRUE);
break;
case WM_SETFOCUS:
SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case CM_FILE_OPEN:
DoFileOpenSave(hwnd, FALSE);
break;
case CM_FILE_SAVEAS:
DoFileOpenSave(hwnd, TRUE);
break;
case CM_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case CM_ABOUT:
MessageBox (NULL, "File Editor for Windows !\n Using the Win32 API" , "About...", 0);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX WndClass;
HWND hwnd;
MSG Msg;

g_hInst = hInstance;

WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = 0;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = g_hInst;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WndClass.lpszMenuName = "MAINMENU";
WndClass.lpszClassName = g_szClassName;
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if(!RegisterClassEx(&WndClass))
{
MessageBox(0, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}

hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"A File Program",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 320, 240,
NULL, NULL, g_hInst, NULL);

if(hwnd == NULL)
{
MessageBox(0, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}

ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);

while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}

main.h代码:

#define CM_FILE_SAVEAS 9072
#define CM_FILE_EXIT 9071
#define CM_FILE_OPEN 9070
#define CM_ABOUT 9069
是一个文件编辑器。
第2个回答  2007-01-13
模拟投票选举程序,其要求实现:
①对选举的投票,判定是否有候选人,有则进行相应的统计动作,否则弃掉
②输出候选人的姓名和得票数
③挑出获胜人员的名单和票数
一个有可以投几票(究竟投几票自己定),但只能把一票投给一个人,不能投两票,就是说投一票以上给一个人都只能算一票。如果最后的获胜者有两个或两个以上票数相同,则进行新一轮的投票。

#include"stdio.h"
#include"math.h"
main()
{int a,b,c,d,e,f,g,h,i,j,x,y,z;
a=b=c=d=e=f=0;
for(i=0;i<3;i++) //以下是投票的全过程,“i<3”也就是说一共有3个人投票,可以根据投票人数加以修改
{
printf("侯选人名单为:");
printf("\n");
printf("1号a, 2号b, 3号c, 4号d, 5号e, 6号f"); //a,b,c,d,e,f分别代表侯选人的名字
printf("\n");
printf("请输入你要选择的人的号码,一次选一个人,您可以选3次,但不能重复");
printf("\n");
printf("您一共有三票,请投第一票"); //投票开始
scanf("%d",&x);
printf("请投第二票");
scanf("%d",&y);
printf("请投第三票");
scanf("%d",&z);
if(x==1) //以下为:一个人可以投几票(究竟投几票自己定),但只能把一票投给一个人,不能投两票,就是说投一票以上给一个人都只能算一票
a+=1;
else if(x==2)
b+=1;
else if(x==3)
c+=1;
else if(x==4)
d+=1;
else if(x==5)
e+=1;
else if(x==6)
f+=1;
if(y==x)
g+=1;
else
{
if(y==1)
a+=1;
else if(y==2)
b+=1;
else if(y==3)
c+=1;
else if(y==4)
d+=1;
else if(y==5)
e+=1;
else if(y==6)
f+=1;
}
if(z==x)
g+=1;
else if(z==y)
g+=1;
else
{
if(z==1)
a+=1;
else if(z==2)
b+=1;
else if(z==3)
c+=1;
else if(z==4)
d+=1;
else if(z==5)
e+=1;
else if(z==6)
f+=1;
printf("a的票数:%d\nb的票数:%d\nc的票数:%d\nd的票数:%d\ne的票数:%d\nf的票数:%d\n",a,b,c,d,e,f);
printf("\n");
}
}
h=a; //排序 h代表胜出者的票数
if(b>h)
h=b;
if(c>h)
h=c;
if(d>h)
h=d;
if(e>h)
h=e;
if(f>h)
h=f;
printf("\n");
if(h==a) // 找出胜出者
{printf("胜出者为a,所得票数为:%d\n",a);
j=1;}
if(h==b)
{printf("胜出者为b,所得票数为:%d\n",b);
j+=1;}
if(h==c)
{printf("胜出者为c,所得票数为:%d\n",c);
j+=1;}
if(h==d)
{printf("胜出者为d,所得票数为:%d\n",d);
j+=1;}
if(h==e)
{printf("胜出者为e,所得票数为:%d\n",e);
j+=1;}
if(h==f)
{printf("胜出者为f,所得票数为:%d\n",f);
j+=1;}
if(j>1)
printf("因为胜出者不是一个人,所以要从新选举!");
printf("\n");
}本回答被提问者采纳
第3个回答  2007-01-13
问题呢?00000000000000000000
第4个回答  2007-01-13
提个问题出来吧,盲狙我可不会^^

用C语言解决一个实际问题(不要太长)
约瑟夫环(很有名的数学问题)已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k...

求c++语言解决实际问题~~~很急的
1解决一个实际问题。题目学生自拟,要互不相同。要求用到:盘文件输入输出、数组、循环、选择、除主函数外至少要用到3个自定义函数。2〉要有项目简介、运行示例和程序清单,程序要有适当的注释。 请发到邮箱 951651739@qq.com 展开  我来答 1个回答 #热议# 【答题得新春福袋】你的花式拜年祝福有哪些?young29l...

用C语言的步骤编辑1*2*3*...1000求大神解答!
include <stdlib.h> main() { int a=1000; int i=0; double ii=1; for(i=2;i<100;i++) { ii = ii * i ; printf("%f\\n",ii); } getch();}

用C语言写一个小程序(一个小功能就可以了),要求:100行代码左右,不要太...
一定要用C语言写哦,100行代码,一个小功能就可以(也不要太简单,上次写了个打印图形什么,被老师骂死了,5555),因为期末课程设计,不能和其他同学相同,尽量自己写一个好吗,谢谢~后天就要交了~~无限感激~~帮帮忙~~~不要那么长~ - -! 100行左右~~帮帮忙啊~~ 展开  我来答 3个回答 #热议# 在你身边,你...

用c语言一行一行的打印出心型图像,要求这个心形一行一行的显示出来,但...
char c[2];printf(" *** ***\\n");Sleep(200);printf(" *** ***\\n");Sleep(200);printf(" *** ***\\n");Sleep(200);printf(" ***\\n");Sleep(200);printf(" ***\\n");Sleep(200);printf(" ***\\n");Sleep(200);printf(" ...

较复杂的c语言程序设计源代码
void yinc(int x=1,int y=0) \/\/隐藏光标的函数 { CONSOLE_CURSOR_INFO gb={x,y}; \/\/y设为0即隐藏 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &gb);} void csh( ) \/\/初始化函数 { int i;Color(7);gtxy(zlx,zly); printf("╔"); gtxy(zlx+W-2,zly); ...

c语言实验报告该怎么写?
1、加深对课堂讲授内容的'理解 课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。

c语言编程问题!!
printf("%c",X[j]); } printf("\\n"); } \/* 一般把其它进制的数转换为十进制的数较容易,有一个现成的乘法公式供我们使用。 但把十进制的数转换为其它进制的数,则要用到除法。这题的思路是比较清晰的,应该是 解决这类问题的典型算法了。 而对于把十进制的数转换为二进制的数来说,除了用到除法外,还...

C语言编程题
\/\/输入15个学生的信息void insertTest(STU *stu);\/\/测试,用随机数代替输入,我懒得输入那么多成绩,你要手输,调用insertSTU替换该函数void printfSTU(STU *stu);\/\/按输入顺序打印15名学生7模块成绩 及 每个模块前三名的成绩int main(){ STU stu[stuNum];\/\/定义15个学生 \/\/ int i,...

C语言问题 求助
include <stdio.h> void main(){ double a=10,b=1,sum[2]={0,0}; int i;for (i=0;i<30;i++) { sum[0]+=a; sum[1]+=b; b*=2; } printf("陌生人共给了富翁%.0f万元\\n",sum[0]); printf("富翁共给了陌生人%.6f万元\\n",sum[1]\/1000000.0);} 结果:...

相似回答