求助,,,,,,
本帖最后由 C语言鱼c 于 2014-1-17 14:42 编辑/***********************************************************/
/*设一个函数process,在调用它的时候,每次实现不同的功能。*/
/*输入a和b两个数,第一次调用process时找出a和b中大者,*/
/*第二次找出其中小者,第三次求a与b之和。 */
/***********************************************************/
#include <stdio.h>
void main()
{
int max(int, int );/* 函数声明 */
int min(int, int );/* 函数声明 */
int add(int, int );/* 函数声明 */
void process(int, int, int(*fun)());/* 函数声明 */
int a, b;
printf("Endter a and b:");
scanf("%d %d", &a, &b);
printf("max = ");
process(a, b, max);
printf("min = ");
process(a, b, min);
printf("sum = ");
process(a, b, add);
}
///////////////////////////////////////////////////////////
int max(int x, int y) /* 函数定义 */
{
int z;
if( x > y )
{
z = x;
}
else
{
z = y;
}
return z;
}
int min(int x, int y) /* 函数定义 */
{
int z;
if( x < y )
{
z = x;
}
else
{
z = y;
}
return z;
}
int add(int x, int y) /* 函数定义 */
{
int z;
z = x + y;
return z;
}
void process( int x, int y, int(*fun)() )/* 函数定义 */
{
int result;
result = (*fun)(x, y);
printf("%d\n", result);
return(result);
}
process函数定义;
如果把printf("%d\n", result);去掉就不行了;
为什么?????
本帖最后由 无念道长 于 2014-1-17 15:19 编辑
先抢个沙发
问一下,你去掉后哪里不对?你去掉以后根本就没有输出结果的方式,屏幕打印的应该是“max=min=sum=”,你的最后结果以及"\n没有跟在main函数的"max=","min=","sum="后面输出出来,看起来是连续的等于,如果是这个问题,那应该是正常的结果,如果是其他的请追问,谢谢,另外process函数返回值类型是void,理论上不该有return语句,虽然有不会报错,但是不建议这么使用。
无念道长 发表于 2014-1-17 15:08 static/image/common/back.gif
先抢个沙发
问一下,你去掉后哪里不对?你去掉以后根本就没有输出结果的方式,屏幕打印的应该是“max=min= ...
如果去掉的话,还有一个return,我觉得应该会返回的。 C语言鱼c 发表于 2014-1-17 15:28 static/image/common/back.gif
如果去掉的话,还有一个return,我觉得应该会返回的。
好吧,我错了,void可以带返回值的,但是不会返回任何值,其作用是立即结束函数运行,百度知道上好多的这类问题,可以查一下,我查了..........不好意思,差点给你带沟里去。。。。。。可以有return,但不返回值....... 朋友,我是新鱼油,权限不够添加好友的........... 本帖最后由 C语言鱼c 于 2014-1-17 15:48 编辑
无念道长 发表于 2014-1-17 15:35 static/image/common/back.gif
好吧,我错了,void可以带返回值的,但是不会返回任何值,其作用是立即结束函数运行,百度知道上好多的这 ...
谢谢,顺便再问一个问题。
#include <stdio.h>
void main()
{
int a = {1, 3, 5, 7, 9};
int *name = {&a, &a, &a, &a, &a};
int i;
for(i = 0; i < 5; i++)
{
printf("%d ", *name);
}
printf("\n\n");
}
为什么&a, &a, &a, &a, &a会和1, 3, 5, 7, 9一一对应?并没有说明啊
无念道长 发表于 2014-1-17 15:46 static/image/common/back.gif
朋友,我是新鱼油,权限不够添加好友的...........
哦, 呵呵{:1_1:}{:1_1:} C语言鱼c 发表于 2014-1-17 15:47 static/image/common/back.gif
谢谢,顺便再问一个问题。#include
void main()
再粘下代码好么?我没看到代码.........就看到了#include<stdio.h> 无念道长 发表于 2014-1-17 15:50 static/image/common/back.gif
再粘下代码好么?我没看到代码.........就看到了#include
#include <stdio.h>
void main()
{
int a = {1, 3, 5, 7, 9};
int *name = {&a, &a, &a, &a, &a};
int i;
for(i = 0; i < 5; i++)
{
printf("%d ", *name);
}
printf("\n\n");
}
为什么&a, &a, &a, &a, &a会和1, 3, 5, 7, 9一一对应?并没有说明啊 本帖最后由 无念道长 于 2014-1-17 16:10 编辑
C语言鱼c 发表于 2014-1-17 15:52 static/image/common/back.gif
#include
void main()
*name是指向地址的数组,因为下标运算符([])优先级比取址运算符(&)高,所以先取的是对应的a这个元素,然后取的元素的地址,而name本身是一个指向地址的指针,name的值是*name这个数组的首地址,而*name是*name这个数组的首元素(注意区分地址和元素的概念),这里的元素是a这个数组的首地址,所以,*name中的元素与a中的元素是一一对应的,但是绝对不是完全相同的,因为一个是数{1,3,5,7,9},一个是地址。不知道说的够不够清楚。如果不清楚,"printf("%d ", *name);"改成"printf("%d ", **name);(多加个星号)"试试就应该能明白了 无念道长 发表于 2014-1-17 16:08 static/image/common/back.gif
*name是指向地址的数组,因为下标运算符([])优先级比取址运算符(&)高,所以先取的是对应的a这个元素 ...
再问个问题{:1_1:}
#include <stdio.h>
void main()
{
char *name[] = {"Fishc.com", "www.fishc.com", "home.fishc.com", "Fishc.com/dz"};
char **p;
int i;
for( i=0; i < 4; i++ )
{
p = name + i;
printf("%s\n", **p);
}
}
这个代码,在视屏中是可以运行的,而我运行的时候就直接停止了,,,,这是和电脑有关吗?
去掉了就显示不了结果,少了输出显示功能。
形如&a就是指向数组元素1的。看看指针、数组的相关知识。 C语言鱼c 发表于 2014-1-17 16:36 static/image/common/back.gif
再问个问题
#include
额,这个视频我也看了,当时在家运行没问题,现在在单位,我偷摸装的VC++6.0,试试确实不行,应该是系统内存分配问题,语法和逻辑没问题的。 第一个问题
printf("max = "); 屏幕上面是 max =
process(a, b, max);调用process函数指向max函数,这时候走到了process函数
假如你输入的是1和5
result = (*fun)(x, y); 这时候*fun是传递尽量的max函数地址的指针
这句就等于max(1,5);算出结果5放到result里面
printf("%d\n", result);
把结果打印到屏幕上面并换行
这时候屏幕上面是max = 5换行了
如果你没这句只能打印“max = ”并且没换行
然后函数返回执行
printf("min = ")
process(a, b, min);
由于你在process函数中不打印结果并换行
现在屏幕上面应该是
max = min =
然后又执行了
printf("sum = ");
process(a, b, add);
同理
最终屏幕上面是
max = min = sum =
明白了吗
第二个问题
{
int a = {1, 3, 5, 7, 9}; 定义一个5元素的int数组,这时候好比a的内存地址是00151000,那么a地址就是
00151000存放int形式的1,a地址是00150004,存放3,a地址是00150008存放5....因为vs系列int占4字节所以隔4个存放
一个数组的元素
int *name = {&a, &a, &a, &a, &a};
你这么定义 *name指向的就是00151000,以此类推,所以元素一一对应,因为他们在内存中就是同一个存放的地址
换句话就是*name等同于a
int i;
for(i = 0; i < 5; i++)
{
printf("%d ", *name);
}
printf("\n\n");
}
够详细了吧,应该能明白了吧 除了以上错误,请你把函数声明弄到main外面,真蛋疼,给你我改过的,基本没变,还有你注释单行
用/**/干嘛?......
#include <stdio.h>
int max(int ,int );// 函数声明
int min(int ,int );// 函数声明
int add(int ,int );// 函数声明
typedef int (*TypeFun)(int ,int );
void process(TypeFun , int ,int );
void main()
{
int a, b;
printf("Endter a and b:");
scanf("%d%d",&a,&b);
printf("max = ");
process(max,a,b);
printf("min = ");
process(min,a,b);
printf("sum = ");
process(add,a,b);
}
///////////////////////////////////////////////////////////
void process(TypeFun fun, int x, int y)
{
int result;
result = fun(x, y);
printf("%d\n", result);
}
int max(int x, int y)
{
int z;
if( x > y )
{
z = x;
}
else
{
z = y;
}
return z;
}
int min(int x, int y)
{
int z;
if( x < y )
{
z = x;
}
else
{
z = y;
}
return z;
}
int add(int x, int y)
{
int z;
z = x + y;
return z;
}
页:
[1]