
标题: 求助:c语言编程题 [打印本页]
作者:
乱世闲人 时间: 2007-1-11 09:01 标题: 求助:c语言编程题
编写程序
1、 判断m是几位数?
2、 一个一维数组中前n个数的最大值、最小值?
3、 有一个4×4的整型数组,要使该数组主对角线为1,其余都为0,要求写出初始化语句。
作者:
司徒苍月 时间: 2007-1-11 09:14
C都还给老师了
说说思路
1.强制转换成字符串,循环截取小数点所在位置,小数点前有几位就是几位数(正负号除外),没有小数点的话字符串有多长就有几位(正负号除外)。
2.冒泡法
3.忘记C里面数组怎么弄了,虽说这题是三道里最简单的
作者:
天宫公主 时间: 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
没想到菲菲也会写程序啊. 佩服一个。
后面两道菲菲写了,就不重复了,第一道代码如下:
#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 编辑 ]
作者:
乱世闲人 时间: 2007-1-11 11:33
非常感谢
作者:
云川 时间: 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 编辑 ]
作者:
云川 时间: 2007-1-11 22:33
晕.............字体歪斜了............
研究一下...........
作者:
天宫公主 时间: 2007-1-12 00:56
比较喜欢钻研 algorithms, 比较讨厌 implimentation. 后者 syntax 校对烦死人了,一直被我看成累傻小子的活。
作者:
鲍伯 . 迪伦 时间: 2007-1-12 06:43
-- 我对那个主对角线不晓得是什么意思,按常理矩形该有2对角线
是Identity Matrix吧。
甚么"维数"的 (Array??),我越来越不会中文了。。。
zeros[4][4]
上面这个好像没有听说过。。。回家查查看。。。。
作者:
nalanqx 时间: 2007-1-12 21:05
原帖由 云川 于 2007-1-11 22:32 发表
对公主的第三题一点补充:
我对那个主对角线不晓得是什么意思,按常理矩形该有2对角线
按照线形代数里的说法,主对角线就是下标按自然排列的那条对角线
通俗的说就是左上到右下那条对角线
作者:
云川 时间: 2007-1-12 23:50
原帖由 nalanqx 于 2007-1-12 21:05 发表
按照线形代数里的说法,主对角线就是下标按自然排列的那条对角线
通俗的说就是左上到右下那条对角线
哦,晓得了,我文盲了...........悔过...............
作者:
lazyman 时间: 2007-1-13 10:10
第一题可以用 log(); (求对数值) abs();(求绝对值)搞定
第二题可以用qsort(),把源Array重整。而且重整以后还可以使用bsearch()来搜索。
/*man qsort*/
#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*/
#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 时间: 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的决不用运算,这是编程的的原则~
后者 syntax 校对烦死人了,一直被我看成累傻小子的活
公主肯定写得太少了,写多了syntax很少会错的说,而且这么多开发用的工具想错都难。程序员很生气,后果很严重。。。
随便推荐一个我现在正在用的免费开发工具: Windows上的 <Bloodshed Dev-C++> 有syntax Check,而且有自己的服务器可以下在最新的免费library,我个人觉得比Micro$oft的开发包好用,当然最强的还是Linux/Unix的 Kate + gcc/g++ !
[ 本帖最后由 lazyman 于 2007-1-13 11:09 编辑 ]
作者:
云川 时间: 2007-1-13 12:55
坚决排斥GCC,坚决排斥UNIX,坚决排斥Linux
我只想用IDE编程,可惜,我却一直在UNIX下............自己写MAKEFILE实在不爽
作者:
whws 时间: 2007-1-13 18:18
:p
轩辕里的程序员可以成把地抓。
作者:
lazyman 时间: 2007-1-13 20:10
我主要是喜欢Kate这个写字板。。。作为编程环境来说Unix和Linux的确是最强的。。。写makefile的确是恶梦。。。我讨厌Micro$oft我却要在Windows的环境下编程
PS: Unix这么多Freeware干吗不下一个IDE for Unix呢
作者:
fantasydog 时间: 2007-1-22 19:19
1. 效率的话,移位吧。
先定个正负,然后开始往右移,移到0为止。
2的n次方是多少位,预先可以算出来的,这样移个n次就能算出来啦~
快吧~
(小数取整)
2. 堆排序
3. 这个…………没啥好算法。
ps:eclipse不错阿~
作者:
fantasydog 时间: 2007-1-22 19:24
错了,不是堆排序,而是用堆找大小。
(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小用堆排倒还合算些
作者:
dugusheng 时间: 2007-1-27 23:02
咳咳。。。。下次C++程序有着落了,来这里请教了
作者:
fantasydog 时间: 2007-1-28 03:35
原帖由 鹤舞 于 2007-1-25 15:08 发表
用log求位数似乎不大合适,也许那是个成百上千位的大数呢。如果实际不超过long的数取log的效率可能还不如走一遍字符串。
只找最大最小,用堆排序前面建个堆,而且实际上建堆的时候还要赋值操作,这个代价可能 ...
帅哥,一维数组就可以表示堆了啊~~
另外求位数用log明显是不合适的,效率低下……
一个循环做大小比较,也不过n的复杂度……
欢迎光临 轩辕春秋文化论坛 (http://www.xycq.org.cn/forum/) |
Powered by Discuz! 5.0.0 |