C语言 随机产生10个手机号,不能重复。输入英文名后绑定手机号,一个名字一个手机号

先显示这10个号码,然后输入名字,从10个号码中选一个,绑定。换一个名字输入同样的手机号,显示手机号已绑定。
不知道怎么让手机号不重复。。。。还有如何验证手机号已经绑定了。。。
最新回答
纵山崖

2024-11-24 07:59:49

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

const int PHONE_LENGTH = 11;

const char* PREFIX = "139";

typedef struct {
    
    int available;
    char number[PHONE_LENGTH+1];
    char owner_name[31];
}PhoneNumber;


void phoneNumberGenerator(PhoneNumber*phones,int size, const char *prefix);
void displayPhoneNumber(PhoneNumber*phones,int size);




int main(void)
{
    

    char tname[31];
    int  id ;
    PhoneNumber phones[10];
    
    phoneNumberGenerator(phones,10,PREFIX);
    
    displayPhoneNumber(phones,10);
    
    
    
    
    while(1)
    {
        puts("请输入您的姓名");
        scanf("%s",tname);
    
        puts("请输入您喜欢号码的编号");
        scanf("%d",&id);
        
        if(phones[id].available)
        {
            strcpy (phones[id].owner_name,tname);
            
            phones[id].available = 0;
            
            displayPhoneNumber(phones,10);
        }else
        {
            puts("此号已被占用,请选择其他的号码");
            
        }
        
        
        
    }
    
    

    return 0;







void phoneNumberGenerator(PhoneNumber*phones,int size,const char *prefix)
{
    
    int repeat;   //重复标志变量
    
    for(int i=0;i<size;++i)
    {
        
        strncpy(phones[i].number,prefix,strlen(prefix));  //复制号码前缀 
        phones[i].available = 1;                          //初始化号码为可用 
        strcpy(phones[i].owner_name,"unknow") ;           //初始化号码的拥有着为 "unknow"   
        
        
        
        //开始产生号码 
        do{
            
             repeat = 0;
            /*******************产生一个随机号码******************/
            for(int j = strlen(prefix);j<PHONE_LENGTH;++j)
            {
                (phones[i].number)[j] = rand()%10+'0';
                
            }
            (phones[i].number)[PHONE_LENGTH] = '\0';
        
            /************************检测重复性**************************/
            for(int k=0;k<i;k++)
            {
                if(strcmp(phones[i].number,phones[k].number)==0)
                {
                    repeat = 1;    
                    break; 
                    
                }
                
            }
        }while(repeat);   //如果当前产生的号码与之前的重复了,则再生成一个,直到不重复为止 
        
    }
    
    
    
}


void displayPhoneNumber(PhoneNumber*phones,int size)
{
    
    
    printf("%-5s%-20s %-10s %s\n","编号","号码","状态","拥有者");
    for(int i=0;i<size;++i)
    {
        
        
        printf("%-5d%-20s %-10s %s\n",i,phones[i].number,phones[i].available?"可用":"已占用",phones[i].owner_name);
        
        
    }
    
    
    
    
    
}
悦心自足

2024-11-24 07:59:04

是用一个数组存储10个号码的吧,那只要在生成新号码后用一个循环依次比较之前结果就行了,伪代码如下:
int i, j; //两个循环变量
int temp; //保存生成的号码
for(i = 0; i < SIZE; i++) //SIZE是你要存的号码数量
{
temp = fun1();
for(j = 0; j < i; j++)
{
//下面的fun1是你定义的产生手机号的函数,tel[]是存号码的
while(temp ==tel[j] ) //若有重复的,再生成一次就ok
{
temp = fun1();
j = 0; //更新号码后防止与前面的重复,继续从tel[0]开始比较
}
}
tel[i] = temp;
}

至于如何确认手机号已绑定,可以用一个flag数组变量表示嘛,flag数组清零,哪个号码绑定了就把flag里哪个元素置1,用的时候直接查。不过用一个数组的话无论如何都觉得太浪费空间了,只有10个号码的话,用一个16bit的short变量足够了,每一个bit代表一个号码是否被绑定,位操作没问题的吧?