搜索
查看: 1781|回复: 1
打印 上一主题 下一主题

数组问题

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-20 18:04:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币

1. 数组排序
从键盘读入若干整数,将它们按由低到高排序输出。
[测试数据]:
程序先输出:  Please input array number:
用户输入:  5
程序再输出:  Please input all the integer:
用户输入:  300  700 600 450 500
程序输出:  300 450 500 600 700
[实现要求]:
(1) 用一个数组存放各个整数;
(2) 在主函数main()中实现数据的输入和输出操作,并用一个函数实现对数组元素的排序操作。
(3) 排序函数调用另一个函数swap()实现两个数组元素的交换。可以使用引用实现函数参数的传递:
swap(int & a, int & b);
[实现提示]:
排序可以用最简单的选择排序法:
选择排序法:
1) 从n个数中选择最小的一个,把它和第一个数组元素交换;
2) 从剩下的n-1个数中选择最小的一个,把它和第二个数组元素交换;
3) 依此类推,直到从最后两个元素中选出倒数第二小的元素并把它和倒数第二个元素交换为止。
如要按选择排序法对数组30 50 21 39 20排序,则各趟排序后的结果如下所示(带下划线的数表示参加交换的数):
开始:  30 50 21 39 20
第一趟排序:20 50 21 39 30
第二趟排序:20 21 50 39 30
第三趟排序:20 21 30 39 50
第四趟排序:20 21 30 39 50
[实验步骤]
用数组实现程序要求
说明:用一个长度为10的数组存放待排序的数据,数组的定义为
int iArray[10];
数组排序函数的原型为:
  void sort(int num, int iArray[]);
其中num表示数组元素的个数,iArray是数组。
2. 字符排序
修改上面的程序,将数组的操作改为对字符串操作,即从键盘输入一串字符,将它们存放在字符数组中(形成一个字符串),然后对字符数组中的各个字符排序。
[测试数据]:
输入内容:kapdobc
输出内容:abcdkop
[实现要求]:
(1) 用字符数组代替上一个实验的整数数组;
(2) 不要先输入字符串的长度,在程序中自动计算出字符串的长度。
[实现提示]:
(1) 字符串的输入输出操作可以简化,不用一个字符一个字符的输入输出
(2) 字符的长度可以借助于预定义的函数strlen()求出,该函数所在的库函数名为
string.h
[思考问题]
对字符的比较遵循什么样的约定(为什么字符a比字符b小)?
3. 字符串操作
要求和上面类似,但数组中的元素变为字符串。程序对已有的字符串进行排序,并输出排序后的结果。字符串数组中的元素为:
January, February, March, April, May, June, July, September
[测试数据]:
程序直接输出排序后的结果:
  May
  July
  June
  April
  March
  January
  Februrary
  September
[实现要求]:
(1) 排序的规则为:先比较两个字符串的长度,长度短的字符串排在前面,如果长度相等,则比较字符串的值,按从小到大排序输出。
(2) 用字符串数组存放各字符串,并在定义数组时对其进行初始化

沙发
发表于 2013-3-30 20:56:25 | 只看该作者
本帖最后由 Smallbee 于 2013-3-30 21:01 编辑

我弄了第一个数组排序。很久没用C了,折腾了好长时间。
  1. #include <stdio.h>

  2. int swap(int *a, int *b);
  3. int sort(int num, int iArray[]);

  4. int main(int argc, char *argv[])
  5. {
  6.         int num=0, i, iArray[10]={0};
  7.         
  8.         fflush(stdin);//清空输入缓冲区
  9.         printf("请输入数组元素个数:\n");
  10.         scanf("%d", &num);
  11.         printf("请输入数组元素:\n");
  12.         for (i=0; i<num; i++)
  13.                 scanf("%d", &iArray[i]);
  14.         
  15.         sort(num, iArray);
  16.         
  17.         printf("\n排序完成:\n");
  18.         for (i=0; i<num; i++)
  19.         {
  20.                 printf("%d\t", iArray[i]);
  21.         }
  22.         printf("\n");

  23.         return 0;
  24. }

  25. int swap(int *a, int *b)
  26. {
  27.        *a += *b;
  28.        *b = *a - *b;
  29.        *a -= *b;
  30.         /*
  31.         int t;
  32.         t = *a;
  33.         *a = *b;
  34.         *b = t;
  35.         */
  36.         //以上两种方法均可完成交换操作,前一种是从ahac教程中获知。
  37.         //但前一种一旦*a,*b指向同一地址,则最后其值变为0。所以Sort中要增加是否指向同一地址的判断。

  38.         return 0;
  39. }

  40. int sort(int num,int iArray[])
  41. {
  42.         int i, j, k, min;
  43.         for (i=0; i<num-1; i++)
  44.         {
  45.                 min = iArray[i];
  46.                 k = i;
  47.                
  48.                 for (j = i + 1; j < num; j++)
  49.                 {
  50.                         if (min > iArray[j])
  51.                         {
  52.                                 min = iArray[j];
  53.                                 k = j;
  54.                         }
  55.                 }
  56.                if (k != i)
  57.                 {
  58.                         swap(&iArray[i], &iArray[k]);
  59.                         //swap(iArray+i, iArray+k);
  60.                         //以上两句均可,因为数组名就是数组首元素地址,加上i就是第i+1个元素的地址。
  61.                 }

  62.                 /*
  63.                 printf("第%d次循环结束时的数组:\n",i+1);
  64.                 for (j=0; j<num; j++)
  65.                 {
  66.                         printf("%d\t",iArray[j]);
  67.                 }
  68.                 printf("\n");
  69.                 */
  70.         }
  71.         return 0;
  72. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表