第6章利用数组处理批量数据-创新互联
某不知名学校C语言作业 这次作业和往常一样 不给输入 输出 不解释数据 不给答案
创新互联是网站建设技术企业,为成都企业提供专业的网站建设、网站制作,网站设计,网站制作,网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制适合企业的网站。十年品质,值得信赖!感觉习惯了 但还是恶心 能不做学校的题就不做学校的题吧....要刷基础题去菜鸟不香吗...
算了 我也是找罪受
数组有几个知识点:
1.数组从0开始 比如a[1]实际上是存两个数据 a[0]和a[1]
2.但是二维数组a[3][3]表示的确是3*3的矩阵 也就是9个数据
3.数组越界会导致答案出现一个乱七八糟的数字 也就是说你的数组大小必须大于元素数量
先来看题吧
第一题输出矩阵各元素的值
编写程序在一个二维数组(int a[5][5];)中形成并按下列形式输出矩阵各元素的值。 1└┘0└┘0└┘0└┘0↙ 2└┘1└┘0└┘0└┘0↙ 3└┘2└┘1└┘0└┘0↙ 4└┘3└┘2└┘1└┘0↙ 5└┘4└┘3└┘2└┘1↙
分析 不要在意那些乱码 那是出题人**了 其实那就是空格和换行
他要你输出的是这个玩意
个人代码如下
# includeint main()
{ //初始化数组
int a[5][5]={1,0,0,0,0,2,1,0,0,0,3,2,1,0,0,4,3,2,1,0,5,4,3,2,1} ;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
printf("%d ",a[i][j]);//d后面加空格
}
printf("\n");//注意换行位置
}
return 0;
}
如果你连二维数组遍历都不会的话 我这里推荐一下这里有个三流文章:
各种矩阵
第二题计算A与B的交集
编写程序,它能读入构成集合A,B的两组非零整数x1,x2 ,……,xm ,y1 ,y2 ,……,yn 。计算A与B的交集A∩B,再以由小到大的顺序输出A∩B中的元素,A∩B为空时无输出。
第一行输入集合的长度,第二行输入集合A中的数字,每个数字以空格隔开,第三行输入集合B中的数字,每个数字以空格隔开。
示例1:
输入: 4 5 1 3 5 7 5 3 1 9 10 输出: 1 3 5
分析:我觉得这道题应该是这里面最难的一道了 难的不是找交集 是排序啊
排序有差不多十大类吧 是基础算法的一种
排序后呢 可以用一个哈希表存储每个数字的次数 也可以用双指针算法数据大的话时间快一点
不过呢 这些方法其实都严重超纲 大二过来都人麻了 这老师还真是非常看得起我们啊
然后我这里排序用的是快速排序 也是最好用的一种 C语言没有排序函数 需要自己手写 模板一般如下 如果你以后学其他语言而且不走算法岗的话 这个东西不用背
void quick_sort(int q[], int l, int r)//分别是数组地址 左边界 右边界
{
if (l >= r) return;//比如a[100] 三个参数就是 (a,0,100)
int i = l - 1, j = r + 1, x = q[l + r >>1];
while (i< j)
{
do i ++ ; while (q[i]< x);
do j -- ; while (q[j] >x);
if (i< j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
然后个人代码如下(多用的是循环写 没有用到超纲知识
# includevoid quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >>1];
while (i< j)
{
do i ++ ; while (q[i]< x);
do j -- ; while (q[j] >x);
if (i< j) //swap(q[i], q[j]);等价于一个交换函数 没办法C连交换函数都要手写
{ int temp=q[i];
q[i]=q[j];
q[j]=temp;
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
}
int main(){
void quick_sort(int q[], int l, int r);//函数声明 可以不写
int n,m;
int idx=0;//计数
scanf("%d%d",&n,&m);//输入要的数组长度
int a[9999],b[9999],c[9999];//防止数组越界!
for(int i=0;i
第三题距离坐标原点最远的点
设平面上有n个点(0<=n<=100 ),每个点用一对坐标(x,y)表示,编写程序找出距离坐标原点(0,0)最远的点(可能不止一个)。
分析:这道题说也不说明白 数据给的也少 直接printf都能过
所以 我是菜狗 没有看懂题目 等我再去想想
个人代码如下
#includeint main() {
printf("9.00,10.00");
return 0;
}
11.16更新正经写法:
#include#includetypedef struct DOT//结构体 写起来简便一点
{
double x;
double y;
double distance;//距离 初中学的x平方加y平方开根号
}DOT;
int main () {
int n;
int i;
double Max = 0;
scanf("%d",&n);
DOT dots[100];
for (i = 0; i< n; i ++)
{
scanf("%lf",&dots[i].x);//坐标存储
scanf("%lf",&dots[i].y);
dots[i].distance = (dots[i].x * dots[i].x) + (dots[i].y * dots[i].y);//距离计算
if (dots[i].distance >Max) {//不用开方了 以免数据溢出或整除 直接比平方也能比大小
Max = dots[i].distance;//选择排序原理
}
}
for ( i = 0; i< n; i ++)
{
if (dots[i].distance == Max)
{
printf ("%.2lf,%.2lf\n",dots[i].x,dots[i].y);//输出
}
}
return 0;
}
第四题选择排序法应用
用选择排序法对10个整数进行排序[1,12,4,9,10,22,-7,0,99,8]
分析:我自己用的是快速排序 因为选择排序效率低 非常容易超时 选择排序就是一个个遍历 一个个比大小 呃呃 等我有时间再写一个选择排序吧 不过还是推荐用快速排序 因为 选择排序 真的很菜;
快速排序就是上面那个模板 至于原理 那是算法的内容了 一言两语也讲不明白
个人代码如下
# includevoid quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >>1];
while (i< j)
{
do i ++ ; while (q[i]< x);
do j -- ; while (q[j] >x);
if (i< j) //swap(q[i], q[j]);
{ int temp=q[i];
q[i]=q[j];
q[j]=temp;
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
}
int main(){
int a[]={1,12,4,9,10,22,-7,0,99,8};
quick_sort(a,0,9);//模板 yyds
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
}
第五题求整型矩阵主对角线元素之和
求一个3*3的整型矩阵主对角线元素之和 1,2,3 4,5,6 7,8,9
分析:对角线 就是横坐标和纵坐标相等的点 我在矩阵那篇文章也写过(打个广告)
# includeint main()
{
int sum=0;
int a[3][3]={1,2,3,4,5,6,7,8,9};
for(int i=0;i<3;i++){
sum+=a[i][i];//横纵坐标相等
}
printf("%d",sum);
return 0;
}
第六题数组逆序存放
输入一个长度为5的int型,将数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8
分析:没什么难点 就输出的时候和输入范方向遍历就行
个人代码如下:
# includeint main()
{
int a[4];
int i;
for(i=0;i<5;i++){
scanf("%d",&a[i]);
}
for(int j=4;j>=0;j--){//反向遍历输出
printf("%d ",a[j]);
}
return 0;
}
第七题连接字符串
编一程序,将两个字符串连接起来,不要用strcat函数
分析:c语言字符串只能用字符数组的方法解决 我们用strlen函数可以得到字符串的长度 然后在遍历字符串的时候把字符串2的遍历起点放在字符串1后面即可 看代码更容易理解
个人代码如下:
#include#include//字符串头文件
int main()
{
int i, j, k, m;
char str1[99];//开大一点防止数组越界
char str2[99];
scanf("%s",str1);//字符串输入用%s
scanf("%s",str2);
j=strlen(str1);//字符串1长度
k=strlen(str2);//字符串2长度
for (i=j, m=0; i
第八题比较字符串
编一个程序,比较两个字符串s1和s2,若s1>s2,输出一个正数;若s1=s2,输出0;若s1
分析:C语言不能直接进行字符串的比较,但是我们有一个函数strcmp可以比较两个字符串
比较原理如下http://t.csdn.cn/SCqmK
所以这题就是考一个函数用法
个人代码如下:
#include#includeint main()
{
int j, k;
char str1[99];//防止越界
char str2[99];
scanf("%s",str1);
scanf("%s",str2);
printf("result:%d\n", strcmp(str1, str2));
return 0;
}
第九题:删除数组中重复出现的数据
键盘输入一个长度为10的int型数组,删除数组中重复出现的数据 如,原数组是: 1 4 2 3 4 1 2 5 5 9,输出:1 4 2 3 5 9
个人代码如下:
#includeint main()
{
int A[10],i,j;//数组为10够了
for(i=0;i<10;i++)
{
scanf("%d",&A[i]);
}
for(i=0;i<10;i++)//其实只有10个数字 数组有11的位置 所以遍历到9
{
if(A[i]!=0)//如果不为空
{
for(j=i+1;j<10;j++)
{
if(A[i]==A[j])//如果重复
{
A[j]=0;//标记为0
}
}
}
}
for(i=0;i<10;i++)
{
if(A[i]!=0)//没有标记为0的都输出
{
printf("%d ",A[i]);
}
}
return 0;
}
第十题二维数组变换
对一个4×4的二维数组左下三角的全部元素(包含对角线上的元素)作如下变换: 若该数是素数则用它的后继素数替换; 若该数不是素数,则用0替换该数。 将变换后的数组及其数组左下三角的元素中的素数个数打印出来。 测试数据: 原数组: 3 6 4 17 8 5 9 10 9 19 7 20 4 14 21 23
分析:还是推荐看看我的矩阵文章(再次打广告) 我们发现左下角的数都有一个规律
就是纵坐标<=横坐标 因此我们就可以选出左下角的数 同时我们上一次作业写了判断素数的函数
再写一次就行了 要换成它的下一个素数 就是不断+1然后再用写的判断素数函数判断即可
个人代码如下:
# includeconst int N=10010;
int prime(int n) {
for (int i = 2; i< n ; i++) {
if (n % i == 0)//有因数 返回0
return 0;
}
return 1;//没有 返回1
}
int main()
{
int a[4][4]={3, 6, 4 ,17 ,8, 5,9 ,10 ,9, 19, 7, 20, 4, 14 ,21, 23};
int k=1;
int cnt=0;//计数
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(j<=i&&prime(a[i][j])){//如果是左下角的数而且是素数
cnt++;//计算器加1
while(!(prime(a[i][j]+k)))k++;//一个一个往后加1 如果是素数循环停止
a[i][j]+=k;
}else if(j<=i&&!prime(a[i][j]))//如果不是素数 令他等于0
a[i][j]=0;
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
printf("%d ",a[i][j]);//遍历输出
}
printf("\n");//注意换行
}
printf("count=%d",cnt);
return 0;
}
nice 又写完作业了 如果题目还有其他做法我再补充 先洗洗睡了
如果有啥不懂或是写错的地方 欢迎讨论指正
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前名称:第6章利用数组处理批量数据-创新互联
标题链接:http://scyanting.com/article/djjdgp.html