PTA-变量的作用域与存储类型

作者 王从银

单位 吉首大学

寄存器类变量的作用域和寿命与自动类变量的相同。(T)

作者 李克峰

单位 山东交通学院

静态变量的作用域是整个文件。(F)

作者 c课程组

单位 武汉理工大学

函数的形参都属于全局变量。(F)

作者 黄隆华

单位 怀化学院

实参向形参进行数值传递时,数值传递的方向是单向的,即形参变量值的改变不影响实参变量的值。(T)

作者 张高燕

单位 浙大城市学院

全局变量只能定义在程序的最前面,即第一个函数的前面。(F)

作者 张高燕

单位 浙大城市学院

全局变量与局部变量的作用范围相同,不允许它们同名。(F)

作者 张高燕

单位 浙大城市学院

为了便于计算机存储管理,C语言把保存所有变量的数据区,分成动态存储区和静态存储区,静态局部变量被存放在动态存储区。(F)

作者 张高燕

单位 浙大城市学院

自动变量如果没有赋值,其值被自动赋为0。(F)

作者 张高燕

单位 浙大城市学院

静态局部变量如果没有赋值,其存储单元中将是随机值。(F)

作者 周强

单位 青岛大学

C语言中定义的局部变量存放在堆区,动态分配的内存空间位于栈区。(F)

作者 周强

单位 青岛大学

下面这段程序中的循环将是无限循环,程序将始终运行、无法结束(假设运行该程序的计算机系统永远不会发生意外情况而崩溃或断电)。(F)

#include "stdio.h"
int main(){
    for(long num=1; num>0; num++)
        printf("%ld\n", num);
    return 0;
}

作者 周强

单位 青岛大学

下面这段代码,打印输出的结果是22242226。(T)

#include <stdio.h>
void add(int k){
    static int total=2223;
    total += k;
    printf("%d", total);
}
int main(){
    add(1);
    add(2);
    return 0;
}

 

作者 zhangweina

单位 赤峰学院

全局变量不可以和函数内的局部变量同名。(F)

作者 吴光生

单位 新余学院

C语言程序中,在函数内定义的变量称为局部变量。(T)

作者 Hzy

单位 广东东软学院

函数执行完以后,其内部定义的静态变量不会被回收。(T)

作者 李克峰

单位 山东交通学院

如果所有的变量按照下面的程序进行定义和声明,那么在main()函数中所有可用的变量为 (C)。

void fun(int x)
{
    static int y;
    ……
    return;
}
int z;
void main( )
{
    int a,b;
    fun(a);
    ……
}

A.x,y

B.x,y,z

C.a,b,z

D.a,b,x,y,z

作者 王从银

单位 吉首大学

如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为(A)。

A.静态变量

B.动态变量

C.外部变量

D.内部变量

作者 张高燕

单位 浙大城市学院

执行下面程序,正确的输出是(A)。

int x = 5, y = 7;
void swap ( )
{
      int z ;

      z = x ;  x = y ;  y = z ;
}
int main(void)
{
      int x = 3, y = 8;
      swap ( ) ;
      printf ("%d,%d \n", x , y ) ;

      return 0 ;
}

A.3,8

B.8,3

C.5,7

D.7,5

作者 张高燕

单位 浙大城市学院

下面说法中正确的是(A)。

A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度

B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度

C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题

D.静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出

作者 李廷元

单位 中国民用航空飞行学院

5-5. 下列程序的输出结果是

#include <stdio.h> int fun3(int x) { static int a = 3; a += x; return (a); } int main(C) { int k = 2, m = 1, n; n = fun3(k); n = fun3(m); printf("%d\n", n); return 0; }

A.3

B.4

C.6

D.9

作者 李廷元

单位 中国民用航空飞行学院

5-6. 下列程序的输出结果是(A)

#include <stdio.h> int x1 = 30, x2 = 40; sub(int x, int y) { x1 = x; x = y; y = x1; } int main() { int x3 = 10, x4 = 20; sub(x3, x4); sub(x2, x1); printf("%d,%d,%d,%d\n", x3, x4, x1, x2); return 0; }

A.10,20,40,40

B.10,20,30,40

C.10,20,40,30

D.20,10,30,40

作者 李廷元

单位 中国民用航空飞行学院

5-7. 下列程序的输出结果是(B)

#include <stdio.h> void fun(int a, int b, int c) { a = 456; b = 567; c = 678; } int main() { int x = 10, y = 20, z = 30; fun(x, y, z); printf("%d, %d, %d\n", x, y, z); return 0; }

A.30, 20, 10

