C语言入门中难度应用练习

1. 【应用】安全的密码

随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。

并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。

任务
林伟翔正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。

应当按照以下的规则来判断密码是否安全:

如果密码长度小于 6 位,则不安全
如果组成密码的字符只有一类,则不安全
如果组成密码的字符有两类,则为中度安全
如果组成密码的字符有三类或以上,则为安全
通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。

输入
输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。

输出
针对每一个密码判断并输出它是否安全。对于不安全的密码输出 “Not Safe”,对于中度安全的密码输出 “Medium Safe”,对于安全的密码输出 “Safe”

输入样例
4
1234
abcdef
ABC123
1#c3Gh
输出样例
Not Safe
Not Safe
Medium
Safe
Safe

#include <stdio.h>  
#include <string.h>  
int main(int argc, char** argv) {  
    int i, shu = 0, len, n, j;  
    static char a[25];  
    scanf("%d", &n);  
    for(i=0;i<=n;i++)  
    {  
     gets(a);  
    if  
    (a[0]=='\0')  
    {  
          
    }  
      
    else  
    {  
          
              
        len = strlen(a);  
      
      
        for(j=0; j<len; j++)  
        {  
            if(a[j]>47&&a[j]<58)  
            {  
                shu++;  
                break;  
            }  
          
        }  
        for(j=0; j<len; j++)  
        {  
            if(a[j]>64&&a[j]<91)  
            {  
                shu++;  
                break;  
            }  
          
        }  
        for(j=0; j<len; j++)  
        {  
            if(a[j]>96&&a[j]<123)  
            {  
                shu++;  
                break;  
            }  
          
        }  
    for(j=0; j<len; j++)  
    {  
        if(a[j]<=47||(a[j]<65&&a[j]>57)||(a[j]>90&&a[j]<97)||(a[j]>122))  
        {  
            shu++;  
            break;  
        }  
    }  
      
    if(shu==1||len<6)  
    {  
        printf("Not Safe\n");  
    }  
    else  
    {  
        if(shu==2)  
        {  
            printf("Medium Safe\n");  
        }  
        else  
        {  
            printf("Safe\n");  
        }  
    }  
      shu = 0;  
      static a;  
    }  
}return 0;  
}  

**

2. 【日期】车辆限行

**
2012年4月1日,北京市人民政府根据《中华人民共和国道路交通安全法》和《北京市实施〈中华人民共和国大气污染防 治法〉办法》有关规定,自2012年4月11日起,继续对机动车实施按车牌尾号工作日高峰时段 区域限行交通管理措施。
  根据规定,按车牌尾号限行的机动车车牌尾号分为五组,每13周轮换一次限行日,分别为:
  (1) 自2012年4月9日至2012年7月7日,星期一至星期五限行机动车车牌尾号分别为:3和8、4和9、5和0、1和6、2和7(含临时号牌,机动车车牌尾号为英文字母的按0号管理,下同);
  (2) 自2012年7月8日至2012年10月6日,星期一至星期五限行机动车车牌尾号分别为:2和7、3和8、4和9、5和0、1和6;
  (3) 自2012年10月7日至2013年1月5日,星期一至星期五限行机动车车牌尾号分别为:1和6、2和7、3和8、4和9、5和0;
  (4) 自2013年1月6日至2013年4月10日,星期一至星期五限行机动车车牌尾号分别为:5和0、1和6、2和7、3和8、4和9。

现给出 2012 年 4 月 9 日之后的任意日期,如果不考虑国家统一的公假,只考虑日期一个因素,请计算指定日期要限行的车牌尾号。

