回 帖 发 新 帖 刷新版面

主题:[原创]没事一起写程序吧(入门)

没事一起写程序吧(入门)
题目::“入门必做的题”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]

回复列表 (共31个回复)

21 楼

大清早的发个昨晚做的题~~~~~~
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 楼

看来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 楼

[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 楼


是的,我觉得这个拉丁方阵数量实在太多了。

25 楼

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 楼

除了版主,基本都是高手

27 楼

象这个题目应该要用到回溯算法推出一起可能,,,学习中  搞出来就贴 应该思路就是这样的 

28 楼

[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 楼


你代码设计蛮好的。

在代码结构上,可以考虑。
使其模块化。这样代码起来就比较快。
void fun1();
int fun2();
....
main()
{
 fun1();
 fun2();
 ...    
}
fun1()
{...
}
fun2()
{...
}

30 楼

最近在自学C++,刚把谭浩强的C++程序设计看到数组和指针那块。

第一个程序里的  char *p="TJ123456789";  这句我不懂。

字符变量好像不能这样赋初值,
*p是一个指针吗?
该怎么理解这句话呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册