C语言刷题-day4

简介: C语言刷题-day4

一、选择题

1、以下程序的输出结果为( )

#include <stdio.h>
int i;
void prt()
{
        for (i = 5; i < 8; i++)
        printf("%c", '*');
        printf("\t");
}
int main()
{
        for (i = 5; i <= 8; i++)
            prt();
        return 0;
}

A: ***         B: *** *** *** ***         C: *** ***        D: * * *


答案解析:

正确答案:A

全局变量i,在main()中修改为5,第一次在prt()中执行循环输出三次'*',i被修改为8,回到main()中第二次调用prt()时,i<8为假,循环结束没输出,执行一次print("\t"),再次回到主函数后i++变为9,i<=8为假,循环结束;

知识点:

1、for{初始化部分;循环条件部分;调整部分} {循环体}

       ①初始化部分:用来初始化循环变量,注只在循环开始时,执行一次

       ②循环条件部分:用于判断循环什么时候终止(每次循环都要执行,如果循环条件为true,进入循环体,如果为false,退出循环)

       ③调整部分:用于循环条件的调整,每次循环结束的时候执行(使循环条件趋于假的语句)

2、变量的作用域和生命周期

       (1)作用域

               ①局部变量的作用域就是所在的局部范围(同一个{}内)

               ②全局变量的作用域就是整个工程

注:作用域:当全局变量与局部变量同名冲突时,遵循局部优先原则。

       (2)生命周期

               ①局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束

               ②全局变量的生命周期(作用域:在main整个范围均可用)=main的生命周期=程序的生命周期

2、设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )


A: n=0;while(ch=getchar()!='\n')n++;         B: n=0;while(getchar()!='\n')n++;


C: for(n=0;getchar()!='\n';n++);                  D: n=0;for(ch=getchar();ch!='\n';n++);

答案解析:

正确答案:D

对于for循环,其中第一项初始化表达式只执行一次,因此ch只从输入流中取一个字符,之后就再不会取字符,因此会死循环。

知识点:

1、getchar函数(字符输入函数)

       ①一个getchar()函数只能接收一个字符(调用一次读一个字符--多个--循环)

应用:①可以统计字符个数;②可应用于清理缓存区

       ②getchar()是一个无参函数

       ③返回值:读取成功,返回其ASCII值(所接受的字符,可以赋给字符型或整形变量,也可作为表达式的一部分);读取失败,返回EOF

注:scanf默认回车和空格是输入不同组之间的间隔和结束标志,也就是说它不会读取空格和回车;但是getchar在输入时,空格和回车等都作为字符读入。

3、如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )

int gcd(char x,char y)
{
        int min = x < y ? x : y;
        for (min = 0; min > 0; min--)
                if (x % min = 0 && y % min = 0)
                        return min;
}

A: 参数类型不对         B: 循环变量min初值不对         C: 判断等于的符号不对         D: 返回类型不对

答案解析:

正确答案:ABC

1.函数实参是int,形参用char不对,会发生截断丢失数据;

2.min在for循环开始时更新为0,不再是两个形参中的较小值;

3.判断是否整除的时候误将==写成=赋值运算符;

4.函数最终要返回一个int值,返回值类型没问题,但是这里要强调一个选项中没写出的问题,如果是牛客网上的题,会报编译错误,说该函数不是在所有情况下都有返回值,只有在if条件成立的情况下有返回值,一般在vs上这种情况能通过,编译器会给一个默认的返回值。

二、编程题

1、小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:


1. 密码只能由大写字母,小写字母,数字构成;

2. 密码不能以数字开头;

3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种

4. 密码长度至少为 8

现在小明受到了 n 个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的


输入描述:输入一个数 n ,接下来有 n(n≤100) 行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过 100。


输出描述:输入 n 行,如果密码合法,输出 YES ,不合法输出 NO

示例:

输入:1

CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR

输出:YES

代码实例:

分析:这道题只需要将字符串从头到尾的每种字符(大写字符,小写字符,数字,其他字符)分别统计出来后。然后逐个判断是否符合条件即可。

步骤:

       1、定义2个变量n(密码个数)   i(遍历密码个数)

       2、多组输入:while(scanf("%d",&n)!=EOF)

       3、while循环体:

          ①遍历密码个数:for(i=0;i<n;i++)

              for循环体:

               ①定义6个变量 password(密码)  upper(统计大写字母)lower(统计小写字母)  digit(统计数字)  other(统计其他字符)  ptr(存储数组首地址)

               ②捕捉输入密码:scanf(“%s”,password);

               ③判断密码长度是否合适(<8continue)

               ④判断密码开头是否为数字(真continue)

               ⑤统计各种字符的个数:while(*ptr!='\0')

               ⑥判断是否有其他字符(真continue)

               ⑦判断密码中出现的类型是否>=2:(真输出YES,假输出NO)

#include <stdio.h>
#include<string.h>
int main() 
{
    int n=0;
  int i=0;
  while(scanf("%d",&n)!=EOF)
  {
    for(i=0;i<n;i++)
    {
      char password[101]={0};
      int upper=0;
      int lower=0;
      int digit=0;
      int other=0;
      char* ptr=password;//数组名是数组首元素地址
      scanf("%s",password);
      //判断密码长度是否合适
      if(strlen(password)<8)
      {
        printf("NO\n");
        continue;
      }
      //判断密码开头是否为数字
      if(password[0]>='0'&&password[0]<='9')
      {
        printf("NO\n");
        continue;
      }
      //统计各种字符的个数
      while(*ptr!='\0')
      {
        if (*ptr >= 'a' && *ptr <= 'z') lower++;
        else if (*ptr >= 'A' && *ptr <= 'Z') upper++;
        else if (*ptr >= '0' && *ptr <= '9') digit++;
        else other++;
        ptr++;
      }
      //判断是否有其他字符
      if(other!=0)
      {
        printf("NO\n");
        continue;
      }
      //判断密码中出现的类型是否>=2
      if((lower>0)+(upper>0)+(digit>0)>=2)
      {
        printf("YES\n");
      }
      else 
      {
        printf("NO\n");
      }
    }
  }
    return 0;
}
相关文章
|
5月前
|
C语言
【C语言刷题系列】合并两个有序数组
【C语言刷题系列】合并两个有序数组
|
3月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
5月前
|
C语言
【C语言刷题系列】删除公共元素
【C语言刷题系列】删除公共元素
|
5月前
|
存储 C语言
【C语言刷题系列】对数字添加逗号
【C语言刷题系列】对数字添加逗号
|
5月前
|
C语言
【C语言刷题系列】喝汽水问题
【C语言刷题系列】喝汽水问题
|
28天前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
12 0
|
3月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
3月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
3月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
5月前
|
C语言
C语言刷题(函数)
C语言刷题(函数)