B.10, 20, 30

C.456, 567, 678

D.678, 567, 456

作者 李廷元

单位 中国民用航空飞行学院

5-8. 下列程序的输出结果是(B)

#include <stdio.h> int fun(int x, int y) { static int m = 0, i = 2; i += m + 1; m = i + x + y; return m; } int main() { int j = 1, m = 1, k; k = fun(j, m); printf("%d, ", k); k = fun(j, m); printf("%d\n", k); return 0; }

A.5, 5

B.5, 11

C.11, 11

D11, 5

作者 李廷元

单位 中国民用航空飞行学院

5-10. 下列程序的输出结果是(D)

#include <stdio.h> int f(int a) { int b = 0; static int c = 3; a = c++; b++; return (a); } int main() { int a = 2, i, k; for (i = 0; i < 2; i++)k = f(a++); printf("%d\n", k); return 0; }

A.3

B.0

C.5

D.4

作者 李廷元

单位 中国民用航空飞行学院

凡是函数中未指定存储类别的局部变量,其隐含的存储类别是__A__。

A.auto

B.register

C.extern

D.static

作者 张高燕

单位 浙大城市学院

下列程序的输出结果是(C)。

    # include <stdio.h>
    int f(int n)
    {      static int k, s;

        n--;
        for(k=n; k>0; k--)
        s += k;
        return s;
    }
    int main(void)
    {      int k;

        k=f(3);
        printf("(%d,%d)", k, f(k));

        return 0;
    }

A.(3,3)

B.(6,6)

C.(3,6)

D.(6,12)

作者 张高燕

单位 浙大城市学院

函数f定义如下,执行语句“sum=f(5)+f(3);”后,sum的值应为(C)。

int f(int m)
{  static int i=0;
   int s=0;

   for(;i<=m;i++)
     s+=i;

   return s;
}

A.21

B.16

C.15

D.8

作者 王俊玲-ktp

单位 集美大学

C 语言中,函数值类型的定义可以缺省,此时函数值的隐含类型是 (B)。

A.void

B.int

C.float

D.double

作者 王俊玲-ktp

单位 集美大学

文件中定义的全局变量的作用域为(D)。

A.本程序全部范围

B.本文件全部范围

C.函数内全部范围

D.从定义该变量的位置开始到本文件结束

作者 王俊玲-ktp

单位 集美大学

以下程序的输出的结果是__C__。

#include<stdio.h>
int x=3;
void incre();
int main()
{
    int i;
    for (i=1;i<x;i++)  incre();
    return 0;
}
 void incre()
{
     static  int  x=1;
     x*=x+1;
     printf("  %d",x);
}

A.3 3

B.2 2

C.2 6

D.2 5

作者 王俊玲-ktp

单位 集美大学

C语言中静态变量和外部变量的初始化是在__B_阶段完成的。

A.程序执行过程中

B.编译

C.运行

D.程序外部

作者 王俊玲-ktp

单位 集美大学

下面程序a,b值为(D)

#include <stdio.h>
int main (void)
{
    int a;
    a = 1;
    {
        int b = 2;
        b = a + b;
        a = a + b;
    }
      printf ("%d,%d",a,b);
      return 0;
}

A.1,2

B.1,0

C.1,不认识b

D.4,不认识b

作者 张高燕

单位 浙大城市学院

凡是函数中未指定存储类别的局部变量,其隐含的存储类型为(A)。

A.自动(auto)

B.静态(static)

C.外部(extern)

D.寄存器(register)

作者 张高燕

单位 浙大城市学院

在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是(D)

A.extern

B.register

C.auto

D.static

作者 张高燕

单位 浙大城市学院

将一个函数说明为static后,该函数将 (B)。

A.既能被同一源文件中的函数调用,也能被其他源文件中的函数调用

B.只能被同一源文件中的函数调用,不能被其他源文件中的函数调用

C.只能被其他源文件中的函数调用,不能被同一源文件中的函数调用

D.既不能被同一源文件中的函数调用,也不能被其他源文件中的函数调用

作者 周强

单位 青岛大学

执行以下程序,打印输出的内容是:C

#include <stdio.h>
int x=5, y=7;
void swap( ){
    int z;
    z=x;  x=y;  y=z;
}
int main( ){
    int x=3, y=8;
    swap( );
    printf("%d, %d\n", x, y);
    return 0;
}

A.5, 7

B.7, 5

C.3, 8

D.8, 3

作者 周强

单位 青岛大学

执行以下程序,打印输出的内容是:A

