《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流程图,在根据流程图写代码。

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

CSU 大一上 C语言实验报告 (1)教材第2章编程题第2题:编写计算球体体积的程序。 说明:本题声明适当变量,用户键入数据,运算并输出结果,较简单。 (2)教材第2章编程题第8题:编写程序计算第一、第二、第三月还贷后剩余贷款金额。 说明:本题要求用户输入总额、利率、每月还贷净额,输出每月剩余,对输入输出、类型定义考查。 (3)教材第3章编程题第2题:编写程序实现对用户输入的产品信息进行格式化。 说明:本题考查格式化输入输出、转义字符的运用。 (4)教材第4章编程题第4题:编写程序实现将输入的整数按八进制输出。 说明:本题重在考查简单的运算符和表达式运用。 (5)用户输入一个三位数,输出各位数字之和。 说明:本题重在考查如何从一个整数中取出每一个数字。 (6)教材第5章编程题第5题:编写程序计算用户输入所得额的税金。 说明:本题考查简单的选择结构。 (7)教材第5章编程题第11题:编写程序实现将用户输入的两位数转化为英文。 说明:本题考查switch语句的应用。 (8)教材第6章编程题第8题:编写程序显示单月日历,用户指定这个月的天数和该月起始日是星期几。 说明:本题考查循环结构和选择结构的综合应用,判断是否一个星期最后一天,换行符。 (9)教材第6章编程题第11题:编程序实现利用无穷级数法估计e的值。 说明:本题考查根据公式设计循环结构并实现。 (10)因子之和等于其本身的数称为完数,如28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28为完数。编程序找出2~5000中的完数。 说明:本题利用变量i在2~5000中变化,判断其是否是完数。 (11)教材第7章编程题第12题:编程计算从左至右求值的表达式的值。 说明:本题考查对运算符和操作数的判断。 (12)教材第7章编程题第14题:编程序用牛顿计算法计算浮点数平方根。 说明:本题考查对循环结构的掌握,对表达式的合理运用,对基本类型的理解。 (13)教材第8章编程题第14题:编写程序颠倒句子中单词的顺序。 说明:本题考查对字符数组的处理,对一些循环选择结构的理解。 (14)教材第8章编程题第15题:编写程序实现凯撒密码加密。 说明:本题考查对字符数组的掌握,对字符处理的理解。 (15)编程序实现将用户输入的数字字符串转化为整数输出。 说明:本题考察对字符、整数关系的掌握与理解,对循环结构的熟练运用。 (16)教材第9章编程题第1题:编写选择排序的函数,并递归调用。 说明:本题利用函数简化程序、使得结构更清晰、熟练掌握。 (17)教材第9章编程题第7题:编写计算xn的函数。 说明:本题考查函数定义、调用,并初步考察递归运用。 (18)教材第10章编程题第6题:编写程序实现逆波兰运算。 说明:本题考查对程序每部分的理解、掌握,外部、内部变量,主函数,小函数的编写与应用。初步了解栈的一些实现函数。 (19)编程序找出2~5000中满足条件的数x:x是素数且x的每位数字是素数、每位数字之和是素数,如23、223、2333等。 说明:本题考查函数方法与循环选择结构的综合运用。 (20)教材第11章编程题第3题:用指针变量编写简化一个分数的函数。 说明:本题用来解决函数无法传回传递的实际参数,指针变量。 (21)教材第12章编程题第2题:编写函数读入用户输入的一条消息,检测是否是回文,分别用数组、指针来解决。 说明:本题可以体会到数组与指针的特点,利用指针的便利。 (22)利用指针编写程序,实现从键盘键入字符串,将此字符串从m个字符开始的n个字符复制成另一个字符串。 说明:本题用指针指向字符串,进行跟踪和复制操作。 (23)教材第13章编程题第5题:编写程序实现对输入命令行参数求和。 说明:本题加深对命令行参数的理解、考查知识的综合应用。 (24)教材第16章编程题第5题:用结构变量解决搜索离用户输入时间最近的航班信息,并输出。 说明:本题考查结构与数组的结合运用,有助于理解结构。首先,定义一个存储起飞、到达时间的结构,再定义一个该类型的数组,循环搜索即可。 (25)教材第17章编程题第5题:用指针数组存储键入的字符串,对数组排序。 说明:本题应用动态分配内存、数组排序,考查综合能力。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

了一li

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

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

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

打赏作者

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

抵扣说明:

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

余额充值