赞
踩
练习7-2 求最大值及其下标 (20 分)
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。
- 6
- 2 8 10 1 9 10
10 2
- #include <stdio.h>
- #include <stdlib.h>
- /*函数:找出数组中的最大值及其下标*/
- void find_max(int *p,int n)
- {
- int i=0,max_f,sign_d;
- max_f=*p;//假设数组的首位为最大值并记录下标
- sign_d=0;
- while(++i<n)//遍历数组
- if(*(p+i)>max_f)//分别与最大值 max_f 比较
- {
- max_f=*(p+i);//找到更大值 赋给 max_f
- sign_d=i;//记录最大值下标
- }
- printf("%d %d\n",max_f,sign_d);//输出结果
- }
- /*函数:获取 n 个值的数组*/
- void input_sz(int *p,int n)
- {
- printf("Input %d integer:\n",n);
- int i,j;
- for(i=0;i<n;i++)
- {
- scanf("%d",&j);
- *(p+i)=j;
- }
- }
- int main(int argc, char *argv[]) {
- int n;
- printf("input a positive integer: ");
- scanf("%d",&n);//读入正整数 n
- int a[n];//创建数组
- input_sz(a,n);//调用函数
- find_max(a,n);//调用函数
- system("pause");
- return 0;
- }
练习7-3 将数组中的数逆序存放 (20 分)
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
- 4
- 10 8 1 2
2 1 8 10
- #include <stdio.h>
- #include <stdlib.h>
- /*函数:逆序*/
- void Reverse_order(int *p,int n)
- {
- int i=0,temp;
- while(i<n)//遍历数组,首尾逐一调换
- {
- temp=*(p+i);
- *(p+i)=*(p+n-1);
- *(p+n-1)=temp;
- i++;//首部后移
- n--;//尾部前移
- }
- }
- /*函数:获取数组*/
- void input_sz(int *p,int n)
- {
- //printf("Input %d integer:\n",n);
- while(n-->0)//循环输入 n 项
- scanf("%d",&*(p++));
- }
- /*函数:输出数组*/
- void output_sz(int *p,int n)
- {
- while(n-->1)//循环输出前 n-1 项
- printf("%d ",*(p++));
- printf("%d",*p);//输出最后 1 项
- printf("\n\n");//完成输出
- }
- int main(int argc, char *argv[])
- {
- //printf("input a positive integer: ");
- int n;
- scanf("%d",&n);//读入正整数 n
- int a[n];//创建数组
- input_sz(a,n);//调用函数
- Reverse_order(a,n);//调用函数
- output_sz(a,n);//调用函数
- system("pause");
- return 0;
- }
练习7-4 找出不是两个数组共有的元素 (20 分)
给定两个整型数组,本题要求找出不是两者共有的元素。
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
- 10 3 -5 2 8 0 3 5 -15 9 100
- 11 6 4 8 2 6 -5 9 0 100 8 1
3 5 -15 6 4 1
- #include <stdio.h>
- #include <stdlib.h>
- int Count=0;//全局变量记录输出次数
- /*查找元素是否为数组中的元素*/
- int compare_zish(int x,int *pa,int n)
- {
- int i,count_s=0;//每次循环,计数器归零
- for(i=0;i<n;i++) //遍历数组 a[n] 之前的元素
- if(*(pa+i)==x) //元素已经存在于数组 a 中
- {
- count_s++;//已经存在,找计数器 +1
- break;//进入下次循环,取消重复比较
- }
- return count_s;
- }
- int compare_shuchu(int pa)
- {
- if(Count==0) //首次输出
- printf("%d",pa);
- else //非首次输出,先输出 '空格'
- printf(" %d",pa);
- Count++; //输出计数器 +1
- }
- /*查找不是两数组共有的元素*/
- void find_shuzu(int *pa,int na,int *pb,int nb)
- {
- int i;
- for(i=0;i<na;i++)//数组 a 的元素,不在数组 b 中
- if(!compare_zish(*(pa+i),pa,i)&&!compare_zish(*(pa+i),pb,nb))
- compare_shuchu(*(pa+i));
- }
- /*函数:获取数组*/
- void input_sz(int *p,int n)
- {
- int i;
- for(i=0;i<n;i++)//循环输入 n 项
- scanf("%d",&*(p+i));
- }
- /*主函数*/
- int main(int argc, char *argv[])
- {
- int a[20],b[20];//创建数组
- int na;
- scanf("%d",&na);//读入正整数 n
- input_sz(a,na);//调用输入函数
- int nb;
- scanf("%d",&nb);//读入正整数 n
- input_sz(b,nb);//调用输入函数
- /*调用函数,顺序输出数组 a 中元素不是两数组共有的元素*/
- /*自身元素相同,不重复查找*/
- find_shuzu(a,na,b,nb);
- find_shuzu(b,nb,a,na);
- printf("\n\n");//输出结束,换行
- return 0;
- }
练习7-7 矩阵运算 (20 分)
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
- 4
- 2 3 4 1
- 5 6 1 1
- 7 1 8 1
- 1 1 1 1
35
- #include <stdio.h>
- #include <stdlib.h>
- /*函数:计算*/
- int js_sz(int **p,int n)
- {
- int i,j,result=0;
- for(i=0;i<n-1;i++)//双层循环遍历二位数组,i<n-1 最后一行
- for(j=0;j<n-1;j++)//j<n-1 去掉最后一列
- if(j+i+1!=n)//不在反对角线的数值则求和
- result+=*(*(p+i)+j);
- printf("%d\n",result);//循环完毕,输出结果
- }
- /*函数:获取数组*/
- int input_sz(int **p,int n)
- {
- int i,j;
- for(i=0;i<n;i++)//循环输入 n 项
- for(j=0;j<n;j++)
- scanf("%d",&*(*(p+i)+j));
- return n;
- }
- /*函数:输出数组*/
- /****输出函数不在练习要求的范围内****
- void output_sz(int **p,int n)
- {
- int i,j;
- for(i=0;i<n;i++)
- for(j=0;j<n;j++)//循环输出前 n-1 项
- if(j==n-1)
- printf("%2d\n",*(*(p+i)+j));
- else
- printf("%2d ",*(*(p+i)+j));
-
- printf("\n");//完成输出
- }
- ****输出函数不在练习要求的范围内****/
- int main(int argc, char *argv[])
- {
- int i,n;
- scanf("%d",&n);//读入正整数 n
- int a[n][n];//创建数组
- /*二级指针和二位数组并不是对应关系,需要动态申请二位数组对应行数的指针数组*/
- int **p=NULL;//定义二级指针
- p=(int **)malloc(sizeof(int *)*n);//要访问的数组有 n 行,所以申请 n 个一维指针变量。
- for(i = 0; i < n; i ++)
- {
- p[i] = a[i];//将二维数组行地址赋值到对应的一维指针上。
- }
- input_sz(p,n);//调用输入函数,获取数组 a
- //output_sz(p,n);//调用输出函数 ,输出数组 a
- js_sz(p, n);/*调用函数,计算*/
- // printf("\n\n");//输出结束,换行
- // system("pause");
- free(p);//释放为p申请的内存
- return 0;
- }
练习7-8 方阵循环右移 (20 分)
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
- 2 3
- 1 2 3
- 4 5 6
- 7 8 9
代码(扩展了,循环左移)
- #include <stdio.h>
- #include <stdlib.h>
- /*函数:输出数组*/
- void output_sz(int **p,int n)
- {
- int i,j;
- for(i=0;i<n;i++)//循环输出
- for(j=0;j<n;j++)
- if(j==n-1)
- printf("%2d \n",*(*(p+i)+j));//行末换行
- else
- printf("%2d ",*(*(p+i)+j));
- //printf("\n");//完成输出,换行
- }
- /*函数:循环移动*/
- int yid_sz(int **p,int m,int n)
- {
- int i,j,k,t;
- for(i=0;i<n;i++)//行循环
- {
- for(j=0;j<m;j++)//移动次数控制
- {
- /******循环左移******/
- /* k=0;
- t=p[i][k];
- for(;k<n;k++)
- p[i][k]=p[i][k+1];
- p[i][n-1]=t;
- */
- /******循环右移******/
- /**/ k=n-1;
- t=*(*(p+i)+k);
- for(;k>0;k--)
- *(*(p+i)+k)=*(*(p+i)+k-1);
- p[i][0]=t;
- /**/
- }
- }
- }
- /*函数:获取数组*/
- int input_sz(int **p,int n)
- {
- int i,j;
- for(i=0;i<n;i++)//循环输入 n*n 项
- for(j=0;j<n;j++)
- scanf("%d",&*(*(p+i)+j));
- return n;
- }
- /*主函数*/
- int main(int argc, char *argv[])
- {
- int i,m,n;
- scanf("%d%d",&m,&n);//读入正整数 n
- int a[n][n];//创建数组
- /*二级指针和二位数组并不是对应关系,需要动态申请二位数组对应行数的指针数组*/
- int **p=NULL;//定义二级指针
- p=(int **)malloc(sizeof(int *)*n);//要访问的数组有 n 行,所以申请 n 个一维指针变量。
- for(i = 0; i < n; i ++)
- {
- p[i] = a[i];//将二维数组行地址赋值到对应的一维指针上。
- }
- input_sz(p,n);//调用输入函数,获取数组 a
- // output_sz(p,n);
- yid_sz(p,m,n);/*调用函数,计算*/
- output_sz(p,n);//调用输出函数 ,输出数组 a
- // printf("\n\n");//输出结束,换行
- // system("pause");
- free(p);
- return 0;
- }
练习7-9 计算天数 (15 分)
本题要求编写程序计算某年某月某日是该年中的第几天。
输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。
在一行输出日期是该年中的第几天。
2009/03/02
61
2000/03/02
62
代码:(除题目要求用 '/' 分隔外,实现在英文状态下,任意非数字字符分隔)
- #include "stdio.h"
- #include "stdlib.h"
- #include "string.h"
- /*非闰年月份日期计算*/
- int month_d(int i)
- {
- //默认为非闰年,按照 2 月 28 天计算当前月之前累积天数
- int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
- int sum=0;
- while(--i>0) sum+=a[i];
- return sum;
- }
- /*增加闰年天数*/
- int year_r(int year)
- {
- return (year%4==0&&year%100!=0||year%400==0)>0?1:0;//闰年 1 非闰年 0
- }
- /*函数:字符串按分隔符转化 年 月 日 为数字*/
- //英文输入法下任意非数字字符分隔
- int ymd_sz(char *p,int *qd)
- {
- while(*p++!='\0')
- if(*p-'0'>=0&&*p-'0'<=9)
- *qd=*qd*10+(*p-'0');
- else
- *qd++;
- }
- /*输入函数*/
- void input_sz(char *p)
- {
- char c,*pc;
- pc=p;
- printf("Input a data (yyyy/mm/dd)\n");
- //输入结束,回车,在新的一行 输入Ctrl+z 结束输入
- printf("finished < Ctrl+z >.\n");
- while((c=getchar())!=EOF)
- *pc++=c;
- }
- /*主函数*/
- int main(int argc, char *argv[])
- {
- char *p,ap[11]={0}; //定义字符串及指针,存放输入字符串
- p=ap;
- int *qd,bqd[3]={0};//定义数组及指针,存放 年 月 日
- qd=bqd;
- input_sz(p);//调用输入函数,获取字符串 a
- ymd_sz(p,qd);//字符串转化
- printf("%d\n",year_r(qd[0])+month_d(qd[1])+qd[2]);//输出天数
- system("pause");
- return 0;
- }
练习7-10 查找指定字符 (15 分)
本题要求编写程序,从给定字符串中查找某指定的字符。
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
- m
- programming
index = 7
- a
- 1234
Not Found
- #include "stdio.h"
- #include "stdlib.h"
- #include "string.h"
- /*函数:查找字符,记录最大下标*/
- int find_sz(char mac,char *p)
- {
- int i=0,j=0;
- while(*(p+i)!='\0') //遍历字符串
- {
- if(*(p+i)==mac)//找到字符
- j=i;//记录下标
- i++;
- }
- return j;
- }
- /*输出函数*/
- void output_sz(int n)
- {
- if(n>0)
- printf("index = %d\n",n);
- else
- printf("Not Found\n");
- }
- /*输入函数*/
- void input_sz(char *p)
- {
- //printf("Input a string:\n");
- gets(p);
- }
- /*主函数*/
- int main(int argc, char *argv[])
- {
- char mac,*p,ap[81]={0};
- p=ap;
- //printf("Input a char for find: ");
- mac=getchar();//输入要查找的字符
- fflush(stdin);//清除缓存,准备接收字符串
- input_sz(p);//调用输入函数,获取字符串 ap
- output_sz(find_sz(mac,p));//输出查找字符结果
- //system("pause");
- return 0;
- }
练习7-11 字符串逆序 (15 分)
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
在一行中输出逆序后的字符串。
Hello World!
!dlroW olleH
- #include "stdio.h"
- #include "stdlib.h"
- #include "string.h"
- /*函数:查找字符,记录最大下标*/
- void Reverse_order(char *p,int n)
- {
- int i=0,j;
- j=n-1;
- char cp;
- while(i<j) //遍历字符串
- {
- cp=*(p+i);
- *(p+i)=*(p+j);
- *(p+j)=cp;
- j--;
- i++;
- }
- }
- /*输出函数*/
- void output_sz(char *p)
- {
- puts(p);
- }
- /*输入函数*/
- void input_sz(char *p)
- {
- //printf("Input a string:\n");
- gets(p);
- }
- /*主函数*/
- void main(int argc, char *argv[])
- {
- char *p,ap[81]={0};
- p=ap;
- fflush(stdin);//清除缓存,准备接收字符串
- input_sz(p);//调用输入函数,获取字符串 ap
- Reverse_order(p,strlen(ap));//调用函数,逆序字符串
- output_sz(p);//输出逆序字符串
- //system("pause");
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。