ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言基础练习题<四>

2021-12-06 19:01:43  阅读:120  来源: 互联网

标签:练习题 name int 基础 employId C语言 ++ str printf


1.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串并输出上述的结果。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int letter, digit, blank, other;
int main() {
	void total(char str[]);
	char str[50];
	printf("请输入一个字符串:\n");
	gets(str);
	total(str);
	printf("此字符串有:\n%d个字母,\n%d个数字,\n%d个空格,\n%d个其他字符", letter, digit, blank, other);
	return 0;
}

void total(char str[]) {
	int i;	
	letter = 0, digit = 0, blank = 0, other = 0;
	for (i = 0; str[i] != '\0'; 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] == ' ') 
		{
			blank++;
		}
		else
		{
			other++;
		}
	}
}

2.写一个函数,用“起泡法”(冒泡排序)对输入的10个字符由小到大的顺序排列。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	void array(char str[]);
	char str[10];
	printf("输入一行字符:\n");
	scanf("%s",&str);
	array(str);
	printf("输出:\n%s", str);
	return 0;
}

void array(char str[]) {
	int i, t, j;
	for (i = 0; i < strlen(str)-1; i++) {
		for (j = 0; j < strlen(str) - 1 - i; j++) {
			if (str[j] > str[j+1]) {
				t = str[j];
				str[j] = str[j+1];
				str[j+1] = t;
			}
		}
	}
}

3.输入10个学生5门课的成绩,分别用函数实现下列功能;
(1)计算每个学生的平均分;
(2)计算每门课的平均分;
(3)找出所有50个分数中最高的分数所对应的学生和课程。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	void oneAverage(float score[4][6]);
	void twoAverage(float score[4][6]);
	void maxScore(float score[4][6]);
	float score[4][6];//3个学生的5门课成绩,多余的存放平均分
	int i, j;
	for (i = 0; i < 3; i++) {//3个学生
		printf("请输入第%d个学生的课程成绩\n", i + 1);
		for (j = 0; j < 5; j++) {//5门课程
			printf("第%d门课程成绩:", j + 1);
			scanf("%f", &score[i][j]);
		}
		printf("\n");
	}

	oneAverage(score);
	twoAverage(score);
	maxScore(score);
}

void oneAverage(float score[4][6]) {
	int i, j;
	float sum;
	printf("\n");
	printf("每个学生的平均成绩如下:\n");
	for (i = 0; i < 3; i++) {
		sum = 0;//每重新循环一次,学生的成绩总分都归零
		for (j = 0; j < 5; j++) {
			sum = sum + score[i][j];
		}
		score[i][5] = sum / 5.0;
		printf("第%d个学生的平均分数:%.2f\n", i + 1, score[i][5]);
	}
}

void twoAverage(float score[4][6]) {
	int i, j;
	float sum;
	printf("\n");
	printf("每门课的平均成绩如下:\n");
	for (j = 0; j < 5;j++) {//5门课3个学生
		sum = 0;
		for (i = 0; i < 3;i++) {
			sum = sum + score[i][j];
		}
		score[3][j] = sum / 3.0;
		printf("第%d门课的平均分数:%.2f\n", j + 1, score[3][j]);
	}
}

void maxScore(float score[4][6]) {
	int i, j, stu_index, class_index;
	float max = 0;
	for (i = 0; i < 3;i++) {
		for (j = 0; j < 5;j++) {
			if (max < score[i][j]) {
				max = score[i][j];
				stu_index = i + 1;
				class_index = j + 1;
			}
		}
	}
	printf("最高的分数所对应的学生和课程分别为第%d个和第%d个", stu_index, class_index);
}

运行结果:
在这里插入图片描述

4.写几个函数:
(1)输入10个职工的姓名和职工号;
(2)按职工号由小到大顺序排序,姓名顺序也随之调整;
(3)要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	void orderEmploy(int employId[10], char name[100][100]);
	void searchEmploy(int employId[10], char name[100][100], int searchId);
	char name[100][100];
	int employId[10];
	int searchId;
	int i, j;
	for (i = 0; i < 10; i++) {
		printf("Input NO.%d and name:", i + 1);
		scanf("%d %s", &employId[i], &name[i]);
	}
	printf("\n");
	printf("Output No. and name:\n");
	for (i = 0; i < 10; i++) {
		printf("%d %s", employId[i], name[i]);
		printf("\n");
	}
	orderEmploy(employId, name);
	printf("\n");
	printf("请输入要查找的职工号:\n");
	scanf("%d", &searchId);
	searchEmploy(employId, name, searchId);
}

void orderEmploy(int employId[10], char name[100][100]) {
	int i, j, temp;
	char demp[100];
	printf("\n");
	printf("Result:\n");
	for (i = 0; i < 10 - 1; i++) {
		for (j = 0; j < 10 - 1 - i; j++) {
			if (employId[j] > employId[j + 1]) {
				temp = employId[j];
				employId[j] = employId[j + 1];
				employId[j + 1] = temp;

				strcpy(demp, name[j]);//将name[j]拷贝给demp
				strcpy(name[j], name[j + 1]);//将name[j + 1]拷贝给name[j]
				strcpy(name[j + 1], demp);//将demp拷贝给name[j + 1]
			}
		}
		//printf("%d %s", employId[j], name[j]);
		//printf("\n");
	}
	for (i = 0; i < 10; i++) {
		printf("%d %s", employId[i], name[i]);
		printf("\n"); 
	}
}

void searchEmploy(int employId[10], char name[100][100], int searchId) {
	int mid, beginIndex = 0, endIndex = 10;
	int loca = -1;//当前下标
	while (beginIndex < endIndex) {
		if (beginIndex == endIndex-1) {//开始的坐标与结束的坐标相等
			if (searchId == employId[beginIndex]) {
				loca = beginIndex;
				printf("NO.%d his name is %s.", searchId, name[loca]);
			}
			else {
				loca = -1;
				printf("您所查找的职工号不存在...");
			}
			break;
		}
		mid = (beginIndex + endIndex) / 2;//取mid应该是整个长度/2才对
		if (searchId == employId[mid]) {
			loca = mid;
			printf("NO.%d his name is %s.", searchId, name[loca]);
			break;
		}
		else if (searchId < employId[mid]) {
			endIndex = mid;
		}
		else {
			beginIndex = mid;
		}		
	}
}

5.给出年、月、日,计算该日是该年的第几天

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	int sumDay(int month, int day);
	int year, month, day;
	int days = 0;//天数
	printf("请输入年月日:\n");
	scanf("%d%d%d", &year, &month, &day);
	days = sumDay(month, day);
	if (year%4==0 && year%100!=0 || year%400==0) {
		if (month >= 3) {
			days = sumDay(month, day);
			days = days + 1;
		}
	}
	printf("该日是该年的第%d天.",days);
}

int sumDay(int month,int day) {
	int monthDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	int i;
	for (i = 1; i < month;i++) {
		day += monthDay[i];
		
	}
	return day;
}

标签:练习题,name,int,基础,employId,C语言,++,str,printf
来源: https://blog.csdn.net/qq_43096786/article/details/121566149

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有