C语言之指针练习题

第1关:输出月份英文名

300

  • 任务要求
  • 参考答案
  • 评论76
  • 任务描述
  • 相关知识
    • 指针
    • 指针数组
    • 数组指针
    • 指针变量的赋值
    • 指针运算符
  • 编程要求
  • 测试说明

任务描述

本关需要你编写一个用指针数组处理的c程序,然后从键盘输入月份时输出对应的英文名。

相关知识

指针

指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,你必须在使用指针存储其他变量地址之前,对其进行声明。

指针变量声明的一般形式为:

type *var-name;

在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:


  1. int *ip; /* 一个整型的指针 */
  2. double *dp; /* 一个 double 型的指针 */
  3. float *fp; /* 一个浮点型的指针 */
  4. char *ch; /* 一个字符型的指针 */

指针数组

数组大家都清楚,但是指针数组是什么呢?在C语言中,数组元素全为指针的数组称为指针数组。

一维指针数组的定义形式为:

类型名 *数组标识符[数组长度]

例如:


  1. char *arr[4] = {"hello", "world", "shannxi", "xian"};
  2. //arr就是我定义的一个指针数组,它有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址。

运用:

  1. 指针数组可以作为函数的参量使用,使用方式与普通数组类似;

  2. 指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。

数组指针

什么?还有数组指针?不是一样的吗?

指针数组和数组指针是不一样的,让我们来详细看一下什么是数组指针。

数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。

例如:


  1. char (*pa)[4]; // pa即为指向数组的指针,又称数组指针

初学者总是分不出指针数组与数组指针的区别,其实很好理解:

  1. 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称;

  2. 数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,但并不知道它指向的数组占多少字节,它是“指向数组的指针”的简称。

指针变量的赋值

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。在语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。语言中提供了地址运算符&来表示变量的地址。

其一般形式为: & 变量名;, 如&a变示变量a的地址,&b表示变量b的地址。

指针运算符

指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算及关系运算。

  1. 取地址运算符&: 取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。在scanf函数及前面介绍指针变量赋值中,我们已经了解并使用了&运算符。

  2. 取内容运算符*: 取内容运算符*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符之后跟的变量必须是指针变量。需要注意的是指针运算符*和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中,*是类型说明符,表示其后的变量是指针类型。而表达式中出现的*则是一个运算符用以表示指针变量所指的变量。

    例如:


  1. main(){
  2. int a=5,*p=&a;
  3. printf ("%d",*p);
  4. }

表示指针变量p取得了整型变量a的地址。本语句表示输出变量a的值。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

编写一个用指针数组处理的c程序,实现从键盘输入月份时输出对应的英文名。 效果如下:

输入:3 输出:March

测试说明

平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。


开始你的任务吧,祝你成功!

第一种不用指针解法:

#include 
int main()
{
	//»ñÈ¡²ÎÊý·½Ê½ scanf
    //int x  =0;
    //int y = 0;
    //scanf("%d", &x);

    //½á¹ûÊä³öʹÓÃprinf
    //printf("%d",x);

 	// ÇëÔÚ´ËÌí¼ÓÄãµÄ´úÂë
    /********** Begin *********/
    char *arr[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
    int i;
    scanf("%d",&i);
    printf("%s",arr[i-1]);
	/********** End **********/
}

第二种用指针解法:

#include 
int main()
{
	//»ñÈ¡²ÎÊý·½Ê½ scanf
    //int x  =0;
    //int y = 0;
    //scanf("%d", &x);

    //½á¹ûÊä³öʹÓÃprinf
    //printf("%d",x);

 	// ÇëÔÚ´ËÌí¼ÓÄãµÄ´úÂë
    /********** Begin *********/
    char *arr[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
    int i;
    scanf("%d",&i);
    printf("%s",*(arr+i-1));
	/********** End **********/
}

第2关:差等生还是优等生

500

  • 任务要求
  • 参考答案
  • 评论76
  • 任务描述
  • 相关知识
  • 编程要求
  • 测试说明

任务描述

本关需要你使用指针方法来处理一道关于成绩的题目。

相关知识

相关知识略

编程要求

有一个班4个学生,5门课程。

  • 求第n门课程的平均分(1<=n<=5)

  • 找出有m门以上课程不及格的学生(1<=m<=5),输出他们的学号和全部课程成绩及平均成绩;

  • 找出平均成绩在90分以上或全部课程成绩在85分以上的学生,分别编写3个函数实现以上3个要求。

样例:

学号 成绩 成绩2 成绩 成绩 成绩
001 90.0 75.5 80.0 59.0 43.0
002 88.5 75.0 96.0 57.0 60.5
003 89.0 87.0 86.0 90.4 100.0
004 98.0 96.0 99.0 85.0 82.0

输入: 3 2 aver 90 all 85

输出:

第3门课程的平均分为: 90.25 有2门以上课程不及格的学生信息为: 学号: 001 全部成绩: 90.075.580.059.043.0 平均成绩: 69.5 平均成绩在90分以上的学生为: 003004 全部课程成绩在85分以上的学生为: 003

本题请尽情自由发挥!

测试说明

平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。


开始你的任务吧,祝你成功!

#include 

// 请在此添加你的代码
/********** Begin *********/
int main(){
    double arr[4][7]={{90.0,75.5,80.0,59.0,43.0},
                    {88.5,75.0,96.0,57.0,60.5},
                    {89.0,87.0,86.0,90.4,100.0},
                    {98.0,96.0,99.0,85.0,82.0}};
    int e[]={1, 2, 3, 4};
    int i,j,n,m,k,l,x;
    double aver;
    scanf("%d%d",&n,&m);
    scanf("%d",&k);
    scanf("%d",&l);
    printf("第3门课程的平均分为:\n");
    aver=(arr[0][n-1]+arr[1][n-1]+arr[2][n-1]+arr[3][n-1])/4;
    printf("%.2f\n",aver);
    printf("有2门以上课程不及格的学生信息为:\n");
    printf("学号:\n");
    for(i=0;i<4;i++){
        int count=0,isPrime=1;
        aver=0;
        for(j=0;j<5;j++){
            aver+=arr[i][j];
            if(arr[i][j]<60.0){
                count++;
                if(count%2==0){
                    isPrime=0;
                    break;
                }
            }
        }
        if(isPrime==0){
            printf("00%d\n",e[i]);
            printf("全部成绩:\n");
            for(j=0;j<5;j++){
                if(j>0&&j<5){
                    printf(" ");
                }
                printf("%.1f",arr[i][j]);
            }
            printf("\n平均成绩:\n%.1f",aver/5.0);
        }
    }
    printf("\n平均成绩在90分以上的学生为:\n");
    int count=0;
    for(i=0;i<4;i++){
        aver=0;
        for(j=0;j<5;j++){
            aver+=arr[i][j];
        }
        if(aver/5>90.0){
            printf("00%d",e[i]);
            count++;
            if(count>0&&count<2){
                printf(" ");
            }
        }
    }
    printf("\n全部课程成绩在85分以上的学生为:\n");
    for(i=0;i<4;i++){
        int isPrime=1;
        for(j=0;j<5;j++){
            if(arr[i][j]<85.0){
                isPrime=0;
                break;
            }
        }
        if(isPrime){
            printf("00%d",e[i]);
        }
    }
}
/********** End **********/



你可能感兴趣的:(湖南工业大学(移动云启),c语言,算法,数据结构)