C语言/C++常见习题问答集锦(八)

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;

        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值