6-1 求两数平方根之和 (10 分)
函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。
函数接口定义:
double fun (double *a, double *b);
裁判测试程序样例:
#include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f ", y ); return 0; } /* 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94
实验代码:
double fun (double *a, double *b) { double sum=0; sum=sqrt(*a)+sqrt(*b); return sum; }
设计思路:
1)定义数组a和b
2) 利用sqrt函数对a和b求和
3)求和输出sun
本题遇到的问题:
无
运行结果截图:
7-1 利用指针返回多个函数值 (30 分)
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
输出最大值和最小值。
输入样出一组输入。例如:
5 8 92 0 3
输出样例
在这里给出相应的输出。例如:
max = 1 min = 0
实验代码:
#include<stdio.h> void max_min(int n, int *a); int main() { int n; scanf("%d", &n); int a[n]; for(int i = 0;i < n;i++) { scanf("%d", (a + i)); } max_min(n, a); return 0; } void max_min(int n, int *a) { int t; for(int i = 0;i < n - 1;i++) { for(int j = 0;j < n - i - 1;j++) { if(*(a + j) < *(a + j + 1)) { t = *(a + j + 1); *(a + j + 1) = *(a + j); *(a + j)= t; } } } printf("max = %d ", *(a)); printf("min = %d ", *(a + n - 1)); }
设计思路:
1)定义函数max_min并输入整数个数N和数组a[n]
2) 利用函数max和min将数据首位的值赋给max和min并输出最大值和最小值
3)将i的值赋为0并判断i是否小于n是则进入下一个循环否则输出最大值和最小值
遇到的问题及其解决方法:
1)问题1:for循环的嵌套出错
解决办法:严格控制代码格式,注意大括号的位置,在本子上自己用笔运算一下再运行
2)问题2:对新的函数的使用不够灵活
解决办法:多看书在网上看老师讲解和问同学
运行结果截图:
6-3 最小数放前最大数放后 (10 分)
为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换;输出数组元素。。
函数接口定义:
void input(int *arr,int n); void max_min(int *arr,int n); void output(int *arr,int n);
三个函数中的 arr
和n
都是用户传入的参数。n
是元素个数。
input函数的功能是输入 n
个元素存到指针arr
所指向的一维数组中。
max_min函数的功能是求指针arr
所指向的一维数组中的最大值和最小值,其中最小的数与第一个数对换,将最大的数与最后一个数对换。
output函数的功能是在一行中输出数组元素,每个元素输出占3列。
裁判测试程序样例:
#include<stdio.h> void input(int *arr,int n); void max_min(int *arr,int n); void output(int *arr,int n); int main() { int a[10]; input(a,10); max_min(a,10); output(a,10); return 0; } /* 请在这里填写答案 */
输入样例:
5 1 4 8 2 3 9 5 12 7
输出样例:
1 5 4 8 2 3 9 5 7 12
实验代码:
void input(int *arr,int n) { for(int i=0;i<n;i++) scanf("%d",&arr[i]); return arr; } void max_min(int *arr,int n) { int min,max,indax,indix; int *temp; indax=0; indix=0; max=arr[0]; min=arr[0]; for(int i=0;i<n;i++) { if(max<arr[i]) { max=arr[i]; indax=i; } if(min>arr[i]) { min=arr[i]; indix=i; } } *temp=arr[0]; arr[0]=arr[indix]; arr[indix]=*temp; *temp=arr[n-1]; arr[n-1]=arr[indax]; arr[indax]=*temp; return arr; } void output(int *arr,int n) { for(int i=0;i<n;i++) { printf("%3d",arr[i]); } }
设计思路:
1) 利用函数input把数组arr[i]的值赋给arr
2)输出max和min将i的值赋为1并判断i是否小于n
3) 是则继续输出数组并对数组之间作比较否则跳出循环结束
遇到的问题及其解决方法:
1)问题:将for循环的嵌套出错 最大值和最小值数组的顺序放错了
2)解决办法:在c语言编译器上多次编译运行
运行结果i截图:
思考题:(分值等同于编程题)
1.为什么要使用指针?它有什么用?
答:在实际编程中,既然使用变量就可以访问数据,为什么还用指针呢?使用指针来操纵自动变量的唯一原因是,为了说明指针的工作原理。指针真正的用途是被用于完成下列3种任务(1)管理自由存储区中的数据(2)访问类的成员数据和函数(3)按引用传递参数在“函数的 工作原理 ”中,提到了5个内存区域(1)全局名称空间(2)自由存储区(3)寄存器(4)代码空间(5)堆栈局部变量和函数参数位于堆栈中 :当然,代码位于代码空间中;而全局变量位于全局名称空间中;寄存器用于内部管理工作,如记录栈顶指针和指令指针。余下的所有内存都被作为自由存储区,通常被称为堆。
局部变量不是永久性的,函数返回时,局部变量就被删除。这很好,因为这意味着根本不用为管理这种内存空间而劳神;也不好,因为这使得函数在不将堆中的对象复制到调用函数中的目标对象的情况下,将难以创建供其他对象或函数使用的对象。全局变量解决了这种问题,其代价是整个程序中都可以访问它们。这导致创建了难以理解和维护的代码。如果管理得当,将数据存储在自由存储区可以解决这两种问题。可以将自由存储区视为一块很大的内存,其中有数以千计的依次被编号的内存单元,可用于存储数据。与堆栈不同,你不能对这些单元进行标记,而必须先申请内存单元的地址,然后将它存储到指针中。
2.指针变量在内存中暂用多大的空间?它的大小由什么决定?
答:32位编译器:4个字节;64位编译器:8个字节。编译器的版本决定.