#include <stdio.h>
int x=5;
void incx( ){
    x++;
}
int main( ){
    int x=3;
    incx( );
    printf("%d\n", x);
    return 0;
}

A.3

B.4

C.5

D.6

作者 周强

单位 青岛大学

执行以下程序,打印输出的内容是:C

#include <stdio.h>
int x=5, y=6;
void incxy( ){
    x++; y++;
}
int main( ){
    int x=3;
    incxy( );
    printf("%d,%d\n", x,y);
    return 0;
}

A.3,6

B.4,7

C.3,7

D.6,7

作者 李祥

单位 湖北经济学院

寄存器变量使用 ▁▁C▁▁▁ 关键字。

A.auto

B.extern

C.register

D.static

作者 吴年志

单位 湖北汽车工业学院

以下程序的结果是__B____。

#include <stdio.h>
int  a,b;
void fun()
{
 a=100;
 b=200;
}

int main()
{
int  a=5,b=7;
fun();
printf("%d%d\n",a,b);
return 0;
 }

A.100200

B.57

C.200100

D.75

作者 吴年志

单位 湖北汽车工业学院

请选出以下程序段的输出结果__C____。

#include <stdio.h>
#define  MIN(x,y)  (x<y)?x:y
int main()
{
   int i,j,k;
   i=10;j=15;
   k=10*MIN(i,j);
   printf("%d\n",k);
   return 0;
 }

A.15

B.100

C.10

D.150

作者 王俊玲

单位 集美大学

下列程序执行后输出的结果是D

int f(int a)
{ int b=0;
  static int c=3;
  a=c++, b++;
  return (a);
}
int main(void)
{ int a=2,i,k;
  for(i=0;i<2;i++)  k=f(a++);
  printf("%d\n",k);
  return 0;
}

A.3

B.0

C.5

D.4

作者 颜晖

单位 浙大城市学院

以下main()函数中所有可用的变量为(D)。

void fun(int x)
{  
    static int y;
        
    ……
}

int z;

int main( )
{   
    int a, b;

    fun(a);
    ……
        
    return 0;
}

A.x, y

B.x, y, z

C.a, b, x, y, z

D.a, b, z

作者 颜晖

单位 浙大城市学院

如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为(B)。

A.自动变量

B.静态变量

C.外部变量

D.以上都可以

作者 黄龙军

单位 绍兴文理学院

关于全局变量和局部变量的说法,正确的是(A)。

A.全局变量必须在函数之外进行定义

B.若全局变量与局部变量同名,则默认为全局变量

C.全局变量的作用域为其所在的整个文件范围

D.全局变量也称外部变量,仅在函数外部有效,而在函数内部无效

(答案仅供参考)

6-1 使用函数计算两个复数之和与之积

作者 颜晖

单位 浙大城市学院

若两个复数分别为:complex1 = real1 + imag1 i 和 complex2 = real2 + imag2 i,则

它们的和为:complex1 + complex2 = (real1 + real2) + (imag1 + imag2) i

它们的乘积为:complex1 * complex2 = (real1 * real2 - imag1 * imag2) + (real1 * imag2 + real2 * imag1) i

本题要求实现两个函数分别计算两个复数之和、两个复数之积。

函数接口定义:

void complex_add (double real1, double imag1, double real2, double imag2); void complex_prod (double real1, double imag1, double real2, double imag2);

其中用户传入的参数为两个复数real1 + imag1 i 和real2 + imag2 i;函数complex_add和函数complex_prod应将计算结果的实部存放在全局变量result_real中、虚部存放在全局变量result_imag中。

裁判测试程序样例:

#include <stdio.h> double result_real, result_imag; void complex_add(double real1, double imag1, double real2, double imag2); void complex_prod(double x1, double y1, double x2, double y2); int main(void) { double imag1, imag2, real1, real2; scanf("%lf %lf", &real1, &imag1); scanf("%lf %lf", &real2, &imag2); complex_add(real1, imag1, real2, imag2); printf("addition of complex is (%f)+(%f)i\n", result_real, result_imag); complex_prod(real1, imag1, real2, imag2); printf("product of complex is (%f)+(%f)i\n", result_real, result_imag); return 0; } /* 请在这里填写答案 */

输入样例:

1 1
-2 3

输出样例:

addition of complex is (-1.000000)+(4.000000)i
product of complex is (-5.000000)+(1.000000)i

解答:

void complex_add (double real1, double imag1, double real2, double imag2)
{
    result_real=real1+real2;
    result_imag=imag1+imag2;
}
void complex_prod (double real1, double imag1, double real2, double imag2)
{
    result_real=real1*real2-imag1*imag2;
    result_imag=real1*imag2+real2*imag1;
}

