《C程序设计》上机实验报告(四)之一维数组

1.运行程序

#include <stdio.h>

void main( )

{ int a[5],i,j;

  for(i=1;i<5;i++)  a[i]=0;

  for(i=1;i<5;i++)

         for(j=1;j<5;j++)

         a[j]=a[i]+1;

  printf("%d %d\n",a[0],a[3]);

}

要求:

(1)输入并调试上述源程序,对源程序进行编译、连接。

(2)运行并将结果填入表5-1。

(3)分析数组的定义、初始化过程以及结果的关系。

表5-1 程序测试及结果分析

运行结果

分    析

a;数组名;5:常量表达式,a[5]表示数组有五个元素。

2.程序填空

下面程序的功能是将两个有序(由小到大排列)数组中的数据合并到一个数组中,要求合并后的数组依然是由小到大顺序排列,最后输出排序后数组内容。数组中以数据0表示数据的结束。试在横线处填上正确的内容,以实现程序功能。

#include <stdio.h>

void main( )

{ int a[10]={1,4,7,17,23,0};

  int b[10]={2,6,9,10,15,24,45,72,0};3

  int i,j,k,c[20];

  i=j=k=0;

  while ((a[i]!=0)&&(b[j]!=0))

  {

      if(a[i]<b[j])

      {   c[k]=         1         ;

          i++;

      }

      else

      {   c[k]=         2         ;

          j++;

      }

      k++;

  }

  if(a[i]==0)

     while(b[j]!=0)  c[k++]=b[j++];

  if(b[i]==0)

     while(a[j]!=0)  c[k++]=a[j++];

  c[k]=0;

  for(i=0;i<=k-1;i++)  printf("%3d",c[i]);

  printf("\n");

}

要求:

(1)输入并调试上述源程序,对源程序进行编译、连接。

(2)运行并将结果填入表5-2。

(3)分析数组的定义、初始化过程以及与结果的关系。

表5-2 程序测试及结果分析

1

2

填空内容

 a[i]

b[j]

输出数据

结果分析

3. 按照如下方式从头到尾逐字符地对输入字符串is进行处理,以生成输出字符串os并作为结果输出:

(1)若is的当前字符不是数学字符,则将该字符复制到输出字符串os中。

(2)若is的当前字符是一个数学字符,且假定其大小值为n,则将该数字字符替换为n+1个相关字母并存放到输出字符串os中:字符0替换为1个a,字符1替换为2个b,字符2替换为3个c,……,字符9替换为10个j。

例如:当输入字符串为“s1k02”时,输出字符串应为“sbbkaccc”;

      当输入字符串为“abc5uf20t”时,输出字符串应为“abcffffffufcccat”;

程序:

#include<stdio.h>

int main()

{

 char is[1000], os[1000];

 int len, len1;

 int i = 0;

 int j = 0;

 int m;

 gets_s(is);

 len = strlen(is);

 while (i < len)

 {

  if (is[i] >= '0' && is[i] <= '9')

  {

   len1 = is[i] - '0';

   for (m = 0; m <= len1; m++)

   {

    os[j++] = 'a' + len1;

   }

   i++;

  }

 else

   os[j++] = is[i++];

 }

 os[j] = '\0';

 puts(os);

 }

4. 编写程序

编写一个程序,对10个整数排序并统计其中素数的个数(要求10个整数从键盘输入)。

程序:

#include<stdio.h>

int main() {
    int a[10];
    int i, j, temp, sum = 0;

    // 赋值
    for (i = 0; i < 10; i++) {
        scanf_s("%d", &a[i]);
    }

    // 排序 冒泡法
    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9 - i; j++) {
            if (a[j + 1] > a[j]) {
                temp = a[j + 1];
                a[j + 1] = a[j];
                a[j] = temp;
            }
        }
    }

    // 输出一次排好序的数组
    for (i = 0; i < 10; i++) {
        printf("%4d", a[i]);
    }

    // 找素数
    printf("\n");
    for (i = 0; i < 10; i++) {
        int isPrime = 1; // 假设a[i]是一个素数
        for (j = 2; j * j <= a[i]; j++) { // 优化:只需检查到sqrt(a[i])
            if (a[i] % j == 0) {
                isPrime = 0; // a[i]不是素数
                break;
            }
        }
        if (a[i] > 1 && isPrime) { // 1不是素数
            printf("%d YES\n", a[i]);
            sum = sum + 1;
        }
    }

    printf("共有素数%2d个", sum);

    return 0;
}

5.编写程序

已知一个有15个整数组成的一维数组a,另输入一个整数x。编写一个程序,判断x是否在数组a中。若是,给出信息 “YES!;否则,给出信息“NO!”。

程序:

#include<stdio.h>

int main()

{

 int a[15] = { 1,2,3,4,5,6,7,8,9,10,16,23,42,56,77 };

 int low = 0, mid, high = 14, x;

 printf("请输入要查找的数x=");

 scanf_s("%d", &x);

 do

 {

  mid = (low + high) / 2;

  if (x == a[mid])

  {

   printf("YES!\n"); break;

  }

  else if (x > a[mid])low = mid + 1;

  else high = mid - 1;

 } while (low <= high);

 if (low > high)printf("NO!\n");

}

6.编写程序

用数组来处理求Fibonacci数列问题。编程输出数列的前40项,要求每行输出5个数据,每个数据输出时占8列宽度。

程序:

#include<stdio.h>

int main()

