osinooo 发表于 2018-12-11 20:24:06

彩票兑奖程序问题,题目要求用指针实现,求各位兄弟指点

体育彩票由七位数字组成,第七位数字是特别号码,只有在前面六位数都正确的时候才对第七位数。现在体彩中心给出了一个特等奖号码是1234567,程序要求在屏幕上任输入一个号码判断出中了几等奖。(如果七位数字都相同就是特等奖;前六位相同为一等奖,任连续五位相同为二等奖,任连续四位相同为三等,任连续三位相同为四等,任连续两位相同位五等。(注意:除特等奖外都不考虑第七位)

不按位对奖:也就是说不管是多少位,只要有连续几位相同都可以。比如说给出的号码是:2312345就中了三等奖(因为1234和前面相同,注意,这里的第七位是5,虽然也相同但是不能算)

osinooo 发表于 2018-12-11 20:24:44

不用指针都做不出来,更别说用指针了...

osinooo 发表于 2018-12-11 20:28:05

求大佬指点!

osinooo 发表于 2018-12-11 20:43:49

要做吐血了

刘邦 发表于 2018-12-11 23:36:37

#include<stdio.h>
int main()
{
        int a={1,2,3,4,5,6,7};
        int b                                                   ;
        int i,j,k;
        int (*r)=&a;
        int (*p)=&b;
        for(i=0;i<7;i++)
        {
                scanf("%d",&b);
        }
        for(j=0;j<6;j++)
        {
                for(k=0;k<6;k++)
                {
                        if(*(*p+j)=*(*r+k))
                        {
                                if(*(*p+j+1)=*(*r+k+1))
                                {
                                        if(k+1<6||j+i<6);
                                        {
                                                printf("五等奖\n");
                                                break;
                                        }
                                        else
                                        {
                                                if(*(*p+j+2)=*(*r+k+2))
                                                {
                                                        if(k+2=6||j+2=6);
                                                        {
                                                                printf("四等奖\n");
                                                                break;
                                                        }
                                                        else
                                                        {
                                                                if(*(*p+j+3)=*(*r+k+3))
                                                                {
                                                                        if(j+3=6||k+3=6)
                                                                        {
                                                                                printf("三");
                                                                                break;
                                                                        }
                                                                        else
                                                                        {
                                                                                if(*(*p+j+4)=*(*r+k+4))
                                                                                {
                                                                                        if(j+4=6||k+4=6)
                                                                                        {
                                                                                                printf("二");
                                                                                                break;
                                                                                        }
                                                                                        else
                                                                                        {
                                                                                                if(*(*p+j+5)=*(*r+k+5))
                                                                                                {
                                                                                                        if(j+5=6||k+5=6)
                                                                                                        {
                                                                                                                printf("一");
                                                                                                                break;
                                                                                                        }
                                                                                                        else
                                                                                                        {
                                                                                                                if(a==b)
                                                                                                                {
                                                                                                                        printf("特等奖");
                                                                                                                        break;

                                                                                                                }
                                                                                                                else
                                                                                                                {
                                                                                                                        printf("一");
                                                                                                                }
                                                                                                        }
                                                                                                }
                                                                                                else
                                                                                                {
                                                                                                        printf("二");
                                                                                                }
                                                                                        }
                                                                                }
                                                                                else
                                                                                {
                                                                                        printf("三");
                                                                                }
                                                                        }
                                                                }
                                                                else
                                                                {
                                                                        printf("四");
                                                                }
                                                        }
                                                }
                                                else
                                                {
                                                        printf("五等奖\n");
                                                }
                                        }
                                }
                                else
                                {
                                        printf("无奖\n");
                                }
                        }
                }
        }
        /*for(j=0;j<7;j++)
        {
                printf("%d",b);
        }
        printf("\n");
        */
          return 0;
}


尽管有报错,但应该对你有帮助

百里狂生 发表于 2018-12-13 10:02:20

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//123456(最后一位不同)按得奖分析共有 5+4+3+2+1 = 15 种子串
//1234567 特等奖
//将所有可能的子串(特等奖除外)存入二维数组 np 中
//用strstr函数判断用户母串中是否含有子串,若含有,保存所含子串长度
//所保存的最大子串长度就是对应获奖等级

int get_str(char ***np , char *win_Number)//获取所有子串存入np所指向的内存
{
        char *p = NULL; //返回某个子串
        char *temp = NULL;
        char **_np = NULL; //临时变量储存所有子串 15*7

        p = (char *)malloc(7 * sizeof(char));
        if (p == NULL)
        {
                printf("分配内存失败 p = (char *)malloc(7 * sizeof(char));\n\n");
                return -1;
        }
        _np = (char **)malloc(15 * sizeof(char *));
        if (_np == NULL)
        {
                printf("分配内存失败 _np = (char **)malloc(5 * sizeof(char *));\n\n");
                return -2;
        }

        for (int i = 0; i < 15; i++)
        {
                _np = (char *)malloc(7 * sizeof(char));
                if (_np == NULL)
                {
                        printf("分配内存失败 _np = (char *)malloc(7 * sizeof(char));\n\n");
                        return -3;
                }
        }

        int i = 0,count = 0;
        for (int k = 2; k <= 6; k++)//选定子串位数
        {
               
                        temp = win_Number;
                        for (i = 0; i < 7 - k ; i++) //对该位数下的子串个数(7 - k)进行遍历,复制
                        {
                                strncpy(_np, temp, k);
                                _np = '\0';//补字符串结尾
                                count++;
                                temp++; //右移不断获取k长度的子串
                        }
        }
        *np = _np;
}

int main()
{
        char *win_Number = "1234567"; //中奖号码
        char *Number = (char *)malloc(8 * sizeof(char)); //储存用户号码
        char **np = NULL; //保存获奖子串
        int len = { 0 }; //储存子串长度
        int max_len = 0; //可能存在多个相同子串,取最大长度的那个。
        int i = 0, j = 0;

        printf("输入抽奖号码(7位数): ");
        scanf("%s", Number);

        if (strlen(Number) != 7)//判断用户输入数字位数是否准确
        {
                printf("输入号码位数不对");
                return -1;
        }
       
        if (strcmp(Number, win_Number) == 0)
        {
                printf("%s 是特等奖\n", Number);
                return 0;
        }

        Number = '\0'; //不是特等奖,与第7位数字无关,去除。

        int ret = get_str(&np,"123456"); //不是特等奖,与第7位数字无关,传前6位数字。

        for ( i = 0,j = 0; i < 15; i++)
        {
                if (strstr(Number, np))
                {
                        len = strlen(np);//可能存在多个相同子串,取最大长度的那个。
                        j++;
                }
        }

        for ( i = 0; i < j; i++) //取最大长度的那个。
        {
                if (max_len < len)
                        max_len = len;
        }

        printf("中了%d等奖\n", 7 - max_len);
        return 0;
}

osinooo 发表于 2018-12-23 16:43:32

刘邦 发表于 2018-12-11 23:36
尽管有报错,但应该对你有帮助

谢谢啦

Croper 发表于 2018-12-23 18:50:38

本帖最后由 Croper 于 2018-12-23 19:03 编辑

//尽量增加了程序的泛用性,可以自己设定号码的位数和特别号的位数
//思路的核心是计算两个串最大能匹配的子串的长度
//简单而直接的想法是将两个串错位比较,计算最大能匹配的长度,然后右移一位,再次比较,就像这样
//-------abcdefg--      -------abcdefg--               -abcdefg-------
//-------|--------==>   -------||-------==>.....==>    -------|-------
//-abfdefg--------      --abcdefg-------               -------abcdefg-
//使用的编译器为VS 2017,其他编译器可能需要酌情修改
//其他的所有东西都是在犯皮

#include <iostream>

const int CNNUM = 6;         //普通位数
const int CSNUM = 1;         //特等奖位数

int* CutNum(int i,int l)            //分割数字,把每一位填入长度为l的数组中
{
        int *pnum = new int;
        l--;
        for (l; l >= 0; l--)
        {
                pnum = i % 10;
                i = i / 10;
        }
        return pnum;
}

int GetMaxSameNum(const int* mNum,const int* pNum,int l)//计算两个数列最大有多少位相同,l为数列长度
{
        const int *p, *q;
        int maxSameNum = 0;
        int n;
        for (int i = 1-l; i < l; i++)//错位进行比较,p的第n位对应q的第n-1位
        {
                if (i<0)
                {
                  p =pNum ;            
                  q =mNum-i;
                }
                else
                {
                        p = pNum + i;
                        q = mNum;
                }

                n = 0;            //n记录当前相同位数
                for (int j = 0; j < l-abs(i); j++)               //错位比较时,只需要比较能对应的l-abs(i)位数
                {
                        if (*p == *q)
                        {
                                n++;                        
                        }
                        else
                        {
                                if (n > maxSameNum) maxSameNum = n;    //当p!=q时,如果当前相同位数大于maxSameNum,记录。并重新将当前相同位数设为0
                                n = 0;
                        }
                        p++;               
                        q++;
                }
                if (n > maxSameNum) maxSameNum = n;//当一次匹配循环完成时,同样需要记录当前相同位数,并将其设为0
                n = 0;
        }

        return maxSameNum;
}

const char* GetPrizeString(int i)            //根据数字给出几等奖,字符串请自己修改(✺ω✺)
{
        switch (i)
        {
        case 0:
                return "----(0)哇哦,金色传说!-----";
        case 1:
                return "----(1)传说----";
        case 2:
                return "----(2)金色史诗----";
        case 3:
                return "----(3)史诗----";
        case 4:
                return "----(4)金色稀有----";
        case 5:
                return "----(5)稀有----";
        }
        return "----抱歉!----";
}

inline void PrintArray(int* a, int l)                  //打印一个数组,便于对比
{
        for (int i = 0; i < l; i++) std::cout << " " << a;
}
int main()
{
        int mnum, pnum;
        int *amnum, *apnum;
        int cnsame, cssame;
        int pstrnum;
        std::cout << std::endl << "请输入你的号码:";                                             
        std::cin >> mnum;
        std::cout << std::endl << "请输入中奖号码:";
        std::cin >> pnum;

        amnum = CutNum(mnum,CNNUM+CSNUM);                        //以数组形式记录你的号码
        apnum = CutNum(pnum,CNNUM+CSNUM);                        //以数组形式记录开奖号码
        cnsame = GetMaxSameNum(amnum, apnum, CNNUM);             //计算普通号码最大能匹配的位数   

        amnum += CNNUM;                                        //作为指针右移CNNUM(普通号码个数)个单位,这样对应的就是特等奖号码
        apnum += CNNUM;
        cssame = GetMaxSameNum(amnum, apnum, CSNUM);         //计算特等奖号码最大能匹配的位数      

        pstrnum = CNNUM + CSNUM - cnsame;                     //pstrnum储存奖次,特等奖为0,一等奖为1,依次类推,如果特等价的位数不止一位,也能正常运行,这样就是特一=0 特二=1 一等奖=3..
        if (pstrnum == CSNUM) pstrnum -= cssame;               

        amnum -= CNNUM;                                     //作为指针左移回原位,
        apnum -= CNNUM;
        std::cout << std::endl << "您的号码是:";
        PrintArray(amnum, CNNUM + CSNUM);
        std::cout << std::endl << "中奖号码是:";
        PrintArray(apnum, CNNUM + CSNUM);
        std::cout << std::endl << "开奖结果为:" << std::endl << GetPrizeString(pstrnum) << std::endl << std::endl;

        system("pause");
}

页: [1]
查看完整版本: 彩票兑奖程序问题,题目要求用指针实现,求各位兄弟指点