主题:[原创]没事一起写程序吧(入门)
roye [专家分:20] 发布于 2008-07-22 22:41:00
没事一起写程序吧(入门)
题目::“入门必做的题”http://www.programfan.com/club/post-157289.html
编程环境:DEV_CPP
[size=4][color=FF0000][b]提建议者或参与者必加分[/b][/color][/size]
[size=3][b][color=FF0000]已完成题目:1、2、3、4[/color][/b][/size]
最后更新于:2008-07-23 22:48:00
回复列表 (共31个回复)
21 楼
zhgzgx [专家分:1000] 发布于 2008-07-25 09:13:00
大清早的发个昨晚做的题~~~~~~
LZ怎么不做题了啊~~~~~~~~~~~~~
7. 读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 A 开头的
单词与以 N 结尾的单词,用头尾交换的办法予以置换。
[code=c]
#include <stdio.h>
#include <stdlib.h>
#define MAX_STRING_LENGTH 100
#define ERROE_OVERFLOW 0
#define IsLetter(a) ((((a) >= 'a') && ((a) <= 'z')) || (((a) >= 'A') && ((a) <= 'Z')))
void exchange(char *start, char *p)
{
*start = *p ^ *start;
*p = *p ^ *start;
*start = *p ^ *start;
}
void Convert(char *start, char *end)
{
char *p;
int flag = 0;
while(*start == 32)
{
start++;
end++;
}
while (*end != '%')
{
while((*end != 32) && (*end != '%') && (*end != 13) && (*end != 9) && (*end != 10))
{
if (!IsLetter(*end))
{
flag = 1;
}
end++;
}
if (flag == 0)
{
p = end - 1;
if ((*start == 'a') || (*start == 'A') || (*p == 'n') || (*p == 'N'))
{
while((p != start) && (start + 1 != p))
{
exchange(p, start);
start++;
p--;
}
if (start + 1 == p)
{
exchange(p, start);
}
}
if (*end == '%')
break;
end++;
start = end;
}
else
{
end++;
start = end;
}
flag = 0;
}
}
int main()
{
char *start, *end;
char *string;
if ((string = (char *)malloc(sizeof(char) * (MAX_STRING_LENGTH + 1))) == NULL)
{
printf("ERROE_OVERFLOW!\n");
return ERROE_OVERFLOW;
}
end = string;
start = string;
while((*string = getchar()) != '%')
{
string++;
}
string = start;
Convert(start, end);
for(;*string != '%';string++)
{
putchar(*string);
}
return 0;
}
[/code]
22 楼
zhgzgx [专家分:1000] 发布于 2008-07-29 12:09:00
看来LZ是不做题了,我自己做吧~~~~~~
8. 输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进
制加法运算,再将结果化为十进制数输出。
[code=c]
#include <stdio.h>
#include <math.h>
//将十进制转换成二进制,并存放到相应的数组中
void convert(int n,int *arr_n)
{
unsigned int i;
int j = 0;
for (i=0x80000000; i; i>>=1)
{
arr_n[j] = ((n & i) == i);
j++;
}
}
//求存放在数组中的两个二进制的和
void add(int *arr_x, int *arr_y, int *sum_x_y)
{
int i, flag = 0; //falg 为进位标志
for (i = 31; i >=0; i--)
{
if (flag == 0)
{
if ((arr_x[i] + arr_y[i]) <=1)
{
sum_x_y[i] = arr_x[i] + arr_y[i];
flag = 0;
}
else
{
sum_x_y[i] = 0;
flag = 1;
}
}
else
{
if ((arr_x[i] + arr_y[i]) == 0)
{
sum_x_y[i] = 1;
flag = 0;
}
else if ((arr_x[i] + arr_y[i]) == 1)
{
sum_x_y[i] = 0;
flag = 1;
}
else
{
sum_x_y[i] = 1;
flag = 1;
}
}
}
}
int main()
{
int x, y, i=0;
int arr_x[32], arr_y[32], sum_x_y[32];
double sum_dec = 0;
printf("Please input the positive number(x and y):\n");
scanf("%d%d",&x,&y);
if (x < 0 || y < 0)
{
printf("Input Error!\n");
printf("Please input the positive number(x and y):");
scanf("%d%d",&x,&y);
}
convert(x, arr_x);
convert(y, arr_y);
printf("arr_x :");
for(i = 0; i< 32;i++)
{
printf("%d",arr_x[i]);
}
printf("\narr_y :");
for(i = 0; i < 32;i++)
{
printf("%d",arr_y[i]);
}
add(arr_x, arr_y, sum_x_y);
printf("\nsum_x_y:");
for(i = 0; i< 32;i++)
{
printf("%d",sum_x_y[i]);
sum_dec += pow(2, 31 - i) * sum_x_y[i];
}
printf("\nsum_dec: %f",sum_dec);
printf("\n");
return 0;
}
[/code]
23 楼
ppc [专家分:3090] 发布于 2008-07-29 12:26:00
[quote]
2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
[code=c]
#include<stdio.h>
#include<conio.h>
int main(void)
{
int a,b,c,d,e;
for(a=0;a<2;a++)//1:present,0:absent
for(b=0;b<2;b++)
for(c=0;c<2;c++)
for(d=0;d<2;d++)
for(e=0;e<2;e++)
{
if((a+b==2||a==0)&&b+c==1&&(c+d==2||c+d==0)&&d+e>0&&(e+a+d==3||e==0))
{
printf("a=%d;b=%d;c=%d;d=%d;e=%d\n",a,b,c,d,e);
getch();
}
}
}
[/code]
输出结果:a=0;b=0;c=1;d=1;e=1[/quote]
这个结果明显有问题。
如果e参加那么a和d也都参加。这二个条件明显不满足。
24 楼
ppc [专家分:3090] 发布于 2008-07-29 12:35:00
是的,我觉得这个拉丁方阵数量实在太多了。
25 楼
zhgzgx [专家分:1000] 发布于 2008-07-29 13:42:00
9. 四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴
数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,
每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有
多少根火柴? 编程解决此问题。
本题用倒推法,根据每次输的人不同,有不同的值。
在选择哪位输了比赛时请用A,B,C,D大写,小写的话会提示重新输入。
[code=c]
#include <stdio.h>
#define A num[0][0]
#define B num[0][1]
#define C num[0][2]
#define D num[0][3]
int main()
{
int i = 4;
char ch;
int num[2][4] ={{16,16,16,16},{0}};
while(i>=1)
{
printf("Do you think who lose the %dth game:",i);
ch = getchar();
getchar();
switch (ch)
{
case 'A':
if (num[1][0] == 0)
{
A += (B + C + D) / 2;
B /= 2;
C /= 2;
D /= 2;
i--;
num[1][0] = 1;
}
else
{
printf("everyone lose only one time!please input repeatly!\n");
}
break;
case 'B':
if (num[1][1] == 0)
{
B += (A + C + D) / 2;
A /= 2;
C /= 2;
D /= 2;
i--;
num[1][1] = 1;
}
else
{
printf("everyone lose only one time!please input repeatly!\n");
}
break;
case 'C':
if (num[1][2] == 0)
{
C += (B + A + D) / 2;
B /= 2;
A /= 2;
D /= 2;
i--;
num[1][2] = 1;
}
else
{
printf("everyone lose only one time!please input repeatly!\n");
}
break;
case 'D':
if (num[1][3] == 0)
{
D += (B + C + A) / 2;
B /= 2;
C /= 2;
A /= 2;
i--;
num[1][3] = 1;
}
else
{
printf("everyone lose only one time!please input repeatly!\n");
}
break;
default:
printf("Inputting is invalid!\n");
}
}
printf("\nThe origin values of A , B, C, D are:\n");
printf("A B C D\n");
for (i = 0; i < N; i++)
{
printf("%-4d",num[0][i]);
}
return 0;
}
[/code]
26 楼
Toushiro [专家分:340] 发布于 2008-07-30 01:59:00
除了版主,基本都是高手
27 楼
xinshou3 [专家分:0] 发布于 2008-08-02 21:27:00
象这个题目应该要用到回溯算法推出一起可能,,,学习中 搞出来就贴 应该思路就是这样的
28 楼
jacobzz [专家分:0] 发布于 2008-08-03 16:56:00
[quote]
2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
输出结果:a=0;b=0;c=1;d=1;e=1[/quote]
楼主第二题结果不对啊,根据条件5,如果E参加的话A、D都参加啊
我做出来结果是C、D参加
29 楼
baiytao [专家分:30] 发布于 2008-08-27 19:40:00
你代码设计蛮好的。
在代码结构上,可以考虑。
使其模块化。这样代码起来就比较快。
void fun1();
int fun2();
....
main()
{
fun1();
fun2();
...
}
fun1()
{...
}
fun2()
{...
}
30 楼
cs7617 [专家分:0] 发布于 2008-08-28 20:51:00
最近在自学C++,刚把谭浩强的C++程序设计看到数组和指针那块。
第一个程序里的 char *p="TJ123456789"; 这句我不懂。
字符变量好像不能这样赋初值,
*p是一个指针吗?
该怎么理解这句话呢?
我来回复