练习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天。
输出格式:
在一行输出日期是该年中的第几天。
输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
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"。
输入样例1:
m
programming
输出样例1:
index = 7
输入样例2:
a
1234
输出样例2:
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");
}