任务1整数排序
输入3
个整数,按由大到小的顺序输出。(要求用指针方法处理)
本关知识
定义指针变量
定义指针变量的一般形式为: 类型名 * 指针变量名;
如: int * pointer_1, * pointer_2;
说明: (1)左边的int
类型是在定义指针变量时必须指定的基类型,指针变量的基类型用于表示指针变量可以指向的变量的类型。 (2)指针变量前面的“*”
表示该变量的类型为指针型变量。 (3)指针变量名是pointer_1
和pointer_2
,而不是* pointer_1
和* pointer_2
。
怎样引用指针变量
在引用指针变量时,可以有三种情况: (1)给指针变量赋值。 如:
int * p;
int a = 3;
p = &a; //把a的地址赋给指针变量p
这样,指针变量p
的值就是变量a
的地址,也可以说p
指向a
。 注意:&为取地址运算符,&a表示a的地址。
(2)引用指针变量指向的变量 如在上例基础上增加以下语句: printf("%d",* p);
便可以以整数形式输出指针变量p所指向的变量的值,即变量a的值3。 注意:*
为指针运算符,* p
代表指针变量p所指向的对象
如有以下赋值语句: * p = 1;
表示将整数1赋给指针p所指向的变量,相当于a=1;
编程要求
本关的编程任务是补全Sort2.c
文件中main
函数,以实现对3
个整数排序的功能。 实际的测试样例参见下文。 本关涉及的代码文件Sort2.c
的代码框架如下:
//包含标准输入输出函数
#include <stdio.h>
//定义main函数
int main()
{
//请在此添加‘实现三个整数排序’的代码
/*****************Begin******************/
/***************** End ******************/
return 0;
}
其中: #include <stdio.h>
的意思是包含stdio
函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()
是定义main
函数,每个C
程序都必须有且只有一个main函数。该函数是整个程序的入口,程序执行会从main
函数的第一条语句开始。 int
表示main
函数的返回值类型。函数结束时需要返回一个整数。 return 0;
是函数返回,这里是从main
函数返回,0
是返回的整数值。return
语句会结束一个函数的运行。
测试说明
本关的测试过程如下:
- 平台编译
Sort2.c
,然后链接相关程序库并生成Sort2.exe
; - 平台运行
Sort2.exe
,并以标准方式提供测试输入; - 平台获取
Sort2.exe
的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对Sort2.c
的测试样例:
测试输入: 66 77 88
预期输出: 88 77 66
测试输入: 4 5 2
预期输出: 5 4 2
//包含标准输入输出函数
#include <stdio.h>
//定义main函数
int main()
{
//请在此添加‘实现三个整数排序’的代码
/*****************Begin******************/
int a,b,c,t;
scanf("%d %d %d",&a,&b,&c);
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
printf("%d %d %d\n",c,b,a);
/***************** End ******************/
return 0;
}
任务2字符串比较2
写一个函数,实现两个字符串的比较。即自己写一个stringCompared
函数,函数原型为:int stringCompared(char * p1,char * p2);
,设p1
指向字符串s1,p2
指向字符串s2
。要求当s1==s2
时,返回值为0
,当s1!=s2
时,返回他们两者第一个不同的字符的ASCII
码差值,如果s1>s2
,则输出一个正值,如果s1<s2
,则输出一个负值。
本关知识
数组元素的指针
一个指针变量既可以指向变量,也可以指向数组元素(即把某一个元素的地址放到一个指针变量中)。 例如:
int a[5] = {1,3,5,7,9};
int *p;
p = &a[0];
以上是使指针变量p
指向a
数组的第0
个元素。
在引用数组元素时指针的运算
当指针指向数组元素时,可以对指针进行加和减运算。 如上例子p
指向数组元素a[0],p+1
则表示指向下一个数组元素a[1]
。 在指针指向数组元素时,可以对指针进行以下运算: 加一个整数,如p+1
减一个整数,如p-1
自加运算,p++
,++p
自减运算,p--
,--p
两个指针相减,如p1-p2
(只有当p1
和p2
都指向同一个数组中的元素才有意义) 说明: 如果指针变量p
指向数组中的一个元素,则p+1
指向同一数组中的下一个元素,p-1
指向同一数组中的上一个元素。
通过指针引用数组元素
引用一个数组元素,可以有两种方法: (1)下标法,如a[i]
形式; (2)指针发,如*(a+i)
或*(p+i)
,其中a
是数组名,p
是指向数组元素的指针变量,其初值为p=a
;
字符指针作函数参数
如果想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作为参数,也可以用字符指针变量作为参数,在被调用的函数中可以改变字符串的内容,在主调函数中可以引用改变后的字符串。
编程要求
本关的编程任务是补全StringCompared.h
文件中stringCompared
的函数,以实现字符串比较的功能。 实际的测试样例参见下文。 本关涉及的代码文件StringCompare.h
的代码框架如下:
int stringCompared(char *p1,char *p2)
{
//在此写入函数体
//在函数体内实现字符串比较
//注意主函数,主函数已经写好
/*****************Begin****************/
/***************** End **************/
}
主函数如下:
//包含标准输入输出函数
#include <stdio.h>
#include"StringCompared.h"
//定义main函数
int main()
{
int m; //m用于保存两个字符串中的第一个不同字符的ASCII码的差值
//定义两个字符数组,分别用于保存输入的两个字符串
char str1[20],str2[20];
//定义两个指针变量,分别指向之前定义的两个字符数组
char *p1,*p2;
scanf("%s",str1);
scanf("%s",str2);
//让指针变量p1指向字符数组str1
p1=str1;
//让指针变量p2指向字符数组str2
p2=str2;
m=stringCompared(p1,p2);
printf("%d",m);
return 0;
}
其中: #include <stdio.h>
的意思是包含stdio
函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()
是定义main
函数,每个C
程序都必须有且只有一个main
函数。该函数是整个程序的入口,程序执行会从main
函数的第一条语句开始。 int
表示main
函数的返回值类型。函数结束时需要返回一个整数。 return 0;
是函数返回,这里是从main
函数返回,0
是返回的整数值。return
语句会结束一个函数的运行。
测试说明
本关的测试过程如下:
- 平台编译
StringComparedMain.c
以及头文件StringCompared.h
,然后链接相关程序库并生成StringComparedMain.exe
以及StringCompared.h.gch
; - 平台运行
StringComparedMain.exe
,并以标准方式提供测试输入; - 平台获取
StringComparedMain.exe
的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对StringComparedMain.c
的测试样例:
测试输入: And Aid
预期输出: 5
测试输入: ABC CBA
预期输出: -2
int stringCompared(char *p1,char *p2)
{
//在此写入函数体
//在函数体内实现字符串比较
//注意主函数,主函数已经写好
/*****************Begin****************/
int i=0;
while(p1[i]!='\0'&&p2[i]!='\0')
{
if(p1[i]!=p2[i])
{
return p1[i]-p2[i];
}
i++;
}
if(p1[i]=='\0'&&p2[i]=='\0')
{
return 0;
}
else if(p1[i]=='\0')
{
return-p2[i];
}
else{
return p1[i];
}
/***************** End **************/
}
任务3实现计算器
输入两个整数a
和b
,及+
,-
,*
,/
中的任意一字符。根据输入字符对整数a
和b
做相应的算术运算,如输入+
,程序就给出a
与b
之和,输入-
,就给出a
和b
之差,输入*
,就给出a
和b
的乘积,输入/
,就给出a
与b
的商。若输入其他字符,则提示输入错误。
本关知识
指向函数的指针变量的定义
定义指向函数的指针变量的一般形式为 数据类型 (*
指针变量名)(函数参数表列); 如 int (*p)(int,int);
说明: 1.定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。 2.如果要用指针调用函数,必须先使指针变量指向该函数。 如 p = max;//max
为已定义的函数的函数名 3.在给函数指针变量赋值时,只须给出函数名而不必给出参数。 4.对指向函数的指针变量不能进行算术运算。 5.用函数指针变量调用函数时,只须将(*p)
代替函数名即可(p为指针变量名),在(*p)
之后的括号中根据需要写上实参。如 c=(*p)(a,b);
用指向函数的指针作函数参数
指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数。 指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数。 如:
……
int main()
{ …… fun(f1,f2) …… }
void fun(int (*x1)(int),int (*x2)(int,int))
{ int a,b,i=3,j=5;
a=(*x1)(i); //相当于a=f1(i);
b=(*x2)(i,j); //相当于b=f2(i,j);
}
编程要求
本关的编程任务是补全Calculator.h
文件中的Calc
、add
、sub
、mult
、divi
函数,以实现计算器功能。 实际的测试样例参见下文。 本关涉及的代码文件Calculator.h
的代码框架如下:
//注意主函数,主函数已经写好
int calc(int x,int y,int (*p)(int,int)){
//在此写入函数体
//在函数体内实现计算器
/*****************Begin****************/
/***************** End ****************/
}
int add(int x,int y){
//在此写入函数体
//在函数体内实现加法
/*****************Begin****************/
/***************** End ****************/
}
int sub(int x,int y){
//在此写入函数体
//在函数体内实现减法
/*****************Begin****************/
/***************** End ****************/
}
int mult(int x,int y){
//在此写入函数体
//在函数体内实现乘法
/*****************Begin****************/
/***************** End ****************/
}
int divi(int x,int y){
//在此写入函数体
//在函数体内实现除法
/*****************Begin****************/
/***************** End ****************/
}
主函数代码如下:
#include <stdio.h>
#include <stdlib.h>
//包含 Calculator.h文件
#include"Calculator.h"
//定义main函数
int main()
{
//本题主要是实现一个计算器的功能
int a,b,result;
char c;
scanf("%d%c%d",&a,&c,&b);
//利用函数指针实现加减乘除
switch(c){
case '+':result=calc(a,b,add);break; //加法
case '-':result=calc(a,b,sub);break; //减法
case '*':result=calc(a,b,mult);break; //乘法
case '/':result=calc(a,b,divi);break; //除法
default:printf("系统不能识别的运算符");exit(1); //退出
}
//输出结果
printf("%d",result);
return 0;
}
其中: #include <stdio.h>
的意思是包含stdio
函数库,使得当前程序可以调用标准输入输出函数库中的函数。 int main()
是定义main
函数,每个C
程序都必须有且只有一个main
函数。该函数是整个程序的入口,程序执行会从main
函数的第一条语句开始。 int
表示main
函数的返回值类型。函数结束时需要返回一个整数。 return 0;
是函数返回,这里是从main
函数返回,0
是返回的整数值。return
语句会结束一个函数的运行。
测试说明
本关的测试过程如下:
- 平台编译
CalculatorMain.c
以及头文件Calculator.h
,然后链接相关程序库并生成CalculatorMain.exe
以及Calculator.h.gch
; - 平台运行
CalculatorMain.exe
,并以标准方式提供测试输入; - 平台获取
CalculatorMain.exe
的输出,然后将其与预测输出对比,如果一致则测试通过;否则测试失败。 以下是平台对CalculatorMain.c
的测试样例:
测试输入: 3+5
预期输出: 8
测试输入: 65-68
预期输出: -3
测试输入: 9*24
预期输出: 216
测试输入: 65/6
预期输出: 10
测试输入: 66=22
预期输出: 系统不能识别的运算符
//注意主函数,主函数已经写好
int calc(int x,int y,int (*p)(int,int)){
//在此写入函数体
//在函数体内实现计算器
/*****************Begin****************/
return p(x,y);
/***************** End ****************/
}
int add(int x,int y){
//在此写入函数体
//在函数体内实现加法
/*****************Begin****************/
return x+y;
/***************** End ****************/
}
int sub(int x,int y){
//在此写入函数体
//在函数体内实现减法
/*****************Begin****************/
return x-y;
/***************** End ****************/
}
int mult(int x,int y){
//在此写入函数体
//在函数体内实现乘法
/*****************Begin****************/
return x*y;
/***************** End ****************/
}
int divi(int x,int y){
//在此写入函数体
//在函数体内实现除法
/*****************Begin****************/
if(y==0)
{
printf("除数不能为 0");
exit(1);
}
return x/y;
/***************** End ****************/
}