C语言鱼c 发表于 2014-1-17 14:41:27

求助,,,,,,

本帖最后由 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:08:42

本帖最后由 无念道长 于 2014-1-17 15:19 编辑

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

C语言鱼c 发表于 2014-1-17 15:28:56

无念道长 发表于 2014-1-17 15:08 static/image/common/back.gif
先抢个沙发
问一下,你去掉后哪里不对?你去掉以后根本就没有输出结果的方式,屏幕打印的应该是“max=min= ...

如果去掉的话,还有一个return,我觉得应该会返回的。

无念道长 发表于 2014-1-17 15:35:21

C语言鱼c 发表于 2014-1-17 15:28 static/image/common/back.gif
如果去掉的话,还有一个return,我觉得应该会返回的。

好吧,我错了,void可以带返回值的,但是不会返回任何值,其作用是立即结束函数运行,百度知道上好多的这类问题,可以查一下,我查了..........不好意思,差点给你带沟里去。。。。。。可以有return,但不返回值.......

无念道长 发表于 2014-1-17 15:46:22

朋友,我是新鱼油,权限不够添加好友的...........

C语言鱼c 发表于 2014-1-17 15:47:46

本帖最后由 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一一对应?并没有说明啊

C语言鱼c 发表于 2014-1-17 15:49:41

无念道长 发表于 2014-1-17 15:46 static/image/common/back.gif
朋友,我是新鱼油,权限不够添加好友的...........

哦, 呵呵{:1_1:}{:1_1:}

无念道长 发表于 2014-1-17 15:50:59

C语言鱼c 发表于 2014-1-17 15:47 static/image/common/back.gif
谢谢,顺便再问一个问题。#include

void main()


再粘下代码好么?我没看到代码.........就看到了#include<stdio.h>

C语言鱼c 发表于 2014-1-17 15:52:29

无念道长 发表于 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:08:04

本帖最后由 无念道长 于 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);(多加个星号)"试试就应该能明白了

C语言鱼c 发表于 2014-1-17 16:36:15

无念道长 发表于 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);
      }
}


这个代码,在视屏中是可以运行的,而我运行的时候就直接停止了,,,,这是和电脑有关吗?

dlzhwm 发表于 2014-1-17 16:39:49

去掉了就显示不了结果,少了输出显示功能。
形如&a就是指向数组元素1的。看看指针、数组的相关知识。

无念道长 发表于 2014-1-17 17:25:11

C语言鱼c 发表于 2014-1-17 16:36 static/image/common/back.gif
再问个问题

#include


额,这个视频我也看了,当时在家运行没问题,现在在单位,我偷摸装的VC++6.0,试试确实不行,应该是系统内存分配问题,语法和逻辑没问题的。

machimilk 发表于 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 = {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");
}
够详细了吧,应该能明白了吧

牛头的主人 发表于 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;
}
页: [1]
查看完整版本: 求助,,,,,,