鱼C论坛

 找回密码
 立即注册
查看: 3082|回复: 6

求助,,,,,,

[复制链接]
发表于 2014-1-17 14:41:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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);去掉就不行了;
为什么?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-17 15:08:42 | 显示全部楼层
本帖最后由 无念道长 于 2014-1-17 15:19 编辑

先抢个沙发
问一下,你去掉后哪里不对?你去掉以后根本就没有输出结果的方式,屏幕打印的应该是“max=min=sum=”,你的最后结果以及"\n没有跟在main函数的"max=","min=","sum="后面输出出来,看起来是连续的等于,如果是这个问题,那应该是正常的结果,如果是其他的请追问,谢谢,另外process函数返回值类型是void,理论上不该有return语句,虽然有不会报错,但是不建议这么使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-17 15:28:56 | 显示全部楼层

如果去掉的话,还有一个return,我觉得应该会返回的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-17 15:35:21 | 显示全部楼层
C语言鱼c 发表于 2014-1-17 15:28
如果去掉的话,还有一个return,我觉得应该会返回的。

好吧,我错了,void可以带返回值的,但是不会返回任何值,其作用是立即结束函数运行,百度知道上好多的这类问题,可以查一下,我查了..........不好意思,差点给你带沟里去。。。。。。可以有return,但不返回值.......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-17 15:46:22 | 显示全部楼层
朋友,我是新鱼油,权限不够添加好友的...........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-17 15:47:46 | 显示全部楼层
本帖最后由 C语言鱼c 于 2014-1-17 15:48 编辑
无念道长 发表于 2014-1-17 15:35
好吧,我错了,void可以带返回值的,但是不会返回任何值,其作用是立即结束函数运行,百度知道上好多的这 ...

谢谢,顺便再问一个问题。

#include <stdio.h>

void main()
{
        int a[5] = {1, 3, 5, 7, 9};
        int *name[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
        int i;

        for(i = 0; i < 5; i++)
        {
                printf("%d   ", *name[i]);
        }

        printf("\n\n");
}



为什么&a[0], &a[1], &a[2], &a[3], &a[4]会和1, 3, 5, 7, 9一一对应?并没有说明啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-17 15:49:41 | 显示全部楼层
无念道长 发表于 2014-1-17 15:46
朋友,我是新鱼油,权限不够添加好友的...........

哦, 呵呵{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-17 15:50:59 | 显示全部楼层
C语言鱼c 发表于 2014-1-17 15:47
谢谢,顺便再问一个问题。#include

void main()

再粘下代码好么?我没看到代码.........就看到了#include<stdio.h>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-17 15:52:29 | 显示全部楼层
无念道长 发表于 2014-1-17 15:50
再粘下代码好么?我没看到代码.........就看到了#include

#include <stdio.h>

void main()
{
        int a[5] = {1, 3, 5, 7, 9};
        int *name[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
        int i;

        for(i = 0; i < 5; i++)
        {
                printf("%d   ", *name);
        }

        printf("\n\n");
}



为什么&a[0], &a[1], &a[2], &a[3], &a[4]会和1, 3, 5, 7, 9一一对应?并没有说明啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-17 16:08:04 | 显示全部楼层
本帖最后由 无念道长 于 2014-1-17 16:10 编辑
C语言鱼c 发表于 2014-1-17 15:52
#include

void main()

*name[5]是指向地址的数组,因为下标运算符([])优先级比取址运算符(&)高,所以先取的是对应的a[n]这个元素,然后取的元素的地址,而name本身是一个指向地址的指针,name的值是*name[5]这个数组的首地址,而*name是*name[5]这个数组的首元素(注意区分地址和元素的概念),这里的元素是a[5]这个数组的首地址,所以,*name[5]中的元素与a[5]中的元素是一一对应的,但是绝对不是完全相同的,因为一个是数{1,3,5,7,9},一个是地址。不知道说的够不够清楚。如果不清楚,"printf("%d   ", *name);"改成"printf("%d   ", **name);(多加个星号)"试试就应该能明白了

评分

参与人数 1鱼币 +3 收起 理由
C语言鱼c + 3 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-17 16:36:15 | 显示全部楼层
无念道长 发表于 2014-1-17 16:08
*name[5]是指向地址的数组,因为下标运算符([])优先级比取址运算符(&)高,所以先取的是对应的a[n]这个元素 ...

再问个问题{: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);
      }
}


这个代码,在视屏中是可以运行的,而我运行的时候就直接停止了,,,,这是和电脑有关吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-17 16:39:49 | 显示全部楼层
去掉了就显示不了结果,少了输出显示功能。
形如&a[0]就是指向数组元素1的。看看指针、数组的相关知识。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-17 17:25:11 | 显示全部楼层
C语言鱼c 发表于 2014-1-17 16:36
再问个问题

#include

额,这个视频我也看了,当时在家运行没问题,现在在单位,我偷摸装的VC++6.0,试试确实不行,应该是系统内存分配问题,语法和逻辑没问题的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-17 20:14:21 | 显示全部楼层
第一个问题
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[5] = {1, 3, 5, 7, 9}; 定义一个5元素的int数组,这时候好比a的内存地址是00151000,那么a[0]地址就是
00151000存放int形式的1,a[1]地址是00150004,存放3,a[2]地址是00150008存放5....因为vs系列int占4字节所以隔4个存放
一个数组的元素

         int *name[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
你这么定义 *name指向的就是00151000,以此类推,所以元素一一对应,因为他们在内存中就是同一个存放的地址
换句话就是*name等同于a
         int i;

         for(i = 0; i < 5; i++)
         {
                 printf("%d   ", *name);
         }

         printf("\n\n");
}
够详细了吧,应该能明白了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-18 20:07:23 | 显示全部楼层
除了以上错误,请你把函数声明弄到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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表