轩辕春秋文化论坛 » 辕门射虎 » 求助:c语言编程题


2007-1-11 09:01 乱世闲人
求助:c语言编程题

[font=宋体][size=3][color=#000000]编写程序[/color][/size][/font]
[color=#000000][font=Times New Roman][size=3]1、[/size]  [/font][font=宋体][size=3]判断[/size][/font][font=Times New Roman][size=3]m[/size][/font][font=宋体][size=3]是几位数?[/size][/font][/color]
[font=Times New Roman][color=#000000][size=3]2、[/size]  [/color][/font][size=3][color=#000000][font=宋体]一个一维数组中前[/font][font=Times New Roman]n[/font][font=宋体]个数的最大值、最小值?[/font][/color][/size]
[font=Times New Roman][color=#000000][size=3]3、[/size]  [/color][/font][size=3][color=#000000][font=宋体]有一个[/font][font=Times New Roman]4[/font][font=宋体]×[/font][font=Times New Roman]4[/font][font=宋体]的整型数组,要使该数组主对角线为[/font][font=Times New Roman]1[/font][font=宋体],其余都为[/font][font=Times New Roman]0[/font][font=宋体],要求写出初始化语句。[/font][/color][/size]

2007-1-11 09:14 司徒苍月
C都还给老师了:mellow:

说说思路

1.强制转换成字符串,循环截取小数点所在位置,小数点前有几位就是几位数(正负号除外),没有小数点的话字符串有多长就有几位(正负号除外)。

2.冒泡法

3.忘记C里面数组怎么弄了,虽说这题是三道里最简单的:q(+

2007-1-11 09:29 天宫公主
1. 不用那么复杂吧。log(m) 的整数部分就是 m 的位数啊。如果在 header 上 include math.h 的话(不清楚基本指令里有没有 log),这个就是个 one liner.

2. 冒泡法有点 overkill,
double max = a[0];
double min = a[0];
for (counter = 1; counter <= 10; counter++) {
  if(a[counter] >= max) {
    max = a[counter];
  }
  if(a[counter] < min) {
    min = a[counter]
  }
}
Syntax 不敢保证,不过应该差不太多。

3. int x[4][4] = zeros[4][4] <------ (但前提要 include math.h, 否则的话自己硬定义出个全0阵也不难)
for(counter=0, counter < 4, counter++) {
  x[counter][counter]=1;
}

2007-1-11 10:47 岱瀛
:titter:没想到菲菲也会写程序啊. 佩服一个。

后面两道菲菲写了,就不重复了,第一道代码如下:
#include <stdio.h>
#include "math.h"
void main()
{
        int m,n=1;
        scanf("%d",&m);               
         if (m<0) m=-m;       
        n += (int)log10(m);                 
        printf("%d\n",n);
}

m没有说明是正数还是负数.所以直接求对数的做法是不对的:loveliness:

本来以为要判断0,可是发现log10(0)不会出错,返回0,那就省掉判断的代码了:lol:

当然,楼主不想引入math.h的话,可以用简单的循环除10的方法吧,效率应该没有这个快.

如果考虑m是有小数的,那么如下:
#include <stdio.h>
#include "math.h"
void main()
{
        float m;
        int n=1;
        scanf("%f",&m);
        if (m<1&&m>-1&&m!=0)
        {
                n=0;
                printf("%d\n",n);
                return;
        }

        if (m<0) m=-m;       
        n += (int)log10(m);                 
        printf("%d\n",n);
}
p.s 有个疑惑,0算1位吧.0.123算几位.我这里把0算1位整数,0.123算0位整数,怪怪的:qDD+


当然,数有越界的问题,由于题目中的M始终没有定义域,而电脑里的类型都是有自己的定义域的,所以,其实这道题要是仔细去分析,还要判断是否超过最大值的异常处理.

然后再考虑m 是从键盘上输入的,那么从代码健壮性看,有必须考虑是否有人乱输入东西,不输入数字而 是随便输入字符的问题或者说输入的是十六进制.这个就比较麻烦了,楼主的题目应该是小作业吧,老师不会想那么多的,就偷懒吧:P

[[i] 本帖最后由 岱瀛 于 2007-1-11 11:18 编辑 [/i]]

2007-1-11 11:33 乱世闲人
非常感谢:unsure:

2007-1-11 22:32 云川
对公主的第三题一点补充:

我对那个[color=Red]主对角线[/color]不晓得是什么意思,按常理矩形该有2对角线

如果是有俩对角线的话:
[code]
int x[4][4] = zeros[4][4];
for(counter=0, counter < 4, counter++)
{
      x[counter][counter] = 1;
      x[counter][4 - counter - 1] = 1;
}
[/code]
如果考虑初始化,假设初始化为0
[code]
int x[4][4] = {0};    这样自动就是0了
[/code]

如果不行,那就自己赋值:
[code]
int x[4][4];
for (int i = 0; i < 4; i ++)
{
      x[i][i] = 0;
}

[/code]
对于一些特别的编译器,可能要求变量要最先定义,那就

[code]
int i = 0;
int x[4][4];

for ( i = 0; i < 4; i ++)
{
      x[i][i] = 0;
}
[/code]

佩服公主的数学,对算法了如指掌,一个程序就是信手拈来啊............

[[i] 本帖最后由 云川 于 2007-1-11 22:35 编辑 [/i]]

2007-1-11 22:33 云川
晕.............字体歪斜了............

研究一下...........

2007-1-12 00:56 天宫公主
比较喜欢钻研 algorithms, 比较讨厌 implimentation. 后者 syntax 校对烦死人了,一直被我看成累傻小子的活。:titter:

2007-1-12 06:43 鲍伯 . 迪伦
-- 我对那个主对角线不晓得是什么意思,按常理矩形该有2对角线

是Identity Matrix吧。
甚么"维数"的 (Array??),我越来越不会中文了。。。:wacko:

zeros[4][4]

上面这个好像没有听说过。。。回家查查看。。。。

2007-1-12 21:05 nalanqx
[quote]原帖由 [i]云川[/i] 于 2007-1-11 22:32 发表
对公主的第三题一点补充:

我对那个主对角线不晓得是什么意思,按常理矩形该有2对角线[/quote]

按照线形代数里的说法,主对角线就是下标按自然排列的那条对角线

通俗的说就是左上到右下那条对角线

2007-1-12 23:50 云川
[quote]原帖由 [i]nalanqx[/i] 于 2007-1-12 21:05 发表


按照线形代数里的说法,主对角线就是下标按自然排列的那条对角线

通俗的说就是左上到右下那条对角线 [/quote]


哦,晓得了,我文盲了...........悔过...............

2007-1-13 10:10 lazyman
第一题可以用 log(); (求对数值) abs();(求绝对值)搞定:lol:


第二题可以用qsort(),把源Array重整。而且重整以后还可以使用bsearch()来搜索。:q```+
/*man qsort*/
[quote]
      #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <string.h>
       #include <assert.h>

       static int
       cmpstringp(const void *p1, const void *p2)
       {
           /* The arguments to this function are "pointers to
              pointers to char", but strcmp() arguments are "pointers
              to char", hence the following cast plus dereference */

           return strcmp(* (char **) p1, * (char **) p2);
       }

       int
       main(int argc, char *argv[])
       {
           int j;

           assert(argc > 1);

           qsort(&argv[1], argc - 1, sizeof(char *), cmpstringp);

           for (j = 1; j < argc; j++)
               puts(argv[j]);
           exit(EXIT_SUCCESS);
       }
[/quote]
/*man bsearch*/
[quote]
      #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>

       struct mi {
            int nr;
            char *name;
       } months[] = {
            { 1, "jan" }, { 2, "feb" }, { 3, "mar" }, { 4, "apr" },
            { 5, "may" }, { 6, "jun" }, { 7, "jul" }, { 8, "aug" },
            { 9, "sep" }, {10, "oct" }, {11, "nov" }, {12, "dec" }
       };

       #define nr_of_months (sizeof(months)/sizeof(months[0]))

       static int compmi(const void *m1, const void *m2) {
            struct mi *mi1 = (struct mi *) m1;
            struct mi *mi2 = (struct mi *) m2;
            return strcmp(mi1->name, mi2->name);
       }

       int main(int argc, char **argv) {
            int i;

            qsort(months, nr_of_months, sizeof(struct mi), compmi);
            for (i = 1; i < argc; i++) {
                 struct mi key, *res;
                 key.name = argv[i];
                 res = bsearch(&key, months, nr_of_months,
                            sizeof(struct mi), compmi);
                 if (res == NULL)
                      printf("â%sâ: unknown month\n", argv[i]);
                 else
                      printf("%s: month #%d\n", res->name, res->nr);
            }
            return 0;
       }
[/quote]

[color=red]刚学新语言的话所有方法都要试都要写,学好了以后就要学会多用Lib(除非你的汇编也很牛)和Copy&Paste[/color]

[[i] 本帖最后由 lazyman 于 2007-1-13 11:00 编辑 [/i]]

2007-1-13 10:10 lazyman
第三个最简单~~~照字面的意思来做的话就是

int id[4][4]={ { 1, 0, 0, 0 },{ 0, 1, 0 ,0 },{ 0, 0, 1, 0 },{ 0, 0, 0, 1 }};

能够Pre-define的决不用运算,这是编程的的原则~:titter:

[quote]后者 syntax 校对烦死人了,一直被我看成累傻小子的活[/quote]
公主肯定写得太少了,写多了syntax很少会错的说,而且这么多开发用的工具想错都难。程序员很生气,后果很严重。。。:-_-:
随便推荐一个我现在正在用的[color=red]免费[/color]开发工具: Windows上的 <Bloodshed Dev-C++> 有syntax Check,而且有自己的服务器可以下在最新的免费library,我个人觉得比Micro$oft的开发包好用,当然最强的还是Linux/Unix的 Kate + gcc/g++ !

[[i] 本帖最后由 lazyman 于 2007-1-13 11:09 编辑 [/i]]

2007-1-13 12:55 云川
坚决排斥GCC,坚决排斥UNIX,坚决排斥Linux

我只想用IDE编程,可惜,我却一直在UNIX下............自己写MAKEFILE实在不爽

2007-1-13 18:18 whws
:p

轩辕里的程序员可以成把地抓。

2007-1-13 20:10 lazyman
我主要是喜欢Kate这个写字板。。。作为编程环境来说Unix和Linux的确是最强的。。。写makefile的确是恶梦。。。我讨厌Micro$oft我却要在Windows的环境下编程:wink:

PS: Unix这么多Freeware干吗不下一个IDE for Unix呢

2007-1-22 19:19 fantasydog
1. 效率的话,移位吧。
先定个正负,然后开始往右移,移到0为止。
2的n次方是多少位,预先可以算出来的,这样移个n次就能算出来啦~
快吧~:qcool+
(小数取整)
2. 堆排序
3. 这个…………没啥好算法。

ps:eclipse不错阿~

2007-1-22 19:24 fantasydog
错了,不是堆排序,而是用堆找大小。
(n/2)*(n/2-1)就搞定了大和小,当然第一次的结果可以复用,就又少了n/2次。

2007-1-23 01:00 鲍伯 . 迪伦
回复 #14 云川 的帖子

我倒是跟你相反,对IDE十分反感,因为某些Compiler太自作聪明了。。。

2007-1-25 15:08 鹤舞
用log求位数似乎不大合适,也许那是个成百上千位的大数呢。如果实际不超过long的数取log的效率可能还不如走一遍字符串。

只找最大最小,用堆排序前面建个堆,而且实际上建堆的时候还要赋值操作,这个代价可能比逐个比较还大,如果是求前N大前N小用堆排倒还合算些

2007-1-27 23:02 dugusheng
咳咳。。。。下次C++程序有着落了,来这里请教了

2007-1-28 03:35 fantasydog
[quote]原帖由 [i]鹤舞[/i] 于 2007-1-25 15:08 发表
用log求位数似乎不大合适,也许那是个成百上千位的大数呢。如果实际不超过long的数取log的效率可能还不如走一遍字符串。

只找最大最小,用堆排序前面建个堆,而且实际上建堆的时候还要赋值操作,这个代价可能 ... [/quote]

帅哥,一维数组就可以表示堆了啊~~

另外求位数用log明显是不合适的,效率低下……
一个循环做大小比较,也不过n的复杂度……

页: [1]
查看完整版本: 求助:c语言编程题


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.