6-2 阶乘计算

作者 叶斌

单位 成都信息工程大学

程序的功能是:求S=1/1!+1/2!+1/3!+…+1/N!并输出结果。N为任意自然数(只考虑int型),从键盘读入

函数接口定义:

double fac();

double fac();计算阶乘,函数需要使用static 局部变量

裁判测试程序样例:

#include <stdio.h> double fac(); int main(void) { int i, n; double Sum = 0; scanf("%d", &n); for (i=1; i<=n; i++) { Sum += 1 / fac(); } printf("S=1/1!+1/2!+...+1/%d!=%.15f", n, Sum); return 0; } /* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

16

输出样例:

在这里给出相应的输出。例如:

S=1/1!+1/2!+...+1/16!=1.718281828459042

 解答:

double fac()
{
    static int a=1;
    double fact=1.0;
    for(int i=1;i<=a;i++)
    {
        fact=fact*i;
    }
    a++;
    return fact;
}

6-3 月纳税额计算

作者 唐艳琴

单位 中国人民解放军陆军工程大学

本题目要求读入每月工资,计算按月需要累计缴纳的税额(税率见下图),此处只需显示应缴纳的税额,无需减去已缴纳部分。结果保留两位小数。 注意:每月有5000元免税额。

1.png


上图为按年累计应纳税所得额

函数接口定义:

double m_tax(double salary,int month);

其中salary和 month 是用户传入的参数,函数返回每月累计应纳税额。

裁判测试程序样例:

#include<stdio.h> double m_tax(double salary,int month); int main() { double money,tax; int i; for(i=1;i<=12;i++) { scanf("%lf",&money); tax=m_tax(money,i); printf("the sum of %d months tax is %.2f\n",i,tax); } return 0; } /* 请在这里填写答案 */

输入样例:

1000
2000
10000
5000
8000
500
2000
15000
1000
5000
6000
9000

输出样例:

在这里给出相应的输出。例如:

the sum of 1 months tax is 0.00
the sum of 2 months tax is 0.00
the sum of 3 months tax is 0.00
the sum of 4 months tax is 0.00
the sum of 5 months tax is 30.00
the sum of 6 months tax is 0.00
the sum of 7 months tax is 0.00
the sum of 8 months tax is 105.00
the sum of 9 months tax is 0.00
the sum of 10 months tax is 0.00
the sum of 11 months tax is 15.00
the sum of 12 months tax is 135.00

注意 :3月虽然工资为10000元,但3个月累计免税额为15000元,因此无需纳税。5月时累计免税额为25000元,累计工资收入为26000元,因此应纳税额为1000元,按税率为30元,后面同理所得。

解答:

double m_tax(double salary, int month)
{
    static double salary_total=0.0;
    salary_total+=salary;
    double sum = salary_total - 5000*month;
    double tax;
    if(sum<=0) tax=0;
    else if(sum<=36000) tax=sum*0.03;
    else if(sum<=144000) tax=sum*0.1-2520;
    else if(sum<=300000) tax=sum*0.2-16920;
    else if(sum<=420000) tax=sum*0.25-31920;
    else if(sum<=660000) tax=sum*0.30-52920;
    else if(sum<=960000) tax=sum*0.35-85920;
    else tax=sum*0.45-181920;
    return tax;
}

 

6-4 统计平均分,最高分及得最高分人数

作者 王跃萍

单位 东北石油大学

请编写一个函数fun,函数的功能是:统计出若干个学生的平均成绩,最高分以及得最高分的人数。

函数接口定义:

float fun(float array[],int n);

其中 array 和 n 都是用户传入的参数。函数须统计 array数组中学生的平均成绩,最高分以及得最高分的人数,函数返回平均成绩,最高分以及得最高分的人数存放在全局变量 Max 和 J中 。

裁判测试程序样例:

#include <stdio.h> float Max=0; int J=0; float fun(float array[],int n); int main() { float a[10],ave; int i=0; for(i=0;i<10;i++) scanf("%f",&a[i]); ave=fun(a,10); printf("ave=%.2f\n",ave); printf("max=%.02f\n",Max); printf("Total:%d\n",J); return 0; } /* 请在这里填写答案 */

输入样例:

84 75 86 59 25 94 76 84 15 65

输出样例:

ave=66.30
max=94.00
Total:1

解答:

