1、输入一个3行4列的二维数组,然后输出这个二维数组的所有元素
int main()
{
int a[3][4];
int i,j;
//输入数据
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
//输出数据
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
2、用字符指针排序奥运会参与国家(小到大)
//China
//American
//Austria
//India
//Japan
#define MAX_LEN 10
#define N 150
#include <string.h>
void sortString(char *pStr[],int n);//指针数组
int main()
{
int n;
printf("总共有多少个国家?\n");
scanf("%d",&n);
getchar();
//输入
char name[N][MAX_LEN];
char *pStr[N];//定义指针数组
printf("输入各个国家名:\n");
for(int i=0;i<n;i++)
{
pStr[i]=name[i];//name的第0行首地址给pStr[0]、name的第1行首地址给pStr[1]......
gets(pStr[i]);//每次输入一个字符串
}
//排序
sortString(pStr,n);//把指针数组传进去
//输出
printf("输出各个国家名:\n");
for(int i=0;i<n;i++)
{
puts(pStr[i]);//输出排序后的n个字符串
}
return 0;
}
void sortString(char *pStr[],int n)
{
char *temp=NULL;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(strcmp(pStr[j],pStr[i])<0)
{
temp=pStr[i];
pStr[i]=pStr[j];
pStr[j]=temp;
}
}
}
}
3、计算输出n阶矩阵的转置矩阵,n由用户从键盘输入
#define N 10
//向矩阵中输入数据
void InputMarix(int a[][N],int n);
//转置
void Transport(int a[][N],int n);
//输出
void PrintMatrix(int a[][N],int n);
//交换
void Swap(int *x,int *y);
int main()
{
int n;
int a[N][N];
printf("Input n:");
scanf("%d",&n);
//向矩阵中输入数据
InputMarix(a,n);
//转置
Transport(a,n);
//输出
printf("转置后为:\n");
PrintMatrix(a,n);
return 0;
}
void Swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
void InputMarix(int a[][N],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
}
void PrintMatrix(int a[][N],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
}
void Transport(int a[][N],int n)
{
int temp[N];
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
//a[i][j]=a[j][i];
Swap(&a[i][j],&a[j][i]);
}
}
}
4、下列给定程序中,函数fun()的功能是求出数组中最小数和次最小数,并把最小数和a[0]中的数对调,次最小数和a[1]中的数对调。
注意:
(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。
(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
(3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。
#include <stdio.h>
#define N 20
void fun(int *a,int n)
{
int i, m, t, k;
//考察选择法排序
for(i=0; i<2; i++)//要求最小数分别和a[0]与a[1]对调 (循环两遍)
{
m=i;//假设m最小
for(k=i; k<n; k++)
{
if(a[k]<a[m])
m=k;
}
if(m!=i)
{
t=a[m];
a[m]=a[i];
a[i]=t;
}
}
}
int main()
{
int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
for(i=0; i<n; i++)
printf("%d ",b[i]);
printf("\n");
fun(b,n);
for(i=0; i<n; i++)
printf("%d ", b[i]);
printf("\n");
return 0;
}
5、程序改错。在一个3x4矩阵中找出最大数及最大数所在元素的下标。
#include <stdio.h>
#define M 3
#define N 4
int FindMax(int (*p)[N],int m,int n, int *pRow, int *pCol);
int main()
{
int score[M][N], i, j, maxScore, row, col;
for ( i=0; i<M; i++ )
{
for ( j=0; j<N; j++ )
{
scanf("%d", &score[i][j]);
}
}
maxScore = FindMax(score, M, N, &row, &col);
printf("%d %d %d\n", maxScore, row+1, col+1);
return 0;
}
int FindMax( int (*p)[N], int m, int n, int *pRow, int *pCol )
{
int i, j, max;
max = *(p)[0];//假设二维数组第一行第一个元素最大
*pRow = 0;
*pCol = 0;
for (i=0; i<m; i++)
{
for (j = 0; j<n; j++)//j要从0开始(这里不是一维数组,不是j=i+1,不要搞混)
{
if ( *(*(p+i)+j) > max )//相当于if ( a[i][j] > max ) //行解引用了一次列解引用了一次
{
max = *(*(p+i)+j) ;
*pRow = i;
*pCol = j;
}
}
}
return max;
}
6、利用结构体数组计算每个学生的平均分
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
DATE birthday;
int score[4];
}STUDENT;
int main()
{
int sum[30];//计算4门课的总分
STUDENT stu[30]={
{100310121,"小刚",'M',{1991,5,19},{72,83,90,82}},
{100310122,"小明",'M',{1992,8,20},{88,92,78,78}},
{100310123,"小红",'F',{1991,9,19},{98,72,89,66}},
{100310124,"小莉",'F',{1992,3,22},{87,95,78,90}}
};
for(int i=0;i<4;i++)
{
sum[i]=0;//初始化为0分!!!
for(int j=0;j<4;j++)
{
sum[i]+=stu[i].score[j];
}
printf("%10ld%8s%3c%6d/%02d/%02d%4d%4d%4d%4d%6.1f\n",
stu[i].studentID,
stu[i].studentName,
stu[i].studentSex,
stu[i].birthday.year,
stu[i].birthday.month,
stu[i].birthday.day,
stu[i].score[0],
stu[i].score[1],
stu[i].score[2],
stu[i].score[3],
sum[i]/4.0
);
}
return 0;
}
7、
编程统计候选人的得票数。设有3个候选人li、zhang、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,
若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。要求用结构体数组candidate表示3个候选人的姓名和得票结果。
例如:
Input vote 1:li
Input vote 2:li
Input vote 3:Zhang
Input vote 4:wang
Input vote 5:zhang
Input vote 6:Wang
Input vote 7:Zhang
Input vote 8:wan
Input vote 9:li
Input vote 10:lii
Election results:
li:3
zhang:3
wang:2
Wrong election:2
输入格式:
"Input vote %d:"
"%s"
输出格式:
"Election results:\n"
候选人姓名+"%8s:%d\n"
"Wrong election:%d\n"
#include <string.h>
struct candidate
{
char name[20];
int count;
}candidate[3]={{"li",0},{"zhang",0},{"wang",0}};
int main()
{
int flag=1;//废票
int wrong=0,i=0,j=0;
//10个选民,选民每次输入一个得票的候选人的名字
char name[20];
for(i=0;i<10;i++)
{
printf("Input vote %d:",i+1);
scanf("%s",name);//输入候选人名字
//不写这句sse不通过,因为输入可能会有大写要全转为小写(用函数strlwr),转大写用(strupr)
strlwr(name);
flag=1;//这句不要漏
for(j=0;j<3;j++) //不要把j老写顺手写成i,导致找半天错没找出来
{
if(strcmp(name,candidate[j].name)==0)
{
candidate[j].count++;//被投票的+1
flag=0;//不是废票
}
}
if(flag)
{
wrong++;//废票
flag=0;
}
}
printf("Election results:\n");
for(i=0;i<3;i++)
{
printf("%8s:%d\n",candidate[i].name,candidate[i].count);//结构体里的第i个元素的name值和count值
}
printf("Wrong election:%d\n",wrong);
return 0;
}
8、
将任一整数转换为二进制形式。
**输入格式要求:"%d" 提示信息:"Input number:"
**输出格式要求:"number of decimal form:%d\n" " it\'s binary form: "
程序运行示例如下:
Input number:876
number of decimal form:876
it's binary form: 00000000000000000000001101101100
/*
将十进制正整数18转换成二进制数的具体计算方法如下:
18/2=9 余0;
9/2=4 余1;
4/2=2 余0;
2/2=1 余0;
1/2=0 余1;
将以上的余数结果按倒序的方式书写,转换成二进制即为:10010
*/
void decimalToBinary(int decimal)
{
//要想前面补0,这里必须初始化为0
int binary[32]={0};//假设整数不会超过32位
int i=0;
while(decimal>0)
{
binary[i]=decimal%2;
decimal /=2;
i++;
}
//输出二进制数,前面补0直达32位
printf(" it\'s binary form: ");
for(int j=31;j>=0;j--)//倒着输出 //注意是j=31不是32
{
printf("%d",binary[j]);
}
//如果二进制数不足32位,补0
// for(int k=i;k<32;k++)
// {
// printf("0");
// }
printf("\n");
}
int main()
{
int num;
printf("Input number:");
scanf("%d",&num);
printf("number of decimal form:%d\n",num);
decimalToBinary(num);
return 0;
}
9、
打印出以下图案:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
输出格式:"%3c"
行与行之间无空行
注意:中间一行前面没有多余的空格,每行在*后没有空格直接输出换行
int main()
{
int i,j,k;//i控制行,j控制列
char c='*';
char a=' ';
for(i=0;i<=3;i++)
{
for(j=0;j<3-i;j++)
printf("%3c",a);
for(k=0;k<=2*i;k++)
printf("%3c",c);
printf("\n");
}
for(i=0;i<=2;i++)
{
for(j=0;j<i+1;j++)
printf("%3c",a);
for(k=0;k<=4-2*i;k++)
printf("%3c",c);
printf("\n");
}
return 0;
}
10、
下面程序用于从键盘输入3*4矩阵的元素,通过调用函数FindMax,求出这3*4矩阵元素中的最大值及其所在行列位置,
然后输出这个最大值及其所在行列下标位置(注意下标从0开始)。(找出其中的4处错误,并改正之)
#include <stdio.h>
int FindMax(int x[3][4],int *pRow,int *pCol);
main()
{
int a[3][4], max, i, j, row, col;
for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
{
scanf("%d",&a[i][j]);
}
}
max = FindMax(a,&row,&col);
printf("max=%d,row=%d,col=%d\n",max,row,col);
}
int FindMax(int x[3][4],int *pRow,int *pCol)
{
int max, i, j;
max = x[0][0];
for (i=0; i<3; i++)
{
for (j=0; j<4; j++)
{
if (x[i][j] > max)
{
max = x[i][j];
*pRow = i+1;
*pCol = j+1;
}
}
}
return max;
}
11、
下面程序使用选择排序算法,对从键盘输入的学生成绩按降序排序,请找出其中的错误,并改正之。
#include<stdio.h>
#define N 40
void ReadScore(int score[], int n)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d", &score[i]);
}
}
void WriteScore(int score[], int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ", score[i]);
}
}
void Swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void DataSort(int score[], int n)
{
int i, j, k;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if (score[j] > score[k])
{
k = j;
}
}
if (k != i)
{
Swap(&score[k],&score[i]);
}
}
}
int main()
{
int score[N],aver,n;
printf("Input n:\n");
scanf("%d",&n);
ReadScore(score, n);
DataSort(score,n);
WriteScore(score,n);
return 0;
}
12、下面程序使用选择排序算法,对从键盘输入的学生成绩按降序排序,请找出其中的错误,并改正之。
#include<stdio.h>
#define N 40
void ReadScore(int score[], int n)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d", &score[i]);
}
}
void WriteScore(int score[], int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ", score[i]);
}
}
void Swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void DataSort(int score[], int n)
{
int i, j, k;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if (score[j] > score[k])
{
k = j;
}
}
if (k != i)
{
Swap(&score[k],&score[i]);
}
}
}
int main()
{
int score[N],aver,n;
printf("Input n:\n");
scanf("%d",&n);
ReadScore(score, n);
DataSort(score,n);
WriteScore(score,n);
return 0;
}
-------SSE中等题------------------------------------------------------------------------------------------------
------------一维数组部分中等题---------------------------
1、从键盘输入n个整数,用函数编程实现计算其最大值和最小值,
并互换它们所在数组中的位置。
void ReadData(int a[], int n);
void PrintData(int a[], int n);
void MaxMinExchang(int a[], int n);
int main()
{
int a[10]={0};
int n;
printf("Input n(n<=10):\n");
scanf("%d",&n);
ReadData(a,n);
MaxMinExchang(a,n);
PrintData(a,n);
return 0;
}
void ReadData(int a[], int n)
{
//读入数据
printf("Input %d numbers:\n",n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void PrintData(int a[], int n)
{
//输出数据
printf("Exchange results:");
for(int i=0;i<n;i++)
{
printf("%5d",a[i]);
}
printf("\n");
}
void MaxMinExchang(int a[], int n)
{
int max=-9999;
int min=9999;
int maxpos=-1,minpos=-1;
for(int i=0;i<n;i++)
{
if(a[i]>max)
{
maxpos=i;
max=a[i];
}
if(a[i]<min)
{
minpos=i;
min=a[i];
}
}
a[maxpos]=min;
a[minpos]=max;
//或者可以像下面一样写
// 确保maxpos和minpos不是初始值-1
if (maxpos != -1 && minpos != -1)
{
// 交换最大值和最小值
int temp = a[maxpos];
a[maxpos] = a[minpos];
a[minpos] = temp;
}
}
2、
下面两个表示8个产品时的固定成本和可变成本
float fixed[] = { 11.31, 12.12, 13.67, 11.91, 12.30, 11.8, 11.00, 12.00 } ;
float variable[] = { 1.12, 1.13, 3.14, 1.35, 2.20, 1.28, 1.00, 2.10 } ;
写一个程序输入编号为1到8的产品号以及生产的数量,输出生产这种产品的总成本。
注:总成本=固定成本+产品个数*可变成本
**输入格式要求:"%d"
提示信息:"请输入产品号(1-8):" "请输入该种产品的生产数量:"
**输出格式要求:"生产编号为%d,数量为%d的产品的总成本为%.2f\n"
//int main()
//{
// int id=0;
// int n=0;
// float cost=0;
// float fixed[] = { 11.31, 12.12, 13.67, 11.91, 12.30, 11.8, 11.00, 12.00 } ;
// float variable[] = { 1.12, 1.13, 3.14, 1.35, 2.20, 1.28, 1.00, 2.10 } ;
// printf("请输入产品号(1-8):");
// scanf("%d",&id);
// printf("请输入该种产品的生产数量:");
// scanf("%d",&n);
// cost=fixed[id-1]+n*variable[id-1];
// printf("生产编号为%d,数量为%d的产品的总成本为%.2f\n",id,n,cost);
//
// return 0;
//}
3、
编写一个程序,将用户输入的十进制短整型正数n转换成二进制数。
如果用户输入负数或者读入错误,则要求用户重新输入
int main()
{
int binary[16]={0};//这里一定要初始化
int n=0;
printf("n=");
scanf("%hd",&n);
int i=0;
while(n!=0)
{
binary[i]=n%2;
n=n/2;
i++;
}
printf("the binary number is ");
for(int j=15;j>=0;j--) //前面用0补 //从最后一个倒序输出
{
printf("%d",binary[j]);
}
return 0;
}
4、编写程序,把一维数组a 输入任意6个整数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[6];
for(int i=0;i<6;i++)
scanf("%d",&a[i]);
for(int i=0;i<6;i++)
{
for(int j=0;j<5;j++)
printf("%d ",a[j]);
printf("%d \n",a[5]);
int temp=a[5];
for(int j=5;j>0;j--)
{
a[j]=a[j-1];
}
a[0]=temp;
}
return 0;
}
------------最值实现(中等题)-------------
1、编程实现一个输入指定范围内的整数的函数getint,其完整的函数原型为:int getint(int min, int max);,它负责接收用户的输入,进行验证,
保证接收的一定是一个介于min和max之间([min, max]区间内)的一个整数并最后返回该整数。如果用户输入不合法,则会提示继续输入,
直到输入合法时为止。要求编写完整的程序并测试你所写的getint函数。已知[min, max]区间为[3,100]。
***输入提示信息***:"请输入[%d..%d]间的一个整数:\n"
***输入数据格式***:在getint()函数中输入数据用"%d"
***输出数据格式***:"请输入[%d..%d]间的一个整数:\n"
"你输入的整数为:%d\n"
程序的运行示例如下:
请输入[3..100]间的一个整数:0
请输入[3..100]间的一个整数:102
请输入[3..100]间的一个整数:200
请输入[3..100]间的一个整数:36
你输入的整数为:36
*/
//int getint(int min, int max);//它负责接收用户的输入,进行验证[min, max]区间内,并最后返回该整数,不合法,则会提示继续输入
//int main()
//{
// int min=3,max=100;
// int ret=getint(min,max);
// printf("你输入的整数为:%d",ret);
//
//}
//int getint(int min, int max)
//{
// int n=0;
// do{
// printf("请输入[%d..%d]间的一个整数:\n",min,max);
// scanf("%d",&n);
// // 清除输入缓冲区中的换行符或其他非数字字符
// while (getchar() != '\n');
// }while(n>max || n<min);
// return n;
//}
2、按如下函数原型,编程实现计算数组a中n个整数的最大值和最小值,并互换它们在数组中的位置。
void MaxMinExchang(int a[], int n);
要求按如下函数原型,用指针做函数参数,实现两个数的互换。
void Swap(int *x, int *y);
在主函数中调用函数ReadData()从键盘输入10个整数,调用函数MaxMinExchang()计算其最大值和最小值并互换它们在数组中的位置,最后调用函数PrintData()输出互换后的数组的各个元素值。
**输入提示信息:"Input 10 numbers:"
**输入格式:"%d"
**输出提示信息:"Exchange results:"
**输出格式:"%5d
*/
#define N 20
void MaxMinExchang(int a[], int n);
void Swap(int *x, int *y);
void ReadData(int a[], int n);
void PrintData(int a[], int n);
int main()
{
int a[N];
int n=10;
printf("Input 10 numbers:");
ReadData(a,n);
MaxMinExchang(a,n);
printf("Exchange results:");
PrintData(a,n);
return 0;
}
void ReadData(int a[], int n)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void Swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
void MaxMinExchang(int a[], int n)
{
//计算其最大值和最小值并互换它们在数组中的位置(没要排序)
//用单层循环就行
int maxpos=0,minpos=0;
for(int i=0;i<n;i++)
{
if(a[i]>a[maxpos])
{
//max=a[j];
maxpos=i;
}
if(a[i]<a[minpos])
{
//min=a[j];
minpos=i;
}
}
if(maxpos != minpos)
Swap(&a[maxpos],&a[minpos]);
}
void PrintData(int a[], int n)
{
for(int i=0;i<n;i++)
{
printf("%5d",a[i]);
}
}
3、要求:从键盘输入10个不同的整数存入一个数组中,用函数编程将其中的最大数与最小数位置互换,分别输出互换之前最大值和最小值及其在数组中的位置,以及互换后的数组
函数原型:void MaxMinExchang(int a[], int n);
输入提示信息:"Input 10 numbers:"
输入格式:"%d"
最大值输出提示信息:"Max element position:%d,Max element:%d\n"
最小值输出提示信息:"Min element position:%d,Min element:%d\n"
数组输出提示信息:"Exchange results:"
数组输出格式:"%4d"
程序运行结果示例:
Input 10 numbers:0 2 7 4 9 11 5 47 6 97↙
Max element position:9,Max element:97
Min element position:0,Min element:0
Exchange results: 97 2 7 4 9 11 5 47 6 0
#define N 20
void MaxMinExchang(int a[], int n);
void Swap(int *x, int *y);
void ReadData(int a[], int n);
void PrintData(int a[], int n);
int main()
{
int a[10];
int n=10;
//从键盘输入10个不同的整数存入一个数组中
ReadData(a,n);
//最大数与最小数位置互换
MaxMinExchang(a,n);
//输出
PrintData(a, n);
return 0;
}
void ReadData(int a[], int n)
{
printf("Input 10 numbers:");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void PrintData(int a[], int n)
{
printf("Exchange results:");
for(int i=0;i<n;i++)
{
printf("%4d",a[i]);
}
}
void Swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
void MaxMinExchang(int a[], int n)
{
int maxPos=0,maxValue=a[0];
int minPos=0,minValue=a[0];
for(int i=0;i<n;i++)
{
if(a[i]>maxValue)
{
maxPos=i;
maxValue=a[i];
}
if(a[i]<minValue)
{
minPos=i;
minValue=a[i];
}
}
Swap(&a[maxPos],&a[minPos]);
//打印最大位置,最大值,最小位置,最小值
printf("Max element position:%d,Max element:%d\n",maxPos,maxValue);
printf("Min element position:%d,Min element:%d\n",minPos,minValue);
}
4、 从键盘输入某班学生某门课的成绩和学号(最多不超过40人),当输入为负值时,表示输入结束,用函数编程通过返回数组中最大元素的下标,查找并输出成绩的最高分及其所在的学生学号。
**输入格式要求:"%ld%d" 提示信息:"Input student’s ID and score:" "input error!\n"
**输出格式要求:"Total students are %d\n" "The highest is:%ld, %d\n"
程序运行示例如下:
Input student’s ID and score:070310122 84
Input student’s ID and score:070310123 83
Input student’s ID and score:070310124 88
Input student’s ID and score:070310125 87
Input student’s ID and score:070310126 61
Input student’s ID and score:-1 -1
Total students are 5
The highest is:70310124, 88
#define N 40
void ReadData(int score[],int n,long id[]);
int FindMax(int score[],int n,long id[]);
int main()
{
long id[N];
int score[N];
int n=-1;
do{
n++;
printf("Input student’s ID and score:");
scanf("%ld%d",&id[n],&score[n]);
}while(score[n]>0 && id[n]>0);
printf("Total students are %d\n",n);
//查找并输出成绩的最高分及其所在的学生学号
int ret=FindMax(score,n,id);
printf("The highest is:%ld, %d\n",id[ret],score[ret]);
return 0;
}
int FindMax(int score[],int n,long id[])
{
//查找并输出成绩的最高分及其所在的学生学号
int maxScore=score[0];
int maxScoreid=id[0];
int maxPos=0;
for(int i=0;i<n;i++)
{
if(score[i]>maxScore)
{
maxPos=i;
maxScore=score[i];
maxScoreid=id[i];
}
}
return maxPos;
}
5、按如下函数原型计算n名职工的最高月收入:
void FindMax(float income[],long num[],int n,float *pMaxincome,long *pnum);
在主函数中从键盘输入某单位n名职工的月收入及职工号(最多不超过30人,具体人数n由键盘输入),调用函数FindMax()计算职工的最高月收入及职工号。
**输入提示信息:无
**输入格式:输入职工人数用"%d",输入职工号及月收入用"%ld%f"
**输出提示信息和格式:"Maxincome=%.2f\tMnum=%ld\n"(要求在主函数中输出最高收入和职工号)
#define N 40
void FindMax(float income[],long num[],int n,float *pMaxincome,long *pnum);
int main()
{
int n;
float income[N];//收入
long num[N];//职工号
float Maxincome;//最高收入
long Maxnum;//最高收入职工号
scanf("%d",&n);//输入职工人数
for(int i=0;i<n;i++)
{
//输入月收入和职工号
scanf("%ld%f",&num[i],&income[i]);
}
//计算职工的最高月收入及职工号
FindMax(income,num,n,&Maxincome,&Maxnum);
//输出最高收入和职工号
printf("Maxincome=%.2f\tMnum=%ld\n",Maxincome,Maxnum);
return 0;
}
void FindMax(float income[],long num[],int n,float *pMaxincome,long *pnum)
{
float maxincome=income[0];
long maxnum=num[0];
for(int i=0;i<n;i++)
{
if(income[i]>maxincome)
{
maxincome=income[i];
maxnum=num[i];
}
}
*pMaxincome=maxincome;
*pnum=maxnum;//将最大收入对应职工号通过指针返回
}
6、输入5个字符串,输出其中最小的字符串。
**输入格式要求:"%s"
**输出格式要求:"min is %s\n"
程序运行示例如下:
first <===输入5行字符串
second
third
44444
555555
min is 44444 <===此行为输出
*/
/*
#define N 100
#include <string.h>
int main()
{
char str[5][N];
char temp[100];
//输入字符串
for(int i=0;i<5;i++)
{
scanf("%s",str[i]);
}
//输出最小的字符串
strcpy(temp,str[0]);
for(int j=0;j<5;j++)
{
if(strcmp(str[j],temp)<0)
strcpy(temp,str[j]);
}
printf("min is %s\n",temp);
return 0;
}
7、有10个评委参加打分。输入10个评委打的分数(1—10之间的数字),找出一个最高分和一个最低分后,并输出是第几个评委打的最高分,第几个评委打的最低分。
函数原型如下:
void ReadScore(int Score[]) ; //用于输入评委的分数
void MaxMin(int Score[],int *MaxNum,int *MinNum) ;//用于找出最高分和最低分的评委
**输入提示信息:无
**输入格式:"%d"
**输出提示信息及格式:"最高分为第%d个评委,最低分为第%d个评委\n"
按如下框架编写程序:
#include <stdio.h>
voidReadScore(intScore[])
{
}
voidMaxMin(intScore[],int*MaxNum,int*MinNum)
{
}
main()
{
}
#include <stdio.h>
void ReadScore(int Score[]) ; //用于输入评委的分数
void MaxMin(int Score[],int *MaxNum,int *MinNum) ;//用于找出最高分和最低分的评委
void ReadScore(int Score[])
{
for(int i=0;i<10;i++)
{
scanf("%d",&Score[i]);
}
}
void MaxMin(int Score[],int*MaxNum,int*MinNum)
{
int Max=Score[0];//假设最高分和最低分
int Min=Score[0];
for(int i=0;i<10;i++)
{
if(Score[i]>Max)
{
Max=Score[i];
*MaxNum=i;
}
if(Score[i]<Min)
{
Min=Score[i];
*MinNum=i;
}
}
}
int main()
{
int score[10];
int maxnum=0,minnum=0;//最高分和最低分的评委的位置
ReadScore(score);//输入评委的分数
MaxMin(score,&maxnum,&minnum);
//找出最高分和最低分的评委
printf("最高分为第%d个评委,最低分为第%d个评委\n",maxnum+1,minnum+1);
return 0;
}
8、计算数组最大值及最大值下标。数组最多30个元素,数组元素个数n由键盘输入。
请按如下框架编程,在“......”的位置添加缺失的语句,使程序完整。
#include <stdio.h>
void Input(int a[], int n);
int Findmax(int a[], int n, int *pos);
int main()
{
int n, a[30];
int maxNum;//存放数组最大值
int maxPos;//存放最大值下标
printf("Input n:");
scanf("%d", &n);
Input(a, n);
maxNum= Findmax(a,n,&maxPos);//返回最大值
printf("The maximum subscript is:%d,The maximum value is:%d\n", maxPos+1, maxNum);
return 0;
}
//读入数组元素的值
void Input(int a[], int n)
{
int i;
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
}
//计算数组最大值及最大值下标
int Findmax(int a[], int n, int *pos)
{
int i, maxNum;
*pos = 0;
maxNum = a[0];
for(i=0;i<n;i++)
{
if(a[i]>maxNum)
{
maxNum=a[i];
*pos=i;
}
}
return maxNum;
}
9、从键盘输入某班学生某门课的成绩(每班人数最多不超过30人,具体人数由键盘输入),
按如下函数原型,用指针做函数参数编写函数FindMax()计算最高分及相应学生的学号返回给主函数,然后在主函数中输出最高分及相应学生的学号。
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum);
**输入提示信息:
输入学生人数的提示信息为"How many students?"
输入学号和成绩的提示信息为"Input student’s ID and score:\n"
**输入数据格式:输入学生人数用"%d", 输入学号和成绩用"%ld%d"
**输出提示信息和数据格式:"maxScore = %d, maxNum = %ld\n"
按如下框架编写程序:
#include <stdio.h>
#define N 30
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum);
int main()
{
//FindMax()计算最高分及相应学生的学号返回给主函数
//在主函数中输出最高分及相应学生的学号
int n=0;
int score[N];
long num[N];
int MaxScore=score[0];
long MaxNum=num[0];
printf("How many students?");
scanf("%d",&n);
printf("Input student’s ID and score:\n");
for(int i=0;i<n;i++)
{
scanf("%ld%d",&num[i],&score[i]);
}
FindMax(score,num,n,&MaxScore,&MaxNum);
printf("maxScore = %d, maxNum = %ld\n",MaxScore,MaxNum);
}
//函数功能:计算最高分及其相应学生的学号
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum)
{
*pMaxScore=score[0];
*pMaxNum=num[0];
for(int i=0;i<n;i++)
{
if(score[i]>*pMaxScore)
{
*pMaxScore=score[i];
*pMaxNum=num[i];
}
}
}
10、从键盘输入某单位职工的月收入(最多不超过30人),具体人数由键盘输入。试编程输出该单位职最高月收入和最低月收入。
输出格式:printf("min=%10.2f,max=%10.2f\n", );
要求:利用函数计算n名职工的最高和最低月收入。
函数原型:void find_MaxMin(float income[],int n,float *pmax,float *pmin);
#define N 30
void find_MaxMin(float income[],int n,float *pmax,float *pmin);
int main()
{
int n=0;
float income[N];
float max,min;
scanf("%d",&n);
//输入数据
for(int i=0;i<n;i++)
{
scanf("%f",&income[i]);
}
find_MaxMin(income,n,&max,&min);
printf("min=%10.2f,max=%10.2f\n",max,min);
}
void find_MaxMin(float income[],int n,float *pmax,float *pmin)
{
*pmax=income[0];
*pmin=income[0];
for(int i=0;i<n;i++)
{
if(income[i]>*pmax)
{
*pmax=income[i];
}
if(income[i]<*pmin)
{
*pmin=income[i];
}
}
}
11、写一个程序,输入十个整数到数组unsorted中。程序将循环遍历unsorted数组十遍,
每遍选择最小的值拷贝到sorted数组中的下一个可用元素位置,并将unsorted中对应的最小值替换为一个大值(例如9999)。
示例如下:
开始时的unsorted:14 22 67 31 89 11 42 35 65 49
开始时的sorted:
第一遍后的unsorted:14 22 67 31 89 9999 42 35 65 49
第一遍后的sorted:11
第二遍后的unsorted:9999 22 67 31 89 9999 42 35 65 49
第一遍后的sorted:11 14
……
显示sorted数组的值。
**输入格式要求:"%d" 提示信息:"请输入十个整数:\n" "第%d个数:"
**输出格式要求:"%d " 提示信息:"完成后sorted数组的值为:"
int main()
{
int unsorted[10];
int sorted[10];
printf("请输入十个整数:\n");
for(int i=0;i<10;i++)
{
printf("第%d个数:",i+1);
scanf("%d",&unsorted[i]);
}
//功能实现
for(int i=0;i<10;i++)//向sorted中放元素
{
int min=unsorted[0];
int minpos=0;
for(int j=0;j<10;j++)//找unsorted中最小元素
{
if(unsorted[j]<min)
{
min=unsorted[j];
minpos=j;
}
}
unsorted[minpos]=9999;
sorted[i]=min;//向sorted中放元素
}
//输出sorted
printf("完成sorted之后数组的值:");
for(int i=0;i<10;i++)
{
printf("%d ",sorted[i]);
}
return 0;
}
12、要求:从键盘输入10个整数存入一个数组中,用函数编程将其中的最大数与最小数位置互换,然后输出互换后的数组。
函数原型:void MaxMinExchang(int a[], int n);
输入提示信息:"Input 10 numbers:"
输入格式:"%d"
输出提示信息:"Exchang results:"
输出格式:"%4d"
程序运行结果示例:
Input 10 numbers:0 2 7 4 9 11 5 47 6 97↙
Exchang results: 97 2 7 4 9 11 5 47 6 0
void MaxMinExchang(int a[], int n);
int main()
{
int n=10;
int a[10];
printf("Input 10 numbers:");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//最大数与最小数位置互换
MaxMinExchang(a,n);
printf("Exchang results:");
for(int i=0;i<n;i++)
{
printf("%4d",a[i]);
}
return 0;
}
void MaxMinExchang(int a[], int n)
{
int max=a[0];
int min=a[0];
int maxpos=0,minpos=0;
for(int i=0;i<n;i++)
{
if(a[i]>max)
{
max=a[i];
maxpos=i;
}
if(a[i]<min)
{
min=a[i];
minpos=i;
}
}
a[maxpos]=min;
a[minpos]=max;
}
13、键盘输入10个整数,用函数编程实现计算其最大值和最小值,并互换它们所在数组中的位置。
要求按如下函数原型编写程序
void ReadData(int a[], int n);
void PrintData(int a[], int n);
void MaxMinExchang(int a[], int n);
**输入提示信息要求:
"Input n(n<=10):\n"
"Input %d numbers:\n"
**要求输入格式为:"%d"
**输出提示信息:"Exchange results:"
**要求输出格式为:"%5d"
输出数组中所有数据后换行
注:不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程。
void ReadData(int a[], int n);
void PrintData(int a[], int n);
void MaxMinExchang(int a[], int n);
int main()
{
int n=0;
int a[10];
printf("Input n(n<=10):\n");
scanf("%d",&n);
ReadData(a,n);
MaxMinExchang(a,n);
printf("Exchange results:");
PrintData(a,n);
return 0;
}
void ReadData(int a[], int n)
{
for(int i=0;i<n;i++)
{
printf("Input %d numbers:\n",i);
scanf("%d",&a[i]);
}
}
void MaxMinExchang(int a[], int n)
{
int max=a[0];
int min=a[0];
int maxpos=0,minpos=0;
for(int i=0;i<n;i++)
{
if(a[i]>max)
{
max=a[i];
maxpos=i;
}
if(a[i]<min)
{
min=a[i];
minpos=i;
}
}
a[maxpos]=min;
a[minpos]=max;
}
void PrintData(int a[], int n)
{
for(int i=0;i<n;i++)
{
printf("%5d",a[i]);
}
}
---------改错题(中等题)----------------
1、
求100~200间的全部素数(即质数),要求每行输出10个素数。
下面程序中存在比较隐蔽的错误,
请通过分析和调试程序,发现并改正程序中的错误。
注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,才得满分。
#include <stdio.h>
main()
{
int m,k,i,n;
for(m=101;m<=200;m+=2)
{
if(n%10==0)
printf("\n");
k=sqrt(m);
for(i= 1;i<=k;i++)
if(m%i==0)
continue;
if(i==m%10)
{
printf("%d ",m);
n++;
}
}
}
#include <stdio.h>
#include <math.h>
int main()
{
int m,k,i,n=0;//初始化
for(m=101;m<=200;m+=2)//从101开始检查奇数(因为偶数肯定不是素数)
{
if(n%10==0)
{
printf("\n");
}
k=(int)sqrt(m);//强制类型转换
for(i= 2;i<=k;i++)
{
if(m%i==0)
{
break;
}
}
if(i>k)//如果循环正常结束,没有被break打断,则m是素数
{
printf("%d ",m);
n++;//增加已经输出素数的计数
}
}
return 0;
}
---------日期转换(中等题)--------------
1、背景:钟面上的时针和分针之间的夹角总是在 0 度~ 359 度之间。
举例来说,在十二点的时候两针之间的夹角为 0 度,而在六点的时候夹角为 180 度,在三点的时候为 90 度。
本题要解决的是计算 0:00 到 12:00之间任意一个时间的夹角。
输入:要求输入必须为 小时h分钟m的格式,如12h00m, 5h43m等,其他形式的输入都不接收,
如 12,00 或5h43等输入都不被接收,而且需要对“小时”和“分钟”进行数值有效判断(小时在[0,12],分钟在[0.60]之间),不满足以上要求时,需要重新输入。
在程序中首先打印:Please input time(e.g: 5h43m),然后输入时间。
格式为:
"Please input time(e.g: 5h43m)\n"
"%d%c%d%c"
输出:对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。
格式为:
"At %d:%02d the angle is %.1f degrees.\n"
如:
输入“12h00m”时,输出 At 12:00 the angle is 0.0 degrees.
输入“5h43m” 时,输出 At 5:43 the angle is 86.5 degrees.
输入“5h5m” 时,输出 At 5:05 the angle is 122.5 degrees.
提示1:以表中心到12点的连线为基准,分针每走1分钟是6度,时针与基准的夹角每个小时也是30度,从整点开始,每过1分钟时针再增加0.5度。
要求结果角度为正值,即最终要取绝对值(fabs函数)
提示2:二者之间角度不应大于180度,如果大于,应用360度减去该角度。
//计算 0:00 到 12:00之间任意一个时间的夹角。
#include <math.h>
int main()
{
int hour,minute;
char ch1,ch2;
while(1)
{
printf("Please input time(e.g: 5h43m)\n");
if(scanf("%d%c%d%c",&hour,&ch1,&minute,&ch2)==4 && ch1=='h' && ch2=='m' && hour>=0 && hour<=12 && minute>=0 && minute<=59)
{
break;//输入有效跳出循环
}
else{
while(getchar()!='\n');//清除缓冲区直到换行符
printf("Invalid input.Please try again.\n");
}
}
//计算夹角
double angleMinute=minute*6.0;//1分钟6度
//如果时间是 3:30,那么时针不仅仅在90度位置,还会因为过了30分钟而稍微向前移动。因此,总角度是 90 + 30 * 0.5 = 90 + 15 = 105 度。
double angleHour=(hour%12)*30+minute*0.5;//分针走一圈,时针走30度,分钟走1分钟,时针走0.5度
double angle=fabs(angleHour-angleMinute);//两指针之间的夹角
if(angle>180)
{
angle=360-angle;
}
//用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。
printf("At %d:%02d the angle is %.1f degrees.\n",hour,minute,angle);
return 0;
}
2、给定某年某月某日,将其转换成这一年的第几天并输出。
**输入格式要求:"%d%d%d"
**输出格式要求:"%d"
程序运行示例如下:
2012 11 8
313
int main()
{
int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int year,month,day=0;
int leap=1;
//leap=((year%4==0 && year!=100)||(year%400==0));//leap=1是闰年
printf("给定年月日(eg.2024 3 22):\n");
scanf("%d%d%d",&year,&month,&day);
for(int i=1;i<month;i++)
{
if((year%4==0 && year!=100)||(year%400==0))
{
leap=1;//是闰年
}
else leap=0;
day=day+a[leap][i];
//day=22+a[1][1]=53
//day=53+a[1][2]=72
}
printf("%d",day);
return 0;
}
3、按如下函数原型,用指针做函数参数,编程实现两个元素值的交换。
void Swap(int *x, int *y);
在主函数中输入数组元素的个数n,然后分别调用函数ReadData()输入数组a和数组b的元素值,
在循环语句中调用函数Swap()交换数组a和数组b的对应元素的值,最后在主函数中分别调用函数PrintData()输出数组a和数组b的元素值。
**输入提示信息:
"Input array size(n<=10):"
"Input array a:"
"Input array b:"
**输入格式:"%d"
**输出提示信息:
"Output array a:"
"Output array b:"
**输出格式:"%5d"
请按如下框架编程:
#include <stdio.h>
#define N 10
void ReadData(int a[], int n);
void PrintData(int a[], int n);
void Swap(int *x, int *y);
int main()
{
int a[N], b[N], i, n;
printf("Input array size(n<=10):");
scanf("%d",&n);
printf("Input array a:");
ReadData(a,n);
printf("Input array b:");
ReadData(b,n);
//交换a和b两个数组元素
for(int i=0;i<n;i++)
{
Swap(&a[i],&b[i]);
}
printf("Output array a:");
PrintData(a,n);
printf("Output array b:");
PrintData(b,n);
return 0;
}
//函数功能:输入数组a的n个元素值
void ReadData(int a[], int n)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
//函数功能:输出数组a的n个元素值
void PrintData(int a[], int n)
{
for(int i=0;i<n;i++)
{
printf("%5d",a[i]);
}
printf("\n");
}
//函数功能:两整数值互换
void Swap(int *x, int *y)
{
int temp=0;
temp=*x;
*x=*y;
*y=temp;
}
4、 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题):
输入某一年的第几天,计算并输出它是这一年的第几月第几日。
函数功能: 对给定的某一年的第几天,计算它是这一年的第几月第几日
函数入口参数:整型变量year,存储年。整型变量yearDay,存储这一年的第几天
函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量
整型指针pDay,指向存储第几日的整型变量
函数返回值: 无
void MonthDay(int year, int yearDay, int *pMonth, int *pDay);
输入提示信息:"Please enter year, yearDay:"
输入格式:"%d,%d"
输出提示信息和格式:"month = %d, day = %d\n"
void MonthDay(int year, int yearDay, int *pMonth, int *pDay);
int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int main()
{
int year=0,yearDay=0;
int month=0,day=0;
printf("Please enter year, yearDay:");
scanf("%d,%d",&year,&yearDay);
MonthDay(year,yearDay,&month,&day);
printf("month = %d, day = %d\n",month,day);
return 0;
}
void MonthDay(int year, int yearDay, int *pMonth, int *pDay)
{
int i=0;
if((year%4==0 && year!=100)||(year%400==0))//闰年
{
while(yearDay>a[1][i])
{
yearDay=yearDay-a[1][i];
i++;
}
*pDay=yearDay;//最后减剩下的就是“几号”
}
else
{
while(yearDay>a[0][i])
{
yearDay=yearDay-a[0][i];
i++;
}
*pDay=yearDay;
}
*pMonth=i;
}
----------选择控制结构(中等题)---------------
1、身高预测。
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。
小孩成人后的身高与其父母的身高和自身的性别密切相关。
设faHeight为其父身高,moHeight为其母身高,为float类型,身高预测公式为
男性成人时身高 = (faHeight + moHeight) × 0.54 cm
女性成人时身高 = (faHeight × 0.923 + moHeight) / 2 cm
此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生饮食习惯,那么可增加身高1.5%。
请编程从键盘输入用户的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、
父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、
是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、
是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示良好,输入字符N表示不好),
利用给定公式和身高预测方法对身高进行预测。
运行示例:
Are you a boy(M) or a girl(F)?F↙
Please input your father's height(cm):182↙
Please input your mother's height(cm):162↙
Do you like sports(Y/N)?N↙
Do you have a good habit of diet(Y/N)?Y↙
Your future height will be 167(cm)
int main()
{
float faHeight,moHeight,childHeight;
char sex;// F/M
char sports;// Y/N
char diet;
//男性成人时身高 = (faHeight + moHeight) × 0.54 cm
//女性成人时身高 = (faHeight × 0.923 + moHeight) / 2 cm
//喜爱体育锻炼,那么可增加身高2%
//良好的卫生饮食习惯,那么可增加身高1.5%
printf("Are you a boy(M) or a girl(F)?");
scanf(" %c",&sex);
printf("Please input your father's height(cm):");
scanf("%f",&faHeight);
printf("Please input your mother's height(cm):");
scanf("%f",&moHeight);
printf("Do you like sports(Y/N)?");
scanf(" %c",&sports);
printf("Do you have a good habit of diet(Y/N)?");
scanf(" %c",&diet);
if(sex=='M')
{
childHeight=(faHeight + moHeight) * 0.54;
if(sports=='Y')
{
childHeight=childHeight*1.02;
}
if(diet=='Y')
{
childHeight=childHeight*1.015;
}
printf("Your future height will be %f(cm)",childHeight);
}
else{
childHeight=(faHeight * 0.923 + moHeight)/2.0;
if(sports=='Y')
{
childHeight=childHeight*1.02;
}
if(diet=='Y')
{
childHeight=childHeight*1.015;
}
printf("Your future height will be %.0f(cm)",childHeight);
}
return 0;
}
2、
请进行程序设计,从键盘上输入三个字符,根据其在计算机内的存储方式按照从小到大的顺序输出这三个字符。
提示:字符输入方式可以使用scanf()或者getchar()
输入格式:"%c%c%c"
输出格式:"%c %c %c\n"
int main()
{
char a[3];
for(int i=0;i<3;i++)
{
a[i]=getchar();
while(getchar()!='\n');
}
//从小到大输出
char temp;
for(int i=0;i<2;i++)
{
for(int j=i+1;j<3;j++)
{
if(a[j]<a[i])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
//输出
printf("从小到大输出:");
for(int i=0;i<3;i++)
{
printf("%c ",a[i]);
}
}
//另法
void Sort(char *a,char *b)
{
char temp;
if(*a-*b>0)
{
temp=*a;
*a=*b;
*b=temp;
}
}
int main()
{
char a,b,c;
scanf("%c%c%c",&a,&b,&c);
Sort(&a,&b);
Sort(&a,&c);
Sort(&b,&c);
printf("%c %c %c\n",a,b,c);
return 0;
}
23机试编程真题(15’):
现有红黄紫三种肥料,价格分别为80、50、35元每袋,现要根据经费采购肥料
编写一个程序,要求输入经费费用n(1000<n<2000),输出满足以下两种条件之一的所有购买方案:
(1)紫色的袋数是黄色的1/3
(2)黄色的袋数是红色的2倍
要求输出每种情况,并且按照红黄紫的顺序输出
int main()
{
int red,yellow,purple;
int n=0;
printf("输入经费(1000<n<2000):");
scanf("%d",&n);
if(n<=1000 || n>=2000)
{
printf("输入的经费不在有效范围内!\n");
return 1;
}
//钱可以不用花完就这么算
// for(red=0;red*80<=n;red++)//红色肥料袋数受预算限制
// {
// for(yellow=0;yellow*50<=n-red*80;yellow++)//黄色肥料袋数受预算限制
// {
// for(purple=0;purple*35<=n-red*80-yellow*50;purple++)//紫色肥料袋数受预算限制
// {
// //检查是否满足条件
// if((yellow==3*purple || yellow == 2*red)&&(red*80+yellow*50+purple*35)<=n)
// {
// printf("red=%d,yellow=%d,purple=%d\n",red,yellow,purple);
// }
// }
//
// }
//
// }
//前全用花完就这么算
for(red=0;red*80<=n;red++)//红色肥料袋数受预算限制
{
for(yellow=0;yellow*50<=n-red*80;yellow++)//黄色肥料袋数受预算限制
{
for(purple=0;purple*35<=n-red*80-yellow*50;purple++)//紫色肥料袋数受预算限制
{
//检查是否满足条件
if((yellow==3*purple || yellow == 2*red)&&(red*80+yellow*50+purple*35)==n)
{
printf("red=%d,yellow=%d,purple=%d\n",red,yellow,purple);
}
}
}
}
return 0;
}
---------------结构体(中等题)------------------
1、以下程序有若干语法错误,不能正确输出s的成员n、s的成员b中的成员d、s的成员a的值。请找出并改正之。
输入:无
输出:Wang,11,30
#include <stdio.h>
struct date
{
int y,m,d;
};
struct stu
{
char n[10];
struct date b;
int a;
}s={"Wang",{1980,12,11},30};
int main()
{
printf("%s,%d,%d\n",s.n,s.b.d,s.a);
return 0;
}
2、程序改错。以下程序用于打印输出结构体数组的所有元素。
//struct s
//{
// char name[10];
// int age;
//};
//int main()
//{
// struct s a[3] = {{"John",19},{"Paul",17},{"Marry",18}};
// struct s *p=a;// 声明 p 为指向结构体 s 的指针
// for(p = a; p < a+3; p++) // 改正循环条件
// {
// printf("%s,%d\n", p->name, p->age );
// }
// return 0;
//}
//或者
//struct s
//{
// char name[10];
// int age;
//};
//int main()
//{
// struct s a[3] = {{"John",19},{"Paul",17},{"Marry",18}};
// int p;
// for(p = 0; p < 3; p++) // 改正循环条件
// {
// printf("%s,%d\n", a[p].name, a[p].age );
// }
// return 0;
//}
3、给定如下定义:
structdate_rec
{
intday ;
intmonth ;
intyear ;
};
写一个函数接收两个日期,如果两个日期相同,则返回0,如果第一个日期晚于第二个日期,则返回1,如果第一个日期早于第二个日期,则返回-1。并编写main函数测试它。
**输入格式要求:"%d%d%d" 提示信息:"请输入当前日期(年 月 日):"
**输出格式要求:"当前日期:%d年%d月%d日!\n" "第一个日期晚于第二个日期!" "第一个日期早于第二个日期!" "两个日期相同!"
程序运行示例如下:
请输入当前日期(年 月 日):2012 9 10↙
请输入当前日期(年 月 日):2013 7 10↙
当前日期:2012年9月10日!
当前日期:2013年7月10日!
第一个日期早于第二个日期!
struct date_rec
{
int day ;
int month ;
int year ;
};
//函数声明
int compare_dates(struct date_rec date1,struct date_rec date2);
int main()
{
//接收两个日期,如果两个日期相同,则返回0,
//如果第一个日期晚于第二个日期,则返回1,
//如果第一个日期早于第二个日期,则返回-1。
struct date_rec date1,date2;
//输入日期
printf("请输入当前日期(年 月 日):");
scanf("%d%d%d",&date1.year,&date1.month,&date1.day);
printf("请输入当前日期(年 月 日):");
scanf("%d%d%d",&date2.year,&date2.month,&date2.day);
//输出日期
printf("当前日期:%d年%d月%d日!\n",date1.year,date1.month,date1.day);
printf("另一个日期:%d年%d月%d日!\n",date2.year,date2.month,date2.day);
//比较日期并输出结果
int result=compare_dates(date1,date2);
switch(result)
{
case -1:
printf("第一个日期早于第二个日期!");
break;
case 0:
printf("两个日期相同!");
break;
case 1:
printf("第一个日期晚于第二个日期!");
break;
default:
printf("比较结果无效!\n");
}
return 0;
}
int compare_dates(struct date_rec date1,struct date_rec date2)
{
//注意:不能用“==”或者“!=”来判定两个结构体相等或者不相等
//在C语言中,判断两个结构体是否相等通常涉及比较结构体的所有成员。
// 这可以通过逐个比较结构体的每个字段来实现。如果结构体的所有字段都相等,则可以说这两个结构体相等。
// if(date1.year==date2.year && date1.month==date2.month && date1.day==date2.day)
// {
// printf("两个日期相同!");
// }
if(date1.year<date2.year)
{
return -1;
}
else if(date1.year>date2.year)
{
return 1;
}
else{
if(date1.month<date2.month)
{
return -1;
}
else if(date1.month>date2.month)
{
return 1;
}
else
{
if(date1.day<date2.day)
{
return -1;
}
else if(date1.day>date2.day)
{
return 1;
}
else
{
return 0;
}
}
}
}
4 给定如下定义:
struct time_rec
{
int hours ;
int mins ;
int secs ;
};
struct time_rec current_time;
写一个程序包含如下的函数,完成:
(a) 输入current_time的值:
void input_time(struct time_rec *current_time)
(b) 将current_time增加1秒:
void increment_time(struct time_rec *current_time)
(c) 显示current_time的新值。
void output_time(struct time_rec *current_time)
**输入格式要求:"%d%d%d" 提示信息:"请输入当前时间(时 分 秒):"
**输出格式要求:"当前时间:%d时%d分%d秒!"
void input_time(struct time_rec *current_time);
void increment_time(struct time_rec *current_time);
void output_time(struct time_rec *current_time);
struct time_rec
{
int hours;
int mins;
int secs;
};
int main()
{
struct time_rec current_time;
printf("请输入当前时间(时 分 秒):");
//输入时间
input_time(¤t_time);
//输出
printf("当前时间:");
output_time(¤t_time);
//增加1s
increment_time(¤t_time);
//输出增加后的时间
printf("增加1秒后的时间:");
output_time(¤t_time);
return 0;
}
void input_time(struct time_rec *current_time)
{
//输入current_time的值:
scanf("%d%d%d",¤t_time->hours,¤t_time->mins,¤t_time->secs);
}
void increment_time(struct time_rec *current_time)
{
//将current_time增加1秒:
current_time->secs++;
if(current_time->secs>59)
{
current_time->secs=0;
current_time->mins++;
}
if(current_time->mins>59)
{
current_time->mins=0;
current_time->hours++;
}
if(current_time->hours>23)
{
current_time->hours=0;
}
}
void output_time(struct time_rec *current_time)
{
//显示current_time的新值
printf("%d时%d分%d秒",current_time->hours,current_time->mins,current_time->secs);
}
5、13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。
输出提示 "出圈成员及顺序:" 格式 "%3d"
输出提示 "\n最后的成员是:" 格式 "%3d"
程序的运行示例如下:
出圈成员及顺序: 3 6 (后面以此类推,抱歉这里的输出结果保密,暂不公开,注意最后一个人是不出圈的哦)
最后的成员是: (抱歉这里的输出结果保密,暂不公开)
//int main()
//{
//
//
//
// return 0;
//}
6、编程统计候选人的得票数。设有3个候选人,Li,Zhang,Fun。
要求输入投票总数n,然后每次输入一个得票的候选人的名字(区分大小写),若选民输错候选人姓名,则按废票处理。
选民投票结束后程序自动显示各候选人的得票结果。
请通过分析和调试程序,发现并改正程序中的错误。
注意:将修改后的完整的源程序写在答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,
才给加10分,如果只改正了部分错误,则不加分。
程序运行示例如下:
输入
4
Li
Zhang
zha
Fun
输出
Li:1
Zhang:1
Fun:1
#include <string.h>
struct person
{
char name[20];
int count;
};
struct person leader[3] = {{"Li",0},{"Zhang",0},{"Fun", 0}};//在main外面初始化
int main()
{
int i, j,n;
char leader_name[20];
scanf("%d\n", &n);//输入投票总数
for(i = 0; i < n; i++)
{
scanf("%s", leader_name);
for(j = 0; j < 3; j++)
{
if(strcmp(leader_name,leader[j].name)==0)
{
leader[j].count++;
}
}
}
printf("\n");
for(i = 0; i < 3; i++)
{
printf("%5s:%d\n", leader[i].name, leader[i].count);
}
return 0;
}
7、编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,
选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。选民投票结束后程序自动显示各候选人的得票结果和废票信息。
要求用结构体数组candidate表示3个候选人的姓名和得票结果.
例如:
Input vote 1:li
Input vote 2:li
Input vote 3:Zhang
Input vote 4:wang
Input vote 5:zhang
Input vote 6:Wang
Input vote 7:Zhang
Input vote 8:wan
Input vote 9:li
Input vote 10:lii
Election results:
li:3
zhang:3
wang:2
Wrong election:2
输入格式:
"Input vote %d:"
"%s"
输出格式:
"Election results:\n"
"%8s:%d\n"
"Wrong election:%d\n"
#include <string.h>
struct candidate
{
char name[20];
int count;
};
struct candidate s[3]={{"zhang",0},{"li",0},{"wang",0}};//定义的是结构体数组!记得写方括号,字符串要用双引号
int main()
{
int n=10;//总投票数
char candidate_names[10][20];
int wrong=0;
//输入选票
for(int i=0;i<10;i++)
{
printf("Input vote %d:",i+1);
scanf("%s",candidate_names[i]);//数组名candidate[i]本身就是地址,不需要加&,注意二维数组的数组名
int found=0;//标志位,表示是否找到了匹配的候选人
for(int j=0;j<3;j++)//注意这里要用双重循环
{
if(strcmp(candidate_names[i],s[j].name)==0)//是s[i].name不是s.name[i]
{
s[j].count++;
found=1;
break;
}
}
if(!found)
{
wrong++;
}
}
printf("Election results:\n");
for(int i = 0; i < 3; i++)
{
printf("%8s:%d\n", s[i].name, s[i].count);
}
printf("Wrong election:%d\n",wrong);//或者说wrong=10-s[0].count-s[1].count-s[2].count
printf("Wrong election:%d\n",10-s[0].count-s[1].count-s[2].count);
return 0;
}
8、定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天?注意闰年问题。
输入格式要求:"请输入日期(年,月,日)\n"
输出格式要求:"%d月%d日是%d年的第%d天\n"
程序的运行示例如下:
请输入日期(年,月,日)
1990,2,14↙
2月14日是1990年的第45天。
struct date
{
int year;
int month;
int day;
};
char a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int main()
{
struct date s;
int sum=0;
printf("请输入日期(年,月,日)\n");
scanf("%d,%d,%d",&s.year,&s.month,&s.day);
if((s.year%4==0 && s.year%100!=0)||(s.year % 400)==0)
{
for(int i=0;i<s.month;i++)
{
sum=sum+a[1][i];
}
sum+=s.day;
}
else{
for(int i=0;i<s.month;i++)
{
sum=sum+a[0][i];
}
sum+=s.day;
}
printf("%d月%d日是%d年的第%d天\n",s.month,s.day,s.year,sum);
return 0;
}
9、以下程序有若干语法错误,不能正确输出成员a和成员v的值。请找出错误并改正之。
union
{
int a;
Struct
{
int u;
float v;
}b;
}
main()
{
union uu m;
m.a=200;
m.u=500;
m.v=120.5;
printf("%d\t%f\n",m.a,m.b.v);
}
union uu
{
int a;
struct c
{
int u;
float v;
}b;
};
int main()
{
union uu m;
m.a=200;
//m.b.u=500; 不能同时起作用
m.b.v=120.5;
printf("%d\t%f\n",m.a,m.b.v);
return 0;
}
10、用结构体实现输入4个学生的学号(无符号整数)、姓名(字符串)和考试成绩(整数),然后按从高分到低分的顺序排列后输出。
程序的运行示例如下:
输入第1个学生的信息:学号、姓名、成绩
2011 zhangsan 89
输入第2个学生的信息:学号、姓名、成绩
2012 lisi 96
输入第3个学生的信息:学号、姓名、成绩
2013 wangwu 67
输入第4个学生的信息:学号、姓名、成绩
2014 liuliu 59
排序后学生的信息为:
2012 lisi 96
2011 zhangsan 89
2013 wangwu 67
2014 liuliu 59
struct student{
unsigned long id;
char name[20];
int score;
};
int main()
{
struct student stu[4];
for(int i=0;i<4;i++)
{
printf("输入第%d个学生的信息:学号、姓名、成绩\n",i+1);
scanf("%lu%19s%d",&stu[i].id,&stu[i].name,&stu[i].score);
}
//排序
struct student temp;
for(int i=0;i<3;i++)
{
for(int j=i+1;j<4;j++)
{
if(stu[j].score>stu[i].score)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
//输出排序后的结果
printf("排序后的学生信息:\n");
for(int i=0;i<4;i++)
{
printf("学号:%lu 姓名:%s 成绩:%d\n",stu[i].id,stu[i].name,stu[i].score);
}
return 0;
}
11、写一个函数days,实现主函数将年、月、日(结构体类型)传递给days函数,days函数计算该年该月该日是该年的第几天并传回主函数输出。
程序的运行示例如下:
请输入日期(年,月,日)
1990,2,14
2月14日是1990年的第45天。
输入格式:
"请输入日期(年,月,日)\n"
"%d,%d,%d"
输出格式:
"\n%d月%d日是%d年的第%d天。"
typedef struct date
{
int year;
int month;
int day;
}Date;
//判断是否是闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
//计算该月之前所有月份的天数总和
int daysBeforeMonth(int year,int month)
{
int daysInMonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
{
daysInMonth[2]=29;//闰年2月有29天
}
int totalDays=0;
for(int i=1;i<month;i++)
{
totalDays+=daysInMonth[i];
}
return totalDays;
}
//计算日期是该年的那一天
int daysOfYear(Date date)
{
return daysBeforeMonth(date.year,date.month) + date.day;
}
int main()
{
Date d;
printf("请输入日期(年,月,日)\n");
scanf("%d,%d,%d",&d.year,&d.month,&d.day);
int dayOfYear=daysOfYear(d);//计算该年该月该日是该年的第几天并传回主函数输出
printf("\n%d月%d日是%d年的第%d天。",d.month,d.day,d.year,dayOfYear);
return 0;
}
//写法2(结构体作为函数参数)
#include <stdio.h>
#include <stdlib.h>
int a[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
typedef struct time
{
int year,month,day;
}td;
void days(td *date,int *sum)
{
if(date->year%4==0&&date->year%100!=0||date->year%400==0)//判断是闰年
{
for(int i=0;i<date->month-1;i++)
{
(*sum)+=a[1][i];
}
(*sum)+=date->day;
}
else
{
for(int i=0;i<date->month-1;i++)
{
(*sum)+=a[0][i];
}
(*sum)+=date->day;
}
}
int main()
{
td date;
printf("请输入日期(年,月,日)\n");
scanf("%d,%d,%d",&date.year,&date.month,&date.day);
int sum=0;
days(&date,&sum);
printf("\n%d月%d日是%d年的第%d天。" ,date.month,date.day,date.year,sum);
return 0;
}
12、中国有句俗语叫“三天打鱼两天晒网”,某人从90年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天中是在“打渔”,还是在“晒网”.
**输入格式要求:"%d%d%d" 提示信息:"Enter year/month/day:"
**输出格式要求:"He is fishing.\n" "He is sleeping.\n"
程序运行示例如下:
Enter year/month/day:1990 1 5
He is sleeping.
//思路:计算出总天数,去模5,用switch case语句
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
typedef struct time
{
int year,month,day;
}td;
void days(td *date,int *sum)
{
if(date->year%4==0&&date->year%100!=0||date->year%400==0)//判断是闰年
{
for(int i=0;i<date->month-1;i++)
{
(*sum)+=a[1][i];
}
(*sum)+=date->day;
}
else
{
for(int i=0;i<date->month-1;i++)
{
(*sum)+=a[0][i];
}
(*sum)+=date->day;
}
}
int main()
{
td date;
int sum=0;
printf("Enter year/month/day:");
scanf("%d%d%d",&date.year,&date.month,&date.day);
for(int i=1990;i<date.year;i++)
{
if(i%4==0&&i%100!=0||i%400==0)//判断闰年
sum+=366;
else//非闰年
sum+=365;
}
days(&date,&sum);
switch(sum%5)//这一步是关键,模5 //sum是总天数
{
case 1:
case 2:
case 3:
{
printf("He is fishing.\n");
break;
}
default :
{
printf("He is sleeping.\n");
break;
}
}
return 0;
}
---------字符数组(中等题)-----------
1、输入一行字符,统计其中的英文字符、数字字符、空格字符,以及其他字符的个数。请找出以下程序的错误,并改正之。
#include <stdio.h>
#include <string.h>
#define ARR_SIZE = 80;
main()
{
charstr[ARR_SIZE];
int len, i;
int letter=0,digit=0,space=0,other=0;
printf("请输入一个字符串:");
gets(str);
len = strlen(str);
for(i=0; i<len; i++)
{
if(a=<str[i]<=z || A=<str[i]<=Z)
{
letter ++;
}
elseif(0=<str[i]<=9)
{
digit ++;
}
elseif(str[i]=' ')
{
space ++;
}
else
other ++;
}
printf("英文字符数:%d\n", letter);
printf("数字字符数:%d\n", digit);
printf("空格数:%d\n", space);
printf("其他字符数:%d\n", other);
}
#include <stdio.h>
#include <string.h>
#define ARR_SIZE 80
int main()
{
char str[ARR_SIZE];
int len, i;
int letter=0,digit=0,space=0,other=0;
printf("请输入一个字符串:");
gets(str);
len = strlen(str);
for(i=0; i<len; i++)
{
if(str[i]>='a'&&str[i]<='z' || str[i]>='A'&&str[i]<='Z')
{
letter ++;
}
else if(str[i]>='0' && str[i]<='9')//检测数字字符也要加单引号
{
digit ++;
}
else if(str[i]==' ')
{
space ++;
}
else
other ++;
}
printf("英文字符数:%d\n", letter);
printf("数字字符数:%d\n", digit);
printf("空格数:%d\n", space);
printf("其他字符数:%d\n", other);
return 0;
}
----------循环控制结构(中等题)
1、将任一整数转换为二进制形式。
**输入格式要求:"%d" 提示信息:"Input number:"
**输出格式要求:"number of decimal form:%d\n" " it\'s binary form: "
程序运行示例如下:
Input number:876
number of decimal form:876
it's binary form: 00000000000000000000001101101100
将十进制正整数18转换成二进制数的具体计算方法如下:
18/2=9 余0;
9/2=4 余1;
4/2=2 余0;
2/2=1 余0;
1/2=0 余1;
将以上的余数结果按倒序的方式书写,转换成二进制即为:10010
10/2=5 余0
5/2=2 余1
2/2=1 余0
1/2=0 余1
倒序输出:1010
int main()
{
int decimal;
printf("Input number:");
scanf("%d",&decimal);
printf("number of decimal form:%d\n",decimal);
//化为2进制
//int shang=1;//当商为0时停止
int yushu[32]={0};//余数
int i=0;
while(decimal!=0)
{
yushu[i]=decimal%2;//yushu=0
decimal=decimal/2;//d=5
i++;
}
//倒序输出余数数组
for(int i=31;i>=0;i--)//注意是i=31;i>=0;不是i=32 i>0
{
printf("%d",yushu[i]);
}
return 0;
}
2、以下划线、英文字符开头的并且由下划线、英文字符和数字组成的标识符都是合法的标识符。
编写一个程序,判断输入的一行字符是否构成一个合法的C标识符(以下划线_开头的标识符视为合法的C标识符)。(假设输入的字符串非关键字且最大长度为32)
**输入格式要求:getchar()
**输出格式要求:"is\n" "is not\n"
程序运行示例1如下:
$223
is not
程序运行示例2如下:
hello world
is not
程序运行示例3如下:
hello
is
#include <string.h>
int main()
{
char a[32];
gets(a);
int len=strlen(a);
int flag=0;
if(a[0]>='a'&&a[0]<='z' || a[0]>='A' && a[0]<='Z' || a[0]=='_')
{
for(int i=1;i<len;i++)
{
if(a[i]>='a'&&a[i]<='z' || a[i]>='A' && a[i]<='Z' || a[i]=='_')
{
flag=0;
}
else
{
flag=1;
break;
}
}
}
else
{
flag=1;
}
if(flag==0)
printf("is\n");
else
printf("is not\n");
return 0;
}
3、
程序:显示法定格式的日期合同和其他法律文档中经常使用下列日期格式:
Dated this day of ,19 .
编写程序用来显示这种格式的日期。用户以月/日的格式录入日期,然后计算机显示出“法定”格式的日期:
Enter date (mm/dd/yy) : 7/19/96
Dated this 19th day of July, 1996.
可以使用printf函数实现主要的格式化。然而,还有两个问题:如何为日添加“th”(或者“st”、“nd”、“rd”),
以及如何使用单词代替数字显示月份。幸运的是,switch语句可以很好地解决这两种问题:用一个switch语句负责显示日的后缀,
再用另一个switch语句显示出月份名。注意,11日、12日、13日对应的英文是th结尾。
**输入格式要求:"%d/%d/%d" 提示信息:"Enter date (mm/dd/yy):" "Dated this %d" "st/nd/rd/th" " day of " "January/February/.../December"
如果输入的日期不在合法范围内,则输出"Input error!\n"。
**输出格式要求:", 19%.2d.\n"
#include <stdio.h>
#include <stdbool.h>
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int month, day, year;
printf("Enter date (mm/dd/yy): ");
if (scanf("%d/%d/%d", &month, &day, &year) != 3 || month < 1 || month > 12 || day < 1 || year < 0) {
printf("Input error!\n");
return 1;
}
// 校验日期是否合法
int daysInMonth[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (day > daysInMonth[month - 1]) {
printf("Input error!\n");
return 1;
}
// 输出月份名称
const char *months[] = {"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
// 输出日期的后缀
const char *suffixes[] = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"};
const char *daySuffix;
if (day % 10 == 1 && day % 100 != 11) {
daySuffix = "st";
} else if (day % 10 == 2 && day % 100 != 12) {
daySuffix = "nd";
} else if (day % 10 == 3 && day % 100 != 13) {
daySuffix = "rd";
} else {
daySuffix = suffixes[day % 10];
}
// 格式化输出日期
printf("Dated this %d%s day of %s, 19%.2d.\n", day, daySuffix, months[month - 1], year);
return 0;
}
4、按如下函数原型,用指针作函数参数,编程统计数组a中奇数和偶数的个数,指针形参odd返回奇数的个数,指针形参even返回偶数的个数:
void f(int a[], int *odd, int *even);
在主函数中输入20个整数,调用函数f()统计奇数和偶数的个数并通过指针形参返回给主函数,在主函数中输出统计结果。
**输入提示信息:"input 20 numbers:"
**输入数据格式:"%d"
**输出数据格式:"Odd numbered=%d,Even numbered=%d\n"
请按如下框架编程,在“......”的位置添加缺失的语句,使程序完整。
#include <stdio.h>
功能:统计数组a中奇数和偶数的个数
参数:odd为指向奇数个数的指针
even指向偶数个数的指针
voidf(inta[], int*odd, int*even)
{
........................
}
intmain()
{
inta[20], i, odd = 0, even = 0;
printf("input 20 numbers:");
............
printf("Odd numbered=%d,Even numbered=%d\n", odd, even);
return0;
}
//统计数组a中奇数和偶数的个数,指针形参odd返回奇数的个数,指针形参even返回偶数的个数:
//在主函数中输入20个整数,调用函数f()统计奇数和偶数的个数并通过指针形参返回给主函数,在主函数中输出统计结果。
void f(int a[], int *odd, int *even)
{
for(int i=0;i<20;i++)
{
if(a[i]%2==0)
//错误地使用了*even++和*odd++,这会导致指针odd和even本身的值被递增
(*even)++; //这里一定要加括号,先解引用even,然后递增其指向的值
else
(*odd)++;
}
}
int main()
{
int a[20], i, odd = 0, even = 0;
printf("input 20 numbers:");
for(i=0;i<20;i++)
{
scanf("%d",&a[i]);
}
f(a,&odd,&even);
printf("Odd numbered=%d,Even numbered=%d\n", odd, even);
return 0;
}
5、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数。
程序的运行示例如下:
共有多少个数?5
后移多少个?2
请以,号为间隔输入5个数。
1,2,3,4,5
移动后顺序为:
4,5,1,2,3
//做法应该是先将整个数组向后移动m个位置,然后再将最后m个元素复制到数组的前面。
#define N 20
int main()
{
int n=0,m=0;//m为后移位数
int num[N]={0};
int temp[N]={0};
printf("共有多少个数?");
scanf("%d",&n);
printf("后移多少个?");//2
scanf("%d",&m);
m%=n;//确保移动数量在有效范围内!!!
printf("请以,号为间隔输入%d个数。\n",n);
for(int i=0;i<n;i++)
{
scanf("%d,",&num[i]);
}
//手动移动数组【1,2,3,4,5】——m=2,n=5——》【4,5,1,2,3】
//【先将整个数组向后移动m个位置】
for(int i=0;i<n-m;i++)
{
temp[i]=num[i+m];//num数组往后移动m位,赋给temp
}
for(int i=0;i<m;i++)//【再将最后m个元素复制到数组的前面】
{
temp[n-m+i]=num[i];//num最后m位继续给temp
}
//如果有需要将temp数组复制回num数组
for(int i=0;i<n;i++)
{
num[i]=temp[i];
}
printf("移动后的顺序为:\n");
for(int j=0;j<n;j++)
{
printf("%d,",num[j]);
}
printf("\n");
return 0;
}
6、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
**输入格式要求:"%d" 提示信息:"the total numbers is:" "back m:"
**输出格式要求:"%d," "%d"
程序运行示例1如下:
the total numbers is:5
back m:2
1 2 3 4 5
4,5,1,2,3
程序运行示例2如下:
the total numbers is:6
back m:3
1 2 3 4 5 6
4,5,6,1,2,3
#define N 20
int main()
{
int n,m;//m是后移位数
int num[N]={0},temp[N]={0};
printf("the total numbers is:");
scanf("%d",&n);
printf("back m:");
scanf("%d",&m);
m%=n;//确保移动位数在有效范围内
printf("输入%d个数:",n);
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
//其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
//先将num数组的前(n-m)个元素后移m个位置,从temp[0]开始存入
//1 2 3 4 5 m=2 n=5
for(int i=0;i<n-m;i++)//先把num[m]到num[n-1]放到temp
{
temp[i]=num[i+m];//temp[0]=num[2] temp[1]=num[3] temp[2]=num[4] temp[5]={3,4,5,0,0}
}
//将num数组的后m个,继续存入temp的末尾
for(int i=0;i<m;i++)
{
temp[n-m+i]=num[i];//把num[0]到num[m-1]放到temp的末尾
//temp[3]=num[0]
//temp[4]=num[1]
//temp[5]={3,4,5,1,2}
}
//如果有需要将temp数组复制回num数组
for(int i=0;i<n;i++)
{
num[i]=temp[i];
}
printf("移动后的顺序为:\n");
for(int j=0;j<n;j++)
{
if(j<n-1)
printf("%d,",num[j]);
else
printf("%d",num[j]);//去掉最后一个逗号
}
printf("\n");
return 0;
}
C编程(SSE)
于 2024-03-24 15:52:03 首次发布