C语言/C++常见习题问答集锦(八)
程序之美
1、C语言函数题:如何通过函数调用,实现任意两个数的除法运算
#include<stdio.h>
int main(void)
{
int a, b;
char c;
printf("请输入两个数:");
scanf("%d %d", &a, &b);
getchar();
printf("请输入你需要的运算法则:");
scanf("%c",&c);
if(c == '/' && b == 0){
printf("除数不能为0\n");
return 0;
}
switch (c)
{
case '+':
printf("%d+%d = %d", a, b, a+b);
break;
case '-':
printf("%d-%d = %d", a, b, a-b);
break;
case '*':
printf("%d*%d = %d", a, b, a*b);
break;
case '/':
printf("%d/%d = %d", a, b, a/b);
break;
default:
printf("输入的符号有错!");
break;
}
return 0;
}
2、c语言 输入n个学生,以及每个学生的数学,英语成绩,先按照高分到低分输出,然后统计每门课程的总成绩,平均分,最高分和最低分,输出至少一个最高分和最低分的学生序号。
#include <stdio.h>
#include <stdlib.h>
void InsertSort(float a[], int left, int right) {//对数组a从下标为left到right区域进行直接插入排序
int i, j;
float tmp;
for(i = left + 1; i <= right; i++) {
for(j = i - 1, tmp = a[i]; j >= left && tmp > a[j]; j++)
a[j + 1] = a[j];
a[j + 1] = tmp;
}
}
void main()
{
int i = 0;
int n = 0;
float *a[2] = {NULL};
float sum[2] = {0};
float avg[2] = {0};
float max[2] = {0};
float min[2] = {0};
int maxIndex[2] = {0};
int minIndex[2] = {0};
printf("请输入有多少个学生:");
scanf("%d", &n);
a[0] = (float *)malloc(sizeof(float)*n);
a[1] = (float *)malloc(sizeof(float)*n);
for (i = 0; i < n; ++i)
{
printf("请输入第%d个学生的数学成绩:", i+1);
scanf("%f", &a[0][i]);
sum[0] += a[0][i];
if (a[0][i]>max[0])
{
max[0] = a[0][i];
maxIndex[0] = i;
}
printf("请输入第%d个学生的英语成绩:", i+1);
scanf("%f", &a[1][i]);
sum[1] += a[1][i];
if (a[1][i]>max[1])
{
max[1] = a[1][i];
maxIndex[1] = i;
}
}
min[0] = a[0][0];
min[1] = a[1][0];
for (i = 1; i < n; ++i)
{
if (a[0][i]<min[0])
{
min[0] = a[0][i];
minIndex[0] = i;
}
if (a[1][i]<min[1])
{
min[1] = a[1][i];
minIndex[1] = i;
}
}
InsertSort(a[0],0 n -1));
InsertSort(a[1],0 n -1));
max[0] = a[0][0];
max[1] = a[1][0];
min[0] = a[0][0];
min[1] = a[1][0];
avg[0] = sum[0]/n;
avg[1] = sum[1]/n;
printf("数学成绩由高到低:");
for (i = 0; i < n; ++i)
{
printf("%f ", a[0][i]);
}
printf("\n");
printf("英语成绩由高到低:");
for (i = 0; i < n; ++i)
{
printf("%f",a[1][i]);
}
printf("\n");
printf("总成绩 平均分 最高分 最低分\n");
for (i = 0; i < 2; ++i)
{
printf("%-8.2f%-8.2f%-8.2f%-8.2f\n", sum[i], avg[i], max[i], min[i]);
}
printf("数学最高分序号:%d. 最低分序号:%d", maxIndex[0], minIndex[0]);
printf("英语最高分序号:%d. 最低分序号:%d", maxIndex[1], minIndex[1]);
return 0;
}
3、c语言实现两个二维数组的互换。
如二维数组
1,1,1,1
2,2,2,2
3,3,3,3
互换为:
1,2,3
1,2,3
1,2,3
1,2,3
#include<stdio.h>
int main(){
int i,j ,a[3][4]={{1,1,1,1},{2,2,2,2},{3,3,3,3}},b[4][3]={0};
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d ",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
for(i=0;i<4;i++){
for(j=0;j<3;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
4、有n个学生,每个学生有m科成绩,要求在输出每个学生的平均成绩,用指针函数实现。
Input:
输入多组情况,每种情况输入两个正整数n,m表示有n个学生(n<50, m<8),每个学生有m科成绩,按着有n行,每行m个数据表示学生的成绩,序号从1开始。
Output:
输出每个学生的平均成绩,结果保留1位小数,格式宽度为5.
Sample Input
4 5
89 90 87 67 90
90 76 75 60 56
87 78 68 98 78
67 78 89 89 79
Sample Output
1:84.6
2:71.4
3:81.8
4:80.4
#include <stdio.h>
#include <stdlib.h>
#define N 3 //学生数量
#define M 5 //几门成绩
//储存学生信息的结构体
typedef struct student
{
int score[M];//各科成绩
int avg;//平均分
}STUDENT_T;
int main (int argc, char *argv[])
{
int i = 0;
int j = 0;
STUDENT_T *p = NULL;
STUDENT_T *tmp = NULL;
//指针指向动态申请的内存
p = malloc(sizeof(STUDENT_T)*N);
if (!p)
{
printf("\n");
return -1;
}
//屏幕输入或变量直接赋值每个学生的各科成绩 并计算平均分
tmp = p;
for (i = 0; i < N; i++, tmp++)
{
printf("输入第%d个学生的%d个成绩:\n", i+1, M);
for (j = 0; j < M; j++)
{
scanf("%d", &tmp->score[j]);
//tmp->score[j] = 60+2*i+2*j;
tmp->avg += tmp->score[j];
}
tmp->avg /= M;
}
//打印各学生的平均分
tmp = p;
for (i = 0; i < N; i++, tmp++)
{
printf("学生:%d 平均分:%d\n", i+1, tmp->avg);
}
free(p);
return 0;
}
5、c语言 设有两个集合A和集合B,要求设计生成集合C=A∩B的算法,其中集合A、B和C用链式存储结构表示
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode
{
ElemType date;
struct Lnode* next;
}*LNode;
LNode InitLnode(void) //初始化链表
{
LNode L;
L = (LNode)malloc(sizeof(struct Lnode));
if(L == NULL)
exit(1);
L->next = NULL;
return L;
}
/*尾插入元素*/
void Insert(LNode head,ElemType x)
{
struct Lnode *p,*q;
p = head;
q = (LNode)malloc(sizeof(struct Lnode));
if(!q)
{
printf("Out of space\n");
exit(1);
}
q->date = x;
q->next = NULL;
while(p->next != NULL) //带头结点的链表
{
p = p->next;
}
p->next = q;
}
/*输出链表*/
void Print(LNode head)
{
LNode p;
p = head->next;
while(p!=NULL)
{
printf("%d ",p->date);
p = p->next;
}
}
int IfHas(LNode L,ElemType x)
{
LNode p = L->next;
if(!L)
exit(1);
while(p)
{
if(p->date == x)
return 1;
p = p->next;
}
return 0;
}
void REORDER(LNode LA,LNode LB,LNode LC)
{
LNode p;
p = LA->next;
while(p)
{
if(IfHas(LB,p->date))
Insert(LC,p->date);
p = p->next;
}
}
/*测试一下*/
int main(void)
{
LNode LA,LB,LC;
LA = InitLnode();
LB = InitLnode();
LC = InitLnode();
ElemType N;
printf("输入你要放入链表LA中的数据,输入为零是代表输入结束\n");
while(scanf("%d",&N)!=EOF)
{
if(N == 0)
break;
Insert(LA,N);
}
printf("输入你要放入链表LB中的数据,输入为零是代表输入结束\n");
while(scanf("%d",&N)!=EOF)
{
if(N == 0)
break;
Insert(LB,N);
}
printf("LA,LB分别为:\nLA:");
Print(LA);
printf("\nLB:");
Print(LB);
REORDER(LA,LB,LC);
printf("\nLC:");
Print(LC);
printf("\n");
return 0;
}
核心思路:
typedef struct node {
int data;
struct node * next;
}lklist;
void intersection(lklist *ha,lklist *hb,lklist *&hc)
{
lklist *p,*q,*t;
for(p=ha,hc=0;p!=0;p=p->next)
{
for(q=hb;q!=0;q=q->next)
if (q->data==p->data)
break;
if(q!=0){
t=(lklist *)malloc(sizeof(lklist));
t->data=p->data;
t->next=hc;
hc=t;
}
}
}