标题: 求助:c语言编程题
性别:未知-离线 乱世闲人

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 113
编号 35448
注册 2005-3-29


发表于 2007-1-11 09:01 资料 短消息 只看该作者
求助:c语言编程题

编写程序
1、  判断m是几位数?
2、  一个一维数组中前n个数的最大值、最小值?
3、  有一个4×4的整型数组,要使该数组主对角线为1,其余都为0,要求写出初始化语句。


顶部
性别:未知-离线 司徒苍月
(kagami☆sama)

越国公
荆南节度使
枢密直学士

Rank: 22Rank: 22Rank: 22Rank: 22
柱国(正二品)
组别 节度使
级别 大将军
好贴 7
功绩 2823
帖子 28883
编号 52341
注册 2005-11-2
来自 创界山
家族 司徒实业


C都还给老师了

说说思路

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

2.冒泡法

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


顶部
性别:女-离线 天宫公主
(司徒家的颖颖)

虞国公主

Rank: 12Rank: 12Rank: 12
组别 限制发言用户
级别 大将军
好贴 6
功绩 517
帖子 11552
编号 1037
注册 2004-10-25
来自 天津
家族 司徒实业


发表于 2007-1-11 09:29 资料 主页 短消息 只看该作者 QQ
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;
}
顶部
性别:男-离线 岱瀛
(deving)

长平侯
川峡东路经略使
监管使

Rank: 19Rank: 19Rank: 19Rank: 19
组别 经略使
级别 左将军
好贴 1
功绩 2293
帖子 1370
编号 55810
注册 2005-12-22
来自 人间
家族 慕容世家


发表于 2007-1-11 10:47 资料 个人空间 短消息 只看该作者
没想到菲菲也会写程序啊. 佩服一个。

后面两道菲菲写了,就不重复了,第一道代码如下:
#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没有说明是正数还是负数.所以直接求对数的做法是不对的

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

当然,楼主不想引入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位整数,怪怪的


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

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

[ 本帖最后由 岱瀛 于 2007-1-11 11:18 编辑 ]
顶部
性别:未知-离线 乱世闲人

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 113
编号 35448
注册 2005-3-29


发表于 2007-1-11 11:33 资料 短消息 只看该作者
非常感谢
顶部
性别:男-离线 云川
(LOLI没有攻略)

白衣伯爵
谏议大夫

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
护军
组别 翰林学士
级别 镇北将军
好贴 1
功绩 612
帖子 3579
编号 3033
注册 2004-7-1
家族 轩辕狼党


发表于 2007-1-11 22:32 资料 个人空间 短消息 只看该作者
对公主的第三题一点补充:

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

如果是有俩对角线的话:

int x[4][4] = zeros[4][4];
for(counter=0, counter < 4, counter++)
{
      x[counter][counter] = 1;
      x[counter][4 - counter - 1] = 1;
}

如果考虑初始化,假设初始化为0

int x[4][4] = {0};    这样自动就是0了

如果不行,那就自己赋值:

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

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

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

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

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

[ 本帖最后由 云川 于 2007-1-11 22:35 编辑 ]
顶部
性别:男-离线 云川
(LOLI没有攻略)

白衣伯爵
谏议大夫

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
护军
组别 翰林学士
级别 镇北将军
好贴 1
功绩 612
帖子 3579
编号 3033
注册 2004-7-1
家族 轩辕狼党


发表于 2007-1-11 22:33 资料 个人空间 短消息 只看该作者
晕.............字体歪斜了............

研究一下...........
顶部
性别:女-离线 天宫公主
(司徒家的颖颖)

虞国公主

Rank: 12Rank: 12Rank: 12
组别 限制发言用户
级别 大将军
好贴 6
功绩 517
帖子 11552
编号 1037
注册 2004-10-25
来自 天津
家族 司徒实业


发表于 2007-1-12 00:56 资料 主页 短消息 只看该作者 QQ
比较喜欢钻研 algorithms, 比较讨厌 implimentation. 后者 syntax 校对烦死人了,一直被我看成累傻小子的活。
顶部
性别:未知-离线 鲍伯 . 迪伦

曲阿侯枢密直学士

Rank: 13Rank: 13Rank: 13Rank: 13
组别 翰林学士
级别 平南将军
好贴 3
功绩 462
帖子 2158
编号 6877
注册 2004-4-18
家族 现视研


发表于 2007-1-12 06:43 资料 个人空间 短消息 只看该作者
-- 我对那个主对角线不晓得是什么意思,按常理矩形该有2对角线

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

zeros[4][4]

上面这个好像没有听说过。。。回家查查看。。。。
顶部
性别:女-离线 nalanqx
(纳兰茜雪)

Rank: 3Rank: 3Rank: 3
组别 仕女
级别 忠义校尉
功绩 3
帖子 281
编号 25785
注册 2004-11-26


发表于 2007-1-12 21:05 资料 短消息 只看该作者


QUOTE:
原帖由 云川 于 2007-1-11 22:32 发表
对公主的第三题一点补充:

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

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

通俗的说就是左上到右下那条对角线
顶部
性别:男-离线 云川
(LOLI没有攻略)

