广告Logo
目录 综合报道 软件世界 硬件周刊 大众网络 OA专刊 游戏广场 评测与市场
当前位置:电脑报电子版 > 1999 年 > 32 期 > 软件世界 > 9907请你编程

《 9907请你编程 》

  大家好!“请你编程”又与你们见面了。“请你编程”得到了广大朋友的关心和支持,我在这里表示衷心的感谢。“请你编程”是一个读者朋友直接参与的栏目,是一个体现自我的园地,希望有编程愿望的朋友,无论是编程高手,还是初学者都能参与进来,我们将会认真对待每一份作品。下面请看本期辽宁读者张大鲲的程序。
  9907请你编程解题思路
  要求完成地球数字与外星数字之间的转换功能,关键在于外星数字的进位问题,即给定一个合法的外星数字,如何利用一种规则, 产生出下一个合法的外星数字, 先假定这一问题已经解决, 那么:
  1. 地球数字转换成外星数字: 若为一位数字, 则和外星数字相同; 若为2位或2位以上数字, 根据外星数字连续排列的特点, 地球数字与10的距离应该等于外星数字与10的距离, 也就说,地球数字X为10以后的第几个数字, 相应的外星数字X′也是10以后的第几个数字,因此只须确定出给定的地球数字与10之间的距离, 即可通过初值为10的外星数字求出下一个外星数字, 以及下一个的下一个数字, 直到距离相同为止, 便是所要求的X′。
  2 .外星数字转换成地球数字: 若为一位数字, 则和地球数字相同, 若为2位或2位以上数字,同样, 只需确定出它与外星数字10的距离, 再加上10, 即为实际地球数字的值。
  源程序
  #include
  #include
  #include
  char num[] = ″00000000000″; /* 最大数据不超过 9876543210\n */
  void next_extra_num();
  void change();
  main()
  { FILE *fp1;
  char temp[81], *p_comma;
  int i, j, m, n;
  int times, value, count;
  fp1 = fopen(″ufo.txt″, ″r″);
  if(fp1 == NULL) {printf(″File cannot open!\n″);
  exit(0);}
  fgets(temp, 80, fp1);
  temp[strlen(temp)-1] = ′\0′;
  p_comma = strchr(temp, ′,′); /* 指向字符 ″,″ */
  *p_comma = ′\0′;
  m = atoi(temp);
  n = atoi(++p_comma);
  i = 0;
  while(!feof(fp1) && i < m)
  { fgets(num, 6, fp1);/* 最大合法数据为 ″1022\n\0″, 共 6 位 */
  num[strlen(num)-1] = ′\0′;
  if(strlen(num) == 1)
  printf(″%s\n″, num); /*一位数字则直接输出*/
  else {times = atoi(num)-10; /* 确定与10的距离, 即调用函数须循环的次数 */
   num[0] = ′1′;
   num[1] = ′0′;
   num[2] = ′\0′;
   for(j = 0; j < times; j++)
   next_extra_num();
   printf(″%s\n″, num);}
  i++;}
  i = 0;
  while(!feof(fp1) && i < n)
  {fgets(num, 12, fp1);
  num[strlen(num)-1] = ′\0′;
  if(strlen(num) == 1)
  printf(″%s\n″, num);/*直接输出一位数字*/
  else {value = atoi(num); /*保留输入的原值*/
  num[0] = ′1′;
  num[1] = ′0′;
  num[2] = ′\0′;
  count = 0;
  while(atoi(num) != value) {next_extra_num();
  count++;/* 确定与10的距离 */}
  printf(″%d\n″, count+10);}
  i++;}
   fclose(fp1);}
  void next_extra_num()
  { int length, i; /* 数组的长度 */
  length = strlen(num);
  num[length-1]++; /* 计算下一个数字 */
  while(!order_or_not(length))
  for(i = length-1; i > 0; i--)
  change(i, &length); /*按照规则修改数字*/}
  order_or_not(length) /*是否排序*/
  int length;
  {int i;
  for(i = 0; i < length; i++)
  if(num[i] <= num[i+1])
  return(0); /*返回 0 值*/
  return(1);}
  void change(i,p_length)
  int i, *p_length;
  { int j;
  if(num[i] == num[i-1] )
  {num[i] = ′0′; /* 后一位变成 0, 并进位 */
  num[i-1]++;/* 进位加 1 */}
  if(num[i-1] < num[i])
  num[i-1] = num[i]+1;/* 新值等于后一个数字的值加 1 */
  if(num[i-1] == ′9′+1)
  { for(j = *p_length; j >= 0; j--)
  num[j+1] = num[j];
  num[0] = ′1′;/*把它变为 10, 同时 */
  num[1] = ′0′;
  (*p_length)++; /* 改变数组的长度 */}}
  9909请你编程题目
  在2099年,举行了第N届地球小姐的选美大赛。各国佳丽云集桃花岛,角逐第N届地球小姐的称号。评选的时候,这些美眉站成一个M*N的一个矩阵,由评委给她们打分。这个分数为一个整数,最小为-100,最大为+100。可以很容易根据分数评选出冠军。但在这之后,赛会还要评选出一组团体冠军。
  评选要求为两点:
  1.这组团体冠军必须为大的M*N矩阵中的一个X*Y的小矩阵。X、Y可以为1。
  2.M*N矩阵中的任一子矩阵都称为一个″团体″,这组团体冠军的总分必须为所有的″团体″总分中最大的。
  例如:有一个3*3的矩阵:
  1 2 3
  2 3 4
  9 -99 10
  最大的子矩阵为3 4 10,她们的总分为17。所以,团体冠军的总分就为17。
  现在就请你编一个程序,选出团体冠军,要求如下:
  1.输入从文本文件beauty.txt中读入。格式为:第一行为一个正整数C,表示共有C组输入数据。每组输入数据格式为:第一行为两个正整数M、N,表示美眉们站成一个M*N的矩阵。以下为M行,每行N个整数,表示各位美眉的分数。整数之间用空格分开。其中2<=M、N<=100、C<=10。
  2.输出到屏幕上,共C行,每行5个整数:X1、Y1、X2、Y2、SCORE,其中X1、Y1、X2、Y2表示团体冠军的位置,SCORE表示团体冠军的分数。如果有多个团体冠军并列,只需要输出其中一组即可,整数之间用空格分开。
  输入范例:
  1
  3 3
  1 2 3
  2 3 4
  9 -99 10
  输出范例:
  1 3 3 3 17
  本期题目由上海的oldbug提供。
  来稿请寄磁盘稿或用E-mail投稿,请写明解题思路和源程序(包含详细的注解),将来稿寄到电脑报编辑部的收信地址或E-mail信箱,同时欢迎提供请你编程的题目。来稿截止日期:1999年9月15日。
  本期获奖者名单
  王春新(湖北)  马拥军(浙江) 
  付永安(杭州) 陈行辉(广西)
  李进新(上海) 张玉源(重庆)
  杨大成(内蒙) 杨 莉(天津)
  田安奎(重庆) 张啸清(云南)
  每位获奖者将获得苦丁香公司提供的光盘一张。
下载本期推荐软件页 首

《电脑报》版权所有,电脑报网站编辑部设计制作发布