{

 int i;

 int f[40] = { 1,1 };

 for (i = 2; i < 30; i++)

  f[i] = f[i - 2] + f[i - 1];

 for (i = 0; i < 30; i++)

{

  if (i % 5 == 0)printf("\n");

  printf("%8d", f[i]);

 }

 printf("\n");

 return 0;

}

7.编写程序

编写一个程序,求10个整数中最大、最小值及所处的位置。

程序:

#include <stdio.h>

int main()

{

 int a[10], i, p = 0, q = 0, max, min;

 printf("输入10个整数:");

 for (i = 0; i < 10; i++)

  scanf_s("%d", &a[i]);

 max = a[0];

 min = a[0];

 for (i = 1; i < 10; i++)

 {

   if (max < a[i])

   {

     max = a[i];

    p = i;

   }

  if (min > a[i])

  {

   min = a[i];

   q = i;

  }

 }

 printf("最大值为 % d, 对应的下标为 % d; 最小值为 % d, 对应的下标为 % d\n", max, p, min, q);

}

8.编写程序

编写程序,输入正整数m,它代表人民币的m元。试求得这样一个方案,使用最小张数的人民币(如k张),凑成上述的钱数m,并输出求得结果。注意,目前共有7种元以上面

值的人民币纸币,其面值分别为:100、50、20、10、5、2、1。

序执行后的输入输出交互界面可设计为:

m=? 192↙

1(100)   1(50)  2(20)  1(2)

最小张数k=5

程序:

#include<stdio.h>

int main()

{

 int m;

 int a[7] = { 100,50,20,10,5,2,1 };

 static int b[7];

 printf("请输入数m=");

 scanf_s("%d", &m);

 for (int i = 0; i < 7; i++)

 {

  b[i] = m / a[i];

  m = m % a[i];

 }

 for (int j = 0; j < 7; j++)

 {

  if (b[j] == 0)continue;

  printf("%3d (%3d)", b[j], a[j]);

 }

 return 0;

}

9.编写程序

将输入的十进制正整数转换为罗马数据。假设罗马数据中只使用“基值”字母:M、D、C、L、X、V、I,分别用来表示1000、500、100、50、10、5、1。

例如:十进制数1985应转换为罗马数据MDCCCCLXXXV

程序:

#include<stdio.h>

int main()

{

 int a[7] = { 1000,500,100,50,10,5,1 };

 int b[7] = { 0 };//放有几个1000,500

 char c[7] = { 'M','D','C','L','X','V','I' }; //定义字符型的一维数组,数组类型 数组名[数组长度]  赋值方法有三种:直接赋值,间接赋值(用键盘)

int n;

 printf("请输入一个十进制整数n:");

int n;

 printf("请输入一个十进制整数n:");

 scanf_s("%d", &n);//1985

for (int i = 0; i < 7; i++)

 {

  if (n >= a[i])

  {

   b[i] = n / a[i];

   n = n % a[i];

  }

 }

 for (int j = 0; j < 7; j++)//j=0,j=1

 {

  for (int k = 0; k < b[j]; k++)// b[j]  k=0<b[0]  k=1<b[0]  k=0,0<b[1]

  {

   printf("%c", c[j]);

  }

 }

 return 0;

}

10.编写程序

用折半查找方法,在元素呈升序排列的具有15个元素的数组a中,查找值为key的那个元素的序号(即下标号)并输出,其中key值通过健盘输入。若数组中没有值为key的元素,则提示信息“No such element!”。

所谓的折半查找方法如下:先key值与处于15个元素“中间”的那个元素进行比较,若恰好相等,则那个“中间”元素的序号即为所求;若key值大于那个“中间”元素,则将查找范围缩小到数组的后一半去继续查找,否则将查找范围缩小到前一半去继续查找。

程序:

#include<stdio.h>

int main()

{

 int a[15], i, key;

 //赋值

 for (i = 0; i < 15; i++)

  a[i] = i + 1;



 for (i = 0; i < 15; i++)

//折半

 printf("%3d", a[i]);

 printf("\n");

 scanf_s("%d", &key);

//折半

 int low = 0;

 int high = 14;

 int mid = 0;

 while (low <= high)

 {

  mid = (low + high) / 2;

  if (key < a[mid]) high = mid - 1;

  if (key > a[mid]) low = mid + 1;

  if (key == a[mid]) break;

 }

 if (low > high)

  printf("No such element!");

 else printf("key 在数组中的下标为:%d\n", mid);

 return 0;

}

程序测试及运行结果:

3.

4.

5.

6.

7.

8.

9.

10.

结果分析与讨论:

1.通过实验总结一维数组的定义、初始化的语法形式。

答:

        定义:类型说明符  数组名 [常量表达式];

        初始化的语法形式:
        (1).完全初始化     
        int a[5] = { 1, 2, 3, 4, 5 };
        (2).部分初始化,没有赋值的元素默认值为0    
        int a[6] = { 1, 2, 3 };前三个分别赋值为1,2,3,后边没赋值他们就为0。
        (3).不指定数组长度,系统会根据元素个数定义数组的长度。
int a[] = { 1, 2, 3, 4, 5 };

2.理解求极值、排序、查找、数组合并等算法的设计思想,对这些算法进行分析、总结,找出其特点。

答:

        可以先画N-S流程图,在根据流程图写代码。

        将数组初始化,可进行一定的赋值,通过冒泡法,折中查找法进行排序和查找以及数值的比较。

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了一li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值