#include <stdio.h>
int main()
{
float minmax(float a[], int n, float *p, float *q);
float arr[100],max,min,average;
int n,i;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%f",&arr[i]);
average=minmax(①);
printf("average=%.2f, max=%.2f, min=%.2f\n", average, max, min);
return 0;
}
float minmax(float a[],int n,float *p,float *q)
{
float sum=0,*pi=a;
*p=a[0];
*q=a[0];
while(②)
{
sum+=*pi;
if(*p<*pi)
③
else if(*q>*pi)
④
pi++;
}
return ⑤;
}
程序已经修改,请见下图源码:
#include <stdio.h>
int main()
{
float minmax(float a[], int n, float *p, float *q);
float arr[100],max,min,average;
int n,i;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%f",&arr[i]);
average=minmax(arr,n,&max,&min);
printf("average=%.2f, max=%.2f, min=%.2f\n", average, max, min);
return 0;
}
float minmax(float a[],int n,float *p,float *q)
{
float sum=0,*pi=a;
*p=a[0];
*q=a[0];
while(*pi!=null)
{
sum+=*pi;
if(*p<*pi)
*p=*pi;
else if(*q>*pi)
*q=*pi;
pi++;
}
return sum/n;
}
N=3,则打印:
1 2 3
8 9 4
7 6 5
又如,N=4,则打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
放个图吧!
话不多数,直接上代码
我尽可能的写上注释,如果有不理解的,欢迎留言。
#include<stdio.h>
main()//函数入口,主函数
{
int i,j,k,l;//循环标注位
int a=1;
int n;
int arry[100][100];//用于存放数组
scanf("%d",&n);//接收输入的N,用于确定需要打印多少阶的矩阵
i=j=k=l=0;//统一初始化一下,避免出错
l=n;//先用 l 接收N的数值用于最后的输出
//因为接下来的操作会修改源N的值
while(1){//每完成一圈,循环一次,循环条件为一直循环,
for(j=k;j<n;j++){//按要求填充第一行的矩阵,行号 i 不变,列号j自加;
arry[i][j]=a;
a++;
}
j--;//上一个循环会多加一次,这里减去
a--;
for(i=k;i<n;i++){//按要求填充最右边的一列。
arry[i][j]=a;
a++;
}
i--;
a--;
for(j=n-1;j>k;j--){//按要求填充最下面的一行
arry[i][j]=a;
a++;
}
for(i=n-1;i>k;i--){//按要求填充最左边的一列
arry[i][j]=a;
a++;
}
i++;
if(arry[i+1][j]==(n*n)) break;//跳出条件,如果已经填充了所有位置,则跳出
//到此完成一轮循环
n--;//然后右边界减一
k++;//左边界也减一
}
for(i=0;i<l;i++){//这里就是填充完成以后,打印填充过得区域
for(j=0;j<l;j++){
printf("%d ",arry[i][j]);
}
printf("\n");//换行
}
}
第一次写,完全是自己的思路,可能不是很详细。如果有需要记得留言,我会考虑再做一个详细的讲解。
点个关注吧 亲 !点个赞也行啊。
问题一:
实现过程如下:
1.首先说明一下,输入n个数字,需要使用for循环,每次循环中使用scanf()输入一个数字即可; 2.输入完毕后,分别计算这些数字的平均值、最大值、最小值,这可以通过一次for循环实现,循环中通过if语句和变量记录计算即可; 3.最后输出平均值、最大值、最小值,注意格式的设置。
代码如下:
#include <stdio.h>
int main() {
int n, i;
double avg = 0, max, min, sum = 0;
printf("请输入n个数字:\n");
scanf("%d", &n);
scanf("%lf", &max); // 输入第一个数,初始化max和min
scanf("%lf", &min);
sum = max + min;
for (i = 3; i <= n; i++) {
double num;
scanf("%lf", &num);
if (num > max) {
max = num;
}
if (num < min) {
min = num;
}
sum += num;
}
avg = sum / n; // 计算平均值
printf("平均值为:%.2lf\n最大值为:%.2lf\n最小值为:%.2lf\n", avg, max, min); // 输出结果
return 0;
}
当输入数字1,2,3,4,5时,输出平均值为3.00,最大值为5.00,最小值为1.00。
问题二:
实现过程如下:
1.输入圈子人的数量,使用数组给这些人编号; 2.用指针指向编号数组的头部,利用while循环进行循环操作,当仅剩下一个人的时候结束; 3.在循环中,使用if语句计数和对头上编号为0的人进行操作,报数每次加1,报数到3的人头上编号改为0,标记退出,并统计退出的人数,退出人数等于总人数减1时结束; 4.最后循环结束后,输出剩下的一个人的编号。
代码如下:
#include <stdio.h>
void main() {
int num[50], n, *p, j, loop, i, m, k;
printf("请输入这一圈人的数量:\n");
scanf("%d", &n);
p = num;
// 开始给这些人编号
for (j = 0; j < n; j++) {
*(p + j) = j + 1;
}
i = 0; // i用于计数,即让指针后移
m = 0; // m记录退出圈子的人数
k = 0; // k报数1,2,3
while (m < n - 1) // 当退出的人数不大于总人数时,即留下的人数至少是一个人
//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
{
if (*(p + i) != 0) //如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
{
k++;
}
if (k == 3) {
k = 0; // 报数清零,即下一个人从1开始报数
*(p + i) = 0; //将报数为3的人编号重置为0
m++; //退出人数加1
}
i++; //指针后移
if (i == n) //这句很关键,如果到了队尾,就要使指针重新指向对头
//并且它只能放在i++后面,因为只有i++了才有可能i==n
{
i = 0;
}
}
printf("现在剩下的人是:");
for (loop = 0; loop < n; loop++) {
if (num[loop] != 0) {
printf("%2d号\n", num[loop]);
}
}
}
参考资料:
CSDN:算法笔记 之 鱼丸的代码板子集锦;
CSDN:二轮笔试和一轮技术面试心得(19年年底);
百度文库:预约-OI题解集合.