论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> 复习资料 >> IT正文
程序员考试补课笔记-第三天
 作者:佚名     2007-3-15 14:58:31        来源:不详  浏览次数:

    很快的就到了第三天了,接下来的学习任务应该越来越重了。至于今天讲了些什么,现在想起来也觉得没有什么似的,可能因为我之前已经把这今天所讲的内容搞懂搞透的原因吧。不过也得把今天的写下来,也没有什么特别原因的,想有个回忆吧。

   今天所讲的都是围绕着数组,我们在C语言里定义数组和其它高级语言定义的不同,这里示出C语言和其它语言的。
  C语言      Foxbase
  int a[10][10]; dim a(10,10)

  是不是符号也不同了,我们以前用惯的都是小括号,但是现在突然来的是中括号真的是有些不习惯呢。但是谁叫我们是学C语言呢,不习惯都要得习惯了。还记得以前定数组根本就是不用理会它的地址,只知道用就行了,就算用错了也会编译出错。可是C语言可不是呢,一但你定义了一个数组之后,你就得好好的管住它,因为数组出了边界是绝对不会通知你的。数组的定义和调用方法也是很多,真是灵活多变,这里不再重复书上里的东西了。现在就定义一个数组来看看:

int a[10];
  如这个表所示,数组定义之后有相对地址,而且数组名a就是存放这些地址的首地址。现在我们定义多一个整型指针变量 int *p; ,让他指向数组a,p=a; 我们试着让指针运算递增一个p++; 我们看到的结果是p指向了新的地址2003,原来的地址是2001,为什么递增一个就移向了2003呢?不是2002才是正确的吗?其实这里就说明了我们定义指针变量为什么要整型呢,是因为所有的指针运算也是看自己本身是什么类型的指针作出什么的运算,就是现在是整型类型,整型数据存储是需要2字节的,所以针指运算也是按这个方式来到进行,结果很显然就是往下移2了。其实这里说这么多,老潭那本书里基本上都有详细说明介绍,所以我一开始说只要自己有看过书的,应该也很容易明白了(反而上面可能给我说模糊了)。

  好了,接下来我们做一些题目吧,这是今天老师给我们出的题,其实也是2001年程序员下午考试里出现过的题目。所以请大家自己也动手做做,多思考,看看谁的方法比较好。 在n行n列矩阵中,每行都有最大数,本程序求这几个最大数中的最小一个。
#include <stdio.h>
#define N 100
int a[N][N];
void main()
{
  int row,col,max,min,n;
  /*输入合法的n和n*n个整数的代码, 注,这里略了一部份到后面练习自己做回*/
  for(row=0;row<n;row++)
  {
    for(max=a[row][0],col=1;col<n;col++)
    if (  ) max=a[row][col];
    if (  ) min=max;
    else if (  ) min=max;
  }
  printf("最大数中的最小数为:%d\n",min);
}

  这题可真有些难度,它的难就难在第二个空那里,相信第一个空绝大部分都会做,可是第二个空呢,真的下不笔了。当时看程序的最后继续两个空后面的语句为什么一样的呢,可真的没有想通,只是要死钻牛解尖,老是想着一定是用数组的,第一个循环里是行,跟着就是列了。可是还是想不到答案,因为我的思路已经大错特错了。最后老师还是说出答案,也说这题真的是比较难。第二空其实是填row= =0,为什么这样填呢,是因为这个矩阵里一开始要有一个BASE数做底,所以row= =0只出现一次,很自然的就成了第一个比较的基数,跟着这个if语句里的就是比较这几个最大数中的最小一个数了,第二个空填了出来当然答案也就随之可以出来了max<min。看来我现在功力去考中程还是白费心机吧,因为这只是第一大题啊,有很多难的题都在后几题。那么既然现在知道自己的弱点就应该去好好克服改正它,好了,这只是第一道练习题,跟着下面还有将略了的那部份编出来。

我所写的如下,因为考虑到整数类型界限的问题,我所编的所着重这里。

printf("please input n:";
scanf("%d",&n);
for(row=0;row<n;row++)
 for(col=0;col<n;col++)
 {
  do
  {
   printf("please a[%d][%d]",row,col);
   scanf("%d",&a[row][col]);
  }while(a[row][col]<-32767 && a[row][col]>32767 );
 }

接下的是第二题了,题目如下:
求n*n的对角线和
这题因为全由自己写,所以各种写法都有。在下面先写我的最基础简单的方法吧。

#include <stdio.h>
#define n 5
main()
{
  int a[n][n];
  int row, col;
  int sum=0;
  /* 输入略 */
  for(row=col=0;row<n;row++,col++)
    sum+=a[row][col];
  for(row=0,col=n-1;row<n;row++,col--)
    sum+=a[row][col];
  if ( n%2 !=0)
    sum-= a[n/2][n/2];
  printf("%d",max);
}
  这是最基本的方法了,两个循环跟着判断是否偶数来减去中间重复出现的一个数,这样就求得结果了
下面我写一个我同学编的还比较简单,而且方法独到的(反正所有人都没有想过这种方法,除了他)。这里主要写一写他的方法。
int sum=0,j;
for ( j=0; j<n; j++ )
  sum+=a[j][j]+a[j][n-1-j];
if ( n%2 !=0 )
sum-=a[n/2][n/2];

够简单吧,一次循环就可以了,他的思路是这样的,比方有一个如下的矩阵


每次都两个两个刚好相对立,所以可以一次就扫描完了。
好了,我写的有些累了,因为今天没有什么精神,最后老师还补充了另一个更简单的,方法其实就是一种只是运用了条件运算符
sum+=a[j][j]+( (j == (n-1-j) ? 0: a[j][n-1-j];
C语言真的想有多简洁有多简洁。


责任编辑:lss
  相关新闻
程序员考试:数据结构笔记
2006年上半年《程序员》试题分析
2005年下半年程序员考试试题结构分析
为什么要学习Java,成为Java程序员
思科证书到期了怎么办—再认证程序介绍
经典的C程序案例
程序员考试补课笔记-第九天
2006程序员第一章系统基础知识[讲义]
2006年软考程序员数据结构复习笔记
程序员考试补课笔记-第六天
为什么要学习Java,成为Java程序员
C++程序设计从零开始之何谓
信息系统管理工程师、信息系统运行管理员考试说明
由“电脑盲”成为高级程序员的语文教师
程序员考试补课笔记-第一天
程序员考试补课笔记-第二天
程序员考试补课笔记-第四天
程序员考试补课笔记-第七天
程序员考试补课笔记-第六天
程序员考试补课笔记-第八天
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号