C语言作业-Day4

写作能力有限,请多多包含( $ _ $ )
如有错误理解,请指出文中有误的地方。(可以私信)
一、选择题

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

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,读入了一次字符(即getchar)之后,ch不改变了,也就不会再读入字符。如果第一个字符不是回车的话,ch!='\n'永远成立,产生死循环,所以这种是不能统计输入字符的。在循环体里面加上ch=getchar();就行了。

  • getchar()一次接收一个字符,当接收到的不是'\n'(换行符),一直循环继续。

答案:D

2、运行以下程序后,如果从键盘上输入 65 14 ,则输出结果为( )

A: 3    B: 2    C: 1    D: 0

考查while循环和循环嵌套的理解,初值m=65,n=14;循环1判断m!=n为真,来到循环2判断m>n为真, 执行m=m-n;直到m=9,n=14;循环2结束来到循环3判断n>m为真,执行n=n-m;直到m=9,n=5;循环3结束回到循环1,如 此往复直到m==n时,循环结束

int main()
{
int m, n;
printf("Enter m,n;");
scanf("%d%d", &m,&n);
while (m!=n) //1
{
while(m>n) m=m-n; //2
while(n>m) n=n-m; //3
}
printf("m=%d\n",m);
return 0;
}

答案:C 

3、若运行以下程序时,从键盘输入 ADescriptor ​​​​​<回车>,则下面程序的运行结果是( )

A: v0=7,v1=4,v2=7        B: v0=8,v1=4,V2=8 

C: v0=11,v1=4,v2=11    D: v0=12,v1=4,v2=12

#include <stdio.h>
int main()
{
char c;
int v0=0,v1=0,v2=0;
do
{
switch(c=getchar())
{
case'a':case'A':
case'e':case'E':
case'i':case'I':
case'o':case'O':
case'u':case'U':v1 += 1;
default:v0+= 1;v2+=1;
}
}while(c!='\n');
printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
return 0;
}
  • 代码switch语句中没有break,则每次找到入口进入后,顺序执行到代码块结束为止。

【解释】因case后面都没有break子句,所以进入case后,除了v1增1以外,还要执行default后的语句,v0和v2都要增1。输入的字符串ADescriptor<回车>中A、e、i、o各出现一次,所以v1要增加4次,其值为4,字符串中字符总数为12(包含回车符),所以vo和v2要增加12次,其值分别为12、12。故正确答案为D。

答案: D

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

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

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选项,在gcd函数中,x,y是char型的,而题目要求两个int数字的最大公约数,参数类型不匹配。

B选项,在for循环中,初始化min=0,而循环条件为min>0,因此循环一次都不会进行,更不会走到if的判断中。会直接走到return min上,最后只会返回x,y中的较小的那个,这样求最大公约数显然是错的。

C选项,if (x % min = 0 && y % min = 0),正常判断相等时要用两个=号,一个=号是赋值的意思。

D选项,min是int型的,而函数的返回类型。

答案:ABC

5、执行下面的程序段,语句3的执行次数为( )

A: n(n+2)/2    B: (n-1)(n+2)/2    C: n(n+1)/2    D: (n-1)(n+2)

for(i = 0; i <= n-1; i++) // (1)
for(j = n; j > i; j--) // (2)
state; // (3)

(1)中的for语句易发现循环的次数为n。

(2)中的for语句,初始化j=n,循环继续条件为j>i,且每次循环j减1。第二层循环受到i的值的影响。①当i=0时,走到第二层循环,那么此时循环继续进行的条件就变成了j>0,j被初始化为n,每次循环j减1。那么第二层循环就会走n次。②当i=1时,走到第二层循环,那么此时循环继续进行的条件就变成了j>1,j又会被初始化为n,那么循环的次数就会是n-1。③当i=2时为n-2.......一直到i=n-1时二层循环走1次可以看出。总共的循环次数是n+n-1+n-2+.....+1最后的结果为(1+n)*n/2。

答案:C

 二、编程题

1、645. 错误的集合 - 力扣(LeetCode)

**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findErrorNums(int* nums, int numsSize, int* returnSize){
    *returnSize = 2;
    //遍历nums数组,将其中数据对应的位置1, 哪一位如果已经重置过则意味着数据重复了
    int *arr = (int *)calloc(numsSize + 1, sizeof(int));//申请numsSize个整形空间,并初始化为0
    int *ret = (int *)calloc(*returnSize, sizeof(int));//申请2个整形空间,并初始化为0
    int cur_sum = 0, old_sum = 0;
    for (int i = 0; i < numsSize; i++) 
    {
        if (arr[nums[i]] == 1) { //这个数字在上边数组的对应位置已经置过1了,则重复
        ret[0] = nums[i];//找到重复的数字
        }
        arr[nums[i]] = 1; //将标记数组的对应数据位置1
        old_sum += i + 1; // 1~n的求和
        cur_sum += nums[i]; //当前数组中的数据求和(多了一个重复的,少了一个丢失的)
    }
    ret[1] = old_sum - (cur_sum - ret[0]);//原始总和,减去去掉重复后的当前总和就是丢失的数字
    free(arr);
    return ret;
}

2、密码检查_牛客题霸_牛客网 (nowcoder.com)

#include<stdio.h>
#include<string.h>
int main()
{
    int n = 0;
    while(~scanf("%d",&n))
    {
        for(int i = 0; i < n; i++)
        {
            char pwd[101] = {0};
            scanf("%s",pwd);
            int lower = 0,higher = 0,digit = 0,other = 0;
            if(pwd[0] >= '0' && pwd[0] <= '9')
            {
                printf("NO\n");
                continue;
            }//密码不能以数字开头
            if(strlen(pwd) < 8)
            {
                printf("NO\n");
                continue;
            }//密码长度至少为8
            for(int i = 0; pwd[i] != '\0'; i++)
            {
                if(pwd[i] >= '0' && pwd[i] <= '9')
                    digit++;//数字
                else if(pwd[i] >= 'a' && pwd[i] <= 'z')
                    lower++;//小写字母
                else if(pwd[i] >= 'A' && pwd[i] <= 'Z')
                    higher++;//大写字母
                else
                    other++;
            }
            if(other != 0)
            {
                printf("NO\n");
                continue;
            }// 密码只能由大写字母,小写字母,数字构成
          //大写,小写,数字,必须具有两种以上,而比较运算真则1,假则0
            if((lower > 0) + (higher > 0) + (digit > 0) < 2)
            {
                printf("NO\n");
                continue;
            }//密码只有1种字符
            printf("YES\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值