float fun(float array[],int n)
{
    float sum = 0;
    for(int i = 0;i<n;i++)
    {
        sum = sum + array[i];
    }
    float average = sum/n;
    for(int i = 0;i<n;i++)
    {
        if(Max<array[i])
        {
            Max = array[i];
        }
    }
    for(int i = 0;i<n;i++)
    {
        if(Max==array[i])
        {
            J++;
        }
    }
    return average;
}

6-5 累计销售

作者 唐艳琴

单位 中国人民解放军陆军工程大学

为了鼓励销售员积极售卖商品,某公司提出按以下比例拿提成:

如果一年内销售总额小于5000元,按1%进行提成;

如果一年内销售总额大于等于5000元但小于10000元,按5%进行提成;

如果一年内销售总额大于等于10000元,按10%进行提成;

公司分上半年下半年进行结算,请你实现一个函数,可统计某个人在一年的累积提成。

注意:主函数中按上半年和下半年销售量分别输入。

函数接口定义:

double price(double x);

其中 x 表示销售额。函数返回累计提成。

裁判测试程序样例:

#include <stdio.h> double price(double x); int main() { double buy,total; scanf("%lf",&buy); //输入上半年销售量 total=price(buy); //计算总提成 printf("sum_s=%.2f\n",total); scanf("%lf",&buy); //输入下半年销售量 total=price(buy); //计算总提成 printf("sum_s=%.2f\n",total); return 0; } /* 请在这里填写答案 */

输入样例:

3000
7000

输出样例:

sum_s=30.00
sum_s=1000.00

上半年提成是30元,下半年累积提成是1000元。

 解答:

double price(double x)
{
    double a;
    static double b = 0;
    b = b + x;
    if (b < 5000)
    {
        a = b * 0.01;
    }
    else if(b >= 5000 && b < 10000)
    {
        a = b * 0.05;
    }
    else
    {
        a = b * 0.10;
    }
    return a;
}
 

6-6 使用函数记账

作者 颜晖

单位 浙大城市学院

本题要求实现2个函数,分别计算收入、支出一笔现金后的余额,其中现金余额保存在全局变量中。

函数接口定义:

void income(double cash); void expend(double cash);

函数income的功能是:收入现金 cash后,计算现金余额 balance,其中 balance为全局变量。
函数expend的功能是:支出现金 cash后,计算现金余额 balance,其中 balance为全局变量。

裁判测试程序样例:

/* 用函数实现财务现金记账。先输入操作类型choice(1收入,2支出,0结束),再输入操作金额cash,计算现金剩余额balance,可多次操作直到输入操作类型为0时结束。要求定义并调用函数,其中现金收入与现金支出分别用不同函数实现。*/ #include<stdio.h> double balance; /* 定义全局变量,保存现金余额 */ void income(double cash); void expend(double cash); int main(void) { int choice; double cash; cash = 0; /* 初始金额=0 */ scanf("%d", &choice); /* 输入操作类型 */ while (choice != 0){ /* 若输入类型为0,循环结束 */ if (choice == 1 || choice == 2) { scanf("%lf", &cash); /* 输入现金 */ if (choice == 1){ income(cash); /* 函数调用,计算现金收入 */ }else{ expend(cash); /* 函数调用,计算现金支出 */ } printf("balance:%.2f\n", balance); } scanf("%d", &choice); /* 继续输入操作类型 */ } return 0; } /* 请在这里填写答案 */

输入样例:

1
1000
2
456
0

输出样例:

balance:1000.00
balance:544.00

解答:

void income(double cash)
{
    balance = balance + cash;
}
void expend(double cash)
{
    balance = balance - cash;
}

6-7 编写函数,要求函数可以打印n个连续的整数

作者 赵静静

单位 浙江工贸职业技术学院

本题要求实现实现一个函数,它可以打印n个连续的整数,打印时需根据上一次打印的结果,依次向后打印,例如共打印2次,第一次调用打印1~5,则第二次调用打印6~10,……。

函数接口定义:

在这里描述函数接口。例如: void printNumber(int m);

在这里解释接口参数。例如:其中 m 是用户传入的参数。 m 的值表示打印的数字的个数,例如,n为5时,打印5个数字。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如: #include<stdio.h> void printNumber(int m) ; int main() { int n,m; scanf("%d %d",&n,&m); for (int i = 0; i < n; ++i) { printNumber(m);//第一次调用 } return 0; } /* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

2 5

输出样例:

在这里给出相应的输出。例如:

1 2 3 4 5 
6 7 8 9 10 

 解答:

void printNumber(int m)
{
    static int len=0;
    int start = len+1;
    int end = start+m-1;
    for(int i=start;i<=end;i++)
    {
        printf("%d ",i);
    }
    printf("\n");
    len=end;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值