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流程图,在根据流程图写代码。
将数组初始化,可进行一定的赋值,通过冒泡法,折中查找法进行排序和查找以及数值的比较。