【C语言学习】课后作业记录
介绍
- 本文是作者学习C语言的记录,初学上路,误撞勿怪。
- 本文所有代码均已成功运行,如有错误,可能是编辑本文时误操作所致。
- 本文所有代码仅为完成任务,漏洞颇多,输入数据时请规范输入。
1、调试下列错误程序,使之具有如下功能:输入 12 个整数,按每行 3 个数输出这些整数,最后输出 12 个整数的平均值。写出调试过程。
#include <stdio.h>
#define N 12
main()
{
int i,a[N],av;
for(i=0;i<N;i++) scanf("%d",a[i]);
for(i=0;i<N;i++)
{
printf("%d",a[i]);
if(i%3==0) printf("\n");
}
for(i=0;i!=N;i++) av+=a[i];
printf("av=%f\N",av);
}
上面给出的程序有错误和缺陷,请找出程序中的错误并改正。
【提示】请注意输入提示、变量赋初值、循环结束条件、输出格式等问题。
代码调试过程如下:
#include <stdio.h>
#define N 12
int main() //加一个int
{
int i,a[N],b=1; //赋值av为0,定义b变量,值为1
float av=0; //改变av变量类型并赋值av为0
printf("请输入%d个整数:\n",N); //加一个输入提示
for(i=0;i<N;i++)scanf("%d",&a[i]); //加一个&
for(i=0;i<N;i++,b++) //添加b++
{
printf("%-3d ",a[i]); //%d改为%-3d,输出更美观
if(b%3==0) printf("\n"); //条件对象改为b
}
for(i=0;i<=N-1;i++)av+=a[i]; //N改为N-1
printf("总和:%.1f\n",av); //添加一个提示
av=av/N; //搬出"/N"
printf("平均值:%.2f\n",av); //删除"/N"
return 0; //添加一个返回值
}
运行结果:
2、编写程序,任意输入 10 个整数的数列,并按从小到大的顺序进行排序。10个整数用 scanf 函数输入。排序的方法很多,教材介绍了冒泡排序法,算法如下:
① 定义变量,输入排序数据数 n 和待排序的 n 个数据。
② n 个数排序要进行 n-1 遍。
以下是一遍排序(第 i 遍)的算法:
③ 设本趟排序中没有交换,即 flag=0。
④ 从下标 j=n-1 的元素起,到 i+1 个元素,比较 a[j]与 a[j-1]:若 a[j]<a[j-1],将 a[j]与 a[j-1]交换;并置 flag=1。
⑤ 若没有交换(flag=0),排序完成,退出循环。
⑥ 输出排序结果。
上述算法的①、⑥在 main 函数中实现,其余各步调用 sort 函数完成。主函数如下:
#include <stdio.h>
int a[100]; /* 外部数组 */
main()
{
int i,n;
void sort(int); /* 说明被调函数 */
printf("请输入排序的数据个数 n:");
scanf("%d",&n);
printf("请输入要排序的%d 个整数:",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(n); /* 调用 sort 函数完成排序 */
printf("排序结果:");
for(i=0;i<n;i++) printf("%6d",a[i]);
printf("\n");
}
请编写 sort 函数(注意:函数只有一个形参 int n)。
代码如下:
#include <stdio.h> //冒泡排序
int a[50]={}; // 外部数组
int main()
{
void sort(int); //说明被调函数
int i,n;
printf("请输入排序的数据个数n:\n");
scanf("%d",&n);
printf("请输入要排序的%d个整数:\n",n);
for(i=0;i<n;i++)scanf("%d",&a[i]);
sort(n); //调用sort函数完成排序
printf("从小到大排序结果为:\n");
for(i=0;i<n;i++)printf("%-3d",a[i]);
printf("\n");
return 0;
}
void sort(int n)
{
int b,c,d,i,j;
for(i=n-1;i>=0;i--)
{
for(b=0;b<i;b++)
{
if(a[b]>a[b+1])
{
c=a[b];
a[b]=a[b+1];
a[b+1]=c;
}
}
}
}
运行结果:
3、有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。
#include <stdio.h>
#define M 3
#define N 4
main()
{
int max,i,j,r,c;
int a[M][N]={{123,94,-10,218},{3,9,10,-83},{45,16,44,-99}};
max=a[0][0];
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(a[i][j]>max)
{
max=a[i][j];
r=i;
c=j;
}
printf("max=%d,row=%d,colum=%d\n",max,r,c);
}
输入并调试、运行程序,记录程序的输出;若将a[0][0]改为1230,观察程序运行结果是否有错,应如何修改程序?
修改后代码如下:
#include <stdio.h>
#define M 3
#define N 4
void main()
{
int max,i,j,r=1,c=1;//这里赋值r,c为1
int a[M][N]={{1230,94,-10,218},{3,9,10,-83},{45,16,44,-99}};//这里将a[0][0]改为1230
max=a[0][0];//这里不变
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
r=i+1;//这里改为了i+1
c=j+1;//这里改为了j+1
}
}
}
printf("最大值:%d\n行:%d\n列:%d\n",max,r,c);
}
运行结果:
4、将一个数组中的值按逆序重新存放,例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。
代码如下:
#include <stdio.h>//冒泡型逆序排序
int a[40]={};
int main()
{
void reverse(int);
int n,c;
printf("请输入排序的数据个数n:\n");
scanf("%d",&n);
printf("请输入要排序的%d个整数:\n",n);
for(c=0;c<n;c++)scanf("%d",&a[c]);
reverse(n);
printf("逆序排列后:\n");
for(c=0;c<n;c++)printf("%-3d",a[c]);
printf("\n");
return 0;
}
void reverse(int n)
{
int i,j,d,e;
for(e=n-1;e>=0;e--)
{
for(i=0;i<e;i++)
{
d=a[i];
a[i]=a[i+1];
a[i+1]=d;
}
}
}
运行结果:
5、最常用的排序方法除了冒泡排序外,还有选择排序。
程序设计思路:
设有10个元素a[0]~a[9],将a[0]与a[1]~a[9]比较,若a[0]比a[1]~a[9]都小,则不进行交换,即无任何操作。若a[1]~a[9]中有一个以上比a[0]小,则将其中最小的一个(假设为a[i])与a[0]交换,此时a[0]中存放了10个中最小的数。
第二遍将a[1]与a[2]~a[9]比较,将剩下9个数中的最小者a[i]与a[1]对换,此时a[1]中存放的是10个中第2小的数。依此类推,共进行9遍比较,a[0]到a[9]就已按由小到大顺序存放。
用冒泡排序同样的主函数,请根据上面的N-S图编写选择排序函数。
代码如下:
#include <stdio.h> //选择排序
int a[50]={}; // 外部数组
int main()
{
void sort(int); //说明被调函数
int i,n;
printf("请输入排序的数据个数n:\n");
scanf("%d",&n);
printf("请输入要排序的%d个整数:\n",n);
for(i=0;i<n;i++)scanf("%d",&a[i]);
sort(n); //调用sort函数完成排序
printf("从小到大排序结果为:\n");
for(i=0;i<n;i++)printf("%-3d",a[i]);
printf("\n");
return 0;
}
void sort(int n)
{
int b,k,i,j;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[k])
{
k=j;
}
}
b=a[i];
a[i]=a[k];
a[k]=b;
}
}
运行结果:
作者留言
由于时间仓促,本文没有代码注释和代码解说,后面会视情况补充。