#include <stdio.h>  
int judge(int,int,int);  
int tianshu(int,int,int);  
void xianhao(int , int);  
int main(int argc, char** argv) {  
    int y, m, d, i, j, xingqiji, day, shu,shuai;  
    scanf("%d %d %d", &y, &m, &d);  
    xingqiji = judge(y,m,d);  
    if (xingqiji==6||xingqiji==0)  
    {  
        printf("Free.\n");  
    }  
    else  
    {  
        day = tianshu(y,m,d);  
        shu = (day/91)%5;  
         if(shu == 0)  
    {  
        switch (xingqiji)  
        {  
            case 1: printf("3 and 8.\n"); break;    
            case 2: printf("4 and 9.\n"); break;    
            case 3: printf("5 and 0.\n"); break;    
            case 4: printf("1 and 6.\n"); break;  
            case 5: printf("2 and 7.\n"); break;    
        }  
    }  
      
        if(shu==1)  
        {  
                switch (xingqiji)  
        {  
            case 2: printf("3 and 8.\n"); break;    
            case 3: printf("4 and 9.\n"); break;    
            case 4: printf("5 and 0.\n"); break;    
            case 5: printf("1 and 6.\n"); break;  
            case 1: printf("2 and 7.\n"); break;    
        }  
        }  
      
      
        if(shu==2)  
        {  
                switch (xingqiji)  
        {  
            case 3: printf("3 and 8.\n"); break;    
            case 4: printf("4 and 9.\n"); break;    
            case 5: printf("5 and 0.\n"); break;    
            case 1: printf("1 and 6.\n"); break;  
            case 2: printf("2 and 7.\n"); break;    
        }  
          
}  
      
        if(shu==3)  
        {  
                switch (xingqiji)  
        {  
            case 4: printf("3 and 8.\n"); break;    
            case 5: printf("4 and 9.\n"); break;    
            case 1: printf("5 and 0.\n"); break;    
            case 2: printf("1 and 6.\n"); break;  
            case 3: printf("2 and 7.\n"); break;    
        }  
        }  
        if(shu==4)  
        {  
                switch (xingqiji)  
        {  
            case 5: printf("3 and 8.\n"); break;    
            case 1: printf("4 and 9.\n"); break;    
            case 2: printf("5 and 0.\n"); break;    
            case 3: printf("1 and 6.\n"); break;  
            case 4: printf("2 and 7.\n"); break;    
        }  
        }  
      
    }  
      
}  
int judge(int y,int m,int d)  
{  
    int w;  
    if(3 > m)    
    {m+= 12;    
    y--;}    
    w=((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1)%7;    
    return w;    
}    
    int tianshu(int y2,int m2,int d2)  
    {  
        int a=0,b=0,j=0,k=0,i,y1,m1,d1,c=0,g=0,e=0,f=0;  
    y1 = 2012;  
    m1 = 4;  
    d1 = 9;  
 a=d1;    
 j=m1;    
 k=m2;    
 m1--;    
 for(i=m1;i>0;i--)    
 {  
  switch (i)    
 {   
 case 0: a+=0; break;    
case 1: a+=31; break;    
case 2: a+=28; break;    
case 3: a+=31; break;    
case 4: a+=30; break;    
case 5: a+=31; break;    
case 6: a+=30; break;    
case 7: a+=31; break;    
case 8: a+=31; break;    
case 9: a+=30; break;    
case 10: a+=31; break;    
case 11: a+=30; break;    
case 12: a+=31; break;    
}    
}    
b=d2;    
m2--;    
for(i=m2;i>0;i--){    
     switch (i)    
 { case 0: b+=0; break;    
case 1: b+=31; break;    
case 2: b+=28; break;    
case 3: b+=31; break;    
case 4: b+=30; break;    
case 5: b+=31; break;    
case 6: b+=30; break;    
case 7: b+=31; break;    
case 8: b+=31; break;    
case 9: b+=30; break;    
case 10: b+=31; break;    
case 11: b+=30; break;    
case 12: b+=31; break;    
}       
}    
 if(y1==y2)    
 { c=b-a;    
    g=0;    
    for(i=y2-1;i>y1;i--)    
     { if ((i%4==0&&i%100!=0)||i%400==0)    
     g++;    
           
     }    
     if (((y2%4==0&&y2%100!=0)||y2%400==0)&&k>2){    
         
     g++;}    
     if (( (y1%4==0&&y1%100!=0)||y1%400==0)&&j<2){    
         
     g++;}    
     c=c+g;    
      
 }    
 else {    
    a=365-a;    
    e=y2-y1-1;    
    c=b+a+(365*e);    
    f=0;    
    for(i=y2-1;i>y1;i--)    
     { if ((i%4==0&&i%100!=0)||i%400==0)    
     f++;    
           
     }    
     if (((y2%4==0&&y2%100!=0)||y2%400==0)&&k>2){    
         
     f++;}    
     if (( (y1%4==0&&y1%100!=0)||y1%400==0)&&m1<2){    
         
     f++;}    
     c=c+f;    
     
 }    
     return c;  
      
}  

3. 组成最大数

任意输入一个自然数(<10^100),输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。

输入:自然数 n

输出:各位数字组成的最大数

#include <stdio.h>  
#include <string.h>  
int main(int argc, char** argv) {  
    static char a[1000];  
    int i,j,m,len;  
    gets(a);  
    len = strlen(a);  
    for(j=1;j<=len-1;j++)  
{  
     for(i=0;i<len-1;i++)  
{  
      if(a[i]<a[i+1])  
{        m =  a[i];  
         a[i] = a[i+1];  
         a[i+1] = m;  
}  
}  
}  
    printf("%s\n",a);  
  
}  

4. 【字符】缩写展开

在保存字符串时,对出现在连续位置的若干个字符,如这些字符在ASCII表中也是连续出现,则可以将这些字符使用缩写形式进行保存,以节省保存空间。例如用 A-Z 表示 ABCD…XYZ,1-5 表示12345,c-f 表示 cdef。

输入:

包含缩写形式的字符串

输出:

将缩写形式进行还原后的字符串

说明:

只对压缩后的字符串处理大、小写字母和数字,即对于形如 A-9,a-C 这样的缩写不进行处理。
#include <stdio.h>  
#include <string.h>  
void zhankai(char *);  
int judge(char,char);  
int main(int argc, char** argv) {  
    static char a[1000];  
    int i,j,len;  
    char *p;  
    gets(a) ;  
    len = strlen(a);  
    for(i=0;i<len;i++)  
    {  
        if (a[i]!='-')  
        {  
            printf("%c", a[i]);  
        }  
        else  
        {  
            p = (a+i);  
         zhankai(p);  
        }  
    }  
    printf("\n");  
}  
    void zhankai(char *p)  
    {  
        char a,b;  
        int i;  
        char j;  
        b = *(p+1) ;  
        a = *(p-1) ;  
          
        i = judge(a,b);  
        if(i == 0)  
        {  
            printf("-");  
        }  
        else  
        {  
            for(j=a+1;j<b;j++)  
            {  
                printf("%c", j);  
            }  
        }  
    }  
    int judge(char a, char b)  
    {     
        if(a>=b)  
        {  
            return 0;  
        }  
    else  
    {  
          
            if(a>47&&a<58)  
        {  
            if(b>47&&b<58)  
            {  
                return 1;  
            }  
            else  
            {  
                return 0;  
            }  
        }  
            if(a>64&&a<91)  
        {  
            if(b>64&&b<91)  
            {  
                return 1;  
            }  
            else  
            {  
                return 0;  
            }  
        }  
            if(a>96&&a<123)  
        {  
            if(b>96&&b<123)  
            {  
                return 1;  
            }  
            else  
            {  
                return 0;  
            }  
        }  
                return 0;  
                }  
    }  

5. 学生成绩排序

大家参加了期末考试,成绩出来后老师要对 n 个学生进行成绩汇总和排序。要求程序按成绩降序进行排序。在排序过程中对于成绩相同的学生,要按照输入数据的顺序进行排列。例如:有5名学生的成绩:
zhang1,90
zhang2,91
zhang3,99
zhang4,91
zhang5,98

则排序结果应该为:
zhang3,99
zhang5,98
zhang2,91
zhang4,91
zhang1,90

请注意例题中“zhang2”和“zhang4”的排列顺序。

#include<stdio.h>    
#include<string.h>    
int main()    
{    
    int n,t,i,j;char null;    
    scanf("%d%c",&n,&null);    
    char a[n][100],c[100];    
    int  b[n];    
    for(i=0;i<n;i++)    
    {for(j=0;;j++)    
    {scanf("%c",&a[i][j]);    
     if(a[i][j]==',')    
     {a[i][j]='\0';break;}    
    }scanf("%d%c",&b[i],&null);    
    }    
    for(i=0;i<n-1;i++)    
    {for(j=0;j<n-1-i;j++)    
     {if(b[j]<b[j+1]){t=b[j];b[j]=b[j+1];b[j+1]=t;    
                     strcpy(c,a[j]);strcpy(a[j],a[j+1]);strcpy(a[j+1],c);    
                     }    
     }    
    }    
    for(i=0;i<n;i++)    
    {printf("%s,",a[i]);printf("%d\n",b[i]);}    
 }  

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值