白衣伯爵
谏议大夫

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
护军
组别 翰林学士
级别 镇北将军
好贴 1
功绩 612
帖子 3579
编号 3033
注册 2004-7-1
家族 轩辕狼党


发表于 2007-1-12 23:50 资料 个人空间 短消息 只看该作者


QUOTE:
原帖由 nalanqx 于 2007-1-12 21:05 发表


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

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

哦,晓得了,我文盲了...........悔过...............
顶部
性别:未知-离线 lazyman

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 2
帖子 243
编号 51305
注册 2005-10-17


发表于 2007-1-13 10:10 资料 主页 短消息 只看该作者
第一题可以用 log(); (求对数值) abs();(求绝对值)搞定


第二题可以用qsort(),把源Array重整。而且重整以后还可以使用bsearch()来搜索。
/*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);
       }

/*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;
                 res = bsearch(&key, months, nr_of_months,
                            sizeof(struct mi), compmi);
                 if (res == NULL)
                      printf("â%sâ: unknown month\n", argv);
                 else
                      printf("%s: month #%d\n", res->name, res->nr);
            }
            return 0;
       }

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

[ 本帖最后由 lazyman 于 2007-1-13 11:00 编辑 ]
顶部
性别:未知-离线 lazyman

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 2
帖子 243
编号 51305
注册 2005-10-17


发表于 2007-1-13 10:10 资料 主页 短消息 只看该作者
第三个最简单~~~照字面的意思来做的话就是

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

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

QUOTE:
后者 syntax 校对烦死人了,一直被我看成累傻小子的活

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

[ 本帖最后由 lazyman 于 2007-1-13 11:09 编辑 ]
顶部
性别:男-离线 云川
(LOLI没有攻略)

白衣伯爵
谏议大夫

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
护军
组别 翰林学士
级别 镇北将军
好贴 1
功绩 612
帖子 3579
编号 3033
注册 2004-7-1
家族 轩辕狼党


发表于 2007-1-13 12:55 资料 个人空间 短消息 只看该作者
坚决排斥GCC,坚决排斥UNIX,坚决排斥Linux

我只想用IDE编程,可惜,我却一直在UNIX下............自己写MAKEFILE实在不爽
顶部
性别:未知-离线 whws

白衣伯爵谏议大夫

Rank: 10Rank: 10Rank: 10Rank: 10
组别 白衣卿相
级别 左将军
好贴 6
功绩 166
帖子 1325
编号 82141
注册 2006-9-7
家族 云水兰若


发表于 2007-1-13 18:18 资料 个人空间 短消息 只看该作者
:p

轩辕里的程序员可以成把地抓。
顶部
性别:未知-离线 lazyman

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
功绩 2
帖子 243
编号 51305
注册 2005-10-17


发表于 2007-1-13 20:10 资料 主页 短消息 只看该作者
我主要是喜欢Kate这个写字板。。。作为编程环境来说Unix和Linux的确是最强的。。。写makefile的确是恶梦。。。我讨厌Micro$oft我却要在Windows的环境下编程

PS: Unix这么多Freeware干吗不下一个IDE for Unix呢
顶部
性别:未知-离线 fantasydog
(codering)

Rank: 4
组别 士兵
级别 牙门将军
功绩 6
帖子 567
编号 42708
注册 2005-7-9


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

ps:eclipse不错阿~
顶部
性别:未知-离线 fantasydog
(codering)

Rank: 4
组别 士兵
级别 牙门将军
功绩 6
帖子 567
编号 42708
注册 2005-7-9


发表于 2007-1-22 19:24 资料 短消息 只看该作者
错了,不是堆排序,而是用堆找大小。
(n/2)*(n/2-1)就搞定了大和小,当然第一次的结果可以复用,就又少了n/2次。
顶部
性别:未知-离线 鲍伯 . 迪伦

曲阿侯枢密直学士

Rank: 13Rank: 13Rank: 13Rank: 13
组别 翰林学士
级别 平南将军
好贴 3
功绩 462
帖子 2158
编号 6877
注册 2004-4-18
家族 现视研


发表于 2007-1-23 01:00 资料 个人空间 短消息 只看该作者
回复 #14 云川 的帖子

我倒是跟你相反,对IDE十分反感,因为某些Compiler太自作聪明了。。。
顶部
性别:未知-离线 鹤舞

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 10
编号 8034
注册 2004-6-1


发表于 2007-1-25 15:08 资料 短消息 只看该作者
用log求位数似乎不大合适,也许那是个成百上千位的大数呢。如果实际不超过long的数取log的效率可能还不如走一遍字符串。

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

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 6
编号 69129
注册 2006-5-19


发表于 2007-1-27 23:02 资料 短消息 只看该作者
咳咳。。。。下次C++程序有着落了,来这里请教了
顶部
性别:未知-离线 fantasydog
(codering)

Rank: 4
组别 士兵
级别 牙门将军
功绩 6
帖子 567
编号 42708
注册 2005-7-9


发表于 2007-1-28 03:35 资料 短消息 只看该作者


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

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

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

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

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2024-12-4 16:21
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.016080 second(s), 8 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP