大一以来C/C++基础学习入门练习记录(2)

本文包含多个C++编程实例,从圣诞树图案生成、数字位数计算到复杂数学运算,如阶乘、最大公约数和最小公倍数计算,以及字符统计等,展示了不同难度级别的C++编程技巧。

写在前面的话
这个是楼主大一入门时的课程作业代码,很多当时也写得较为粗糙,
后来逐渐掌握后也没进一步优化的想法和必要,此文纯粹记录,参考作用不大。

实验平台为Visual-Studio-2017
前面的 #include "pch.h"
文件如下:

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#ifndef PCH_H
#define PCH_H
// TODO: 添加要在此处预编译的标头
#endif //PCH_H
  1. 圣诞树(信宣快乐)
#include "pch.h"
#include <iostream>
#include <Windows.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv)
{

	cout << "请输入一个奇数"<<endl;
	int a,b,c,d=0;
	cin >> a;
	if (a % 2 != 0)
	{

		for (b = 0; b < a/2+1 ; b = b + 1)
		{
			for (c = b; c < a/2; c = c + 1)
			{
				cout << "  ";
			}
			for (c = 0; c<b*2+1; c = c + 1)
			{
				cout << "▲";
			}
			cout << endl;
		}
	};
	d = a / 2 ;
	for (d; d > 0; d = d - 1)
	{
		cout << "  ";
	}
	cout << char(31)<< endl;
	d = a / 2;
	for (d; d > 0; d = d - 1)
	{
		cout << "  ";
	}
	cout << char(31);
	while (true) {
		system("color 1");
		Sleep(100);
		system("color 2");
		Sleep(100);
		system("color 3");
		Sleep(100);
		system("color 4");
		Sleep(100);
		system("color 5");
		Sleep(100);
		system("color 6");
		Sleep(100);
		system("color 7");
		Sleep(100);
	}
	return 0;
}
  1. 输出整数位数及各位数求和
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
	int a,b=0,c=0,sum=0;
	cin >> a;
	for (a; a > 0;)
	{
		b = a % 10;
		sum = sum + b;;
		c = c + 1;
		a = a / 10;
	}
	cout << c << " " << sum;
	system("pause");
}
  1. 数位数(求该数有几位)
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
	int a,b=0;
	cin >> a;
	if (a == 0) b = 1;
	for (a; a > 0;)
	{
		a = a / 10;
		b = b + 1;
	}
	cout << b;
	system("pause");
}
  1. 计算分段函数
#include "pch.h"
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
	double x, result;
	cin >> x;
	if (x == 0) result = 0.0;
	else result = 1 / x;
	cout << "f(" << showpoint << fixed << setprecision(1) << x << ")"
		<< " = " << result;
	system("pause");
}
  1. !和sum(求和)
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
	int n,sum=0,a=1;
	cin >> n;
	for (a; a <= n; a = a + 1)
	{
		sum = sum + a;
	}
	cout << sum;
	system("pause");
}
  1. 计算阶乘和 12以内
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
	int n, sum = 0,b=1,a=1;
	cin >> n;
	for (a;a<=n;a=a+1)
	{
		b = b * a;
		sum = sum + b;
	}
	cout << sum;
	system("pause");
}
  1. 素数判断
#include "pch.h"
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int N,a;//b被除计数
	cin >> N;
	for (N; N > 0; N = N - 1)
	{
		cin >> a;
		int x = 0,b=2;//用作判断结束与否依据
		if (a == 1) cout << "No"<<endl; 
		else {
			for (b; b <= sqrt(a); b = b + 1)
			{
				if (a%b == 0)
				{
					x = 1;
					break;
				}
			}
			if (x == 0)
				cout << "Yes" << endl;
			else cout << "No" << endl;
		}
	}
	system("pause");
}
  1. 求最大值及其下标
#include "pch.h"
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int n, a[11], b = 0, c = 0;
	cin >> n;
	for (b; b < n; b = b + 1)
	{
		cin >> a[b];
	}
	b = 0;
	for (b; b < n; b = b + 1)
	{
		if (a[0] < a[b])
		{
			a[0] = a[b];
			c = b;
		}
	}
	cout << a[0] << " " << c;
	system("pause");
}
  1. N个数求和(分数)
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
	int fenzi[100], fenmu[100], n, x = 0;
	char a;
	cin >> n;
	for (x; x < n; x = x + 1)
	{
		cin >> fenzi[x] >> a >> fenmu[x];
	}
	int fenzisum = fenzi[0], fenmusum = fenmu[0];//初始化
	for (int y = 1; y < n; y = y + 1)
	{
		fenzisum = fenzisum * fenmu[y] + fenzi[y] * fenmusum;
		fenmusum = fenmusum * fenmu[y];
	}//分子分母通分
	if (fenzisum == 0) { cout << 0; system("pause"); return 0; }
	int A = fenzisum, B = fenmusum, X;
	while (B != 0)
	{
		X = A % B;
		A = B;
		B = X;
	}//求最大公约数
	fenzisum = fenzisum / A;
	fenmusum = fenmusum / A;//约简出来了
	if (fenzisum < 0) { fenzisum = (-1)*fenzisum; cout << "-"; }
	if (fenzisum < fenmusum) { cout << fenzisum << '/' << fenmusum; }
    if (fenzisum == fenmusum) { cout << 1; }//加else 表面平行关系
	if(fenzisum>fenmusum)  //或者最后别直接加else 详细说明 表示平行关系
	{
		cout << fenzisum / fenmusum;
		if (fenzisum%fenmusum != 0)//暂时未理解(如果分子不为分母倍数)
			cout <<" "<< fenzisum % fenmusum << '/' << fenmusum;
	}

	system("pause");
}
  1. 大数阶乘和及取大模(非最优方法)
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
	long long int n,sum,mo;
	while (cin >> n)
	{
		sum = 1;  mo = 0;
		for (int a = 1; a <= n; a = a + 1)
		{
			sum = (sum * a) % 1000000007;
			mo = (mo + sum) % 1000000007;
		}
		cout << mo << endl;
	}
	system("pause");
}
  1. 最大公约数 最小公倍数
#include "pch.h"
#include <iostream>
using namespace std;
int gcd(int a, int b)//2个数的最大公约数
{
	if (a < b) { swap(a, b); }//始终令a>b
	if (b == 0) { return a; }
	else { return gcd(b, a%b); }
}
int lcm(int a, int b)//两个数的最小公倍数
{
	return a * b / gcd(a, b);
}
int main()
{
	int x, y;
	cin >> x >> y;
	cout << gcd(x, y) << " " << lcm(x, y);
	system("pause");
}
  1. 统计输入字符数并分类
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
	int n, zimu = 0, shuzi = 0, kongge = 0, qita = 0;
	while (n = getchar())//[while ((c=getchar())!='\n')] 读取一个字符回车时结束
	{
		if (n == '\n') break;
	    if (n >= 'a'&&n <= 'z' || n >= 'A'&&n <= 'Z') zimu = zimu + 1;
	    else if (n >= '0'&&n <= '9') shuzi = shuzi + 1;//加了else变互斥关系    
		else if (n ==' ') kongge = kongge + 1;
		else qita = qita + 1;
	}
	cout << zimu << ' ' << shuzi << ' ' << kongge << ' ' << qita << endl;
	system("pause");
	return 0;
}
<think>好的,用户是大一学生,刚开始学习C语言,现在需要完成课程设计的项目,但不知道如何入门。首先,我需要考虑他们的背景。作为大一新生,可能刚接触编程,基础还不牢固,所以得从巩固基础开始。但课设通常需要综合运用知识,比如做一个管理系统或者小游戏,所以得平衡基础和实践。 接下来,用户可能遇到的问题是什么?他们可能对如何开始项目感到迷茫,不知道从哪里下手,或者对整体流程不熟悉。这时候需要给出一个结构化的步骤,比如从选题到实现的流程。同时,他们可能需要具体的例子,比如学生管理系统,这样的项目结构比较清晰,适合入门。 然后,用户可能对具体的技术点有疑问,比如文件操作、链表使用、模块化设计等。这些在课设中常见,但初学者可能不太熟悉。所以需要分点解释这些技术,并提供简单的代码示例,帮助他们理解。比如,文件操作部分,可以展示如何用fopen、fprintf等函数,这样他们能直观地看到如何保存和读取数据。 另外,调试和测试也是学生容易忽视的部分。很多学生写完代码后可能不会系统地测试,导致运行时出现各种错误。所以需要强调调试的重要性,并给出一些实用的建议,比如分模块测试、使用printf语句跟踪变量等。 还有,用户可能需要推荐一些学习资源,比如经典的C语言教材、在线教程、论坛等。这些资源可以帮助他们在遇到问题时查找资料,或者深入学习某些知识点。比如推荐《C Primer Plus》和菜鸟教程,这些都比较适合初学者。 最后,要提醒他们避免常见的错误,比如代码不规范、忽略错误处理、急于求成等。这些建议能帮助他们养成良好的编程习惯,减少调试时的困难。同时,鼓励他们多练习,遇到问题主动寻求帮助,保持耐心,这对他们的长期发展很重要。 总结一下,回答的结构应该是先巩固基础,再分步骤进行课设,结合具体实例,讲解关键技术点,强调调试和测试,推荐学习资源,最后给出注意事项。这样用户能有一个清晰的路线图,逐步完成课设项目,同时提升自己的编程能力。</think>作为大一学生,入门C语言课设可以从以下几个步骤入手,既能巩固基础,又能逐步提升实践能力: --- ### **一、巩固基础(必做)** 1. **复习核心语法** - 确保掌握:变量、运算符、分支语句(if-else)、循环(for/while)、数组、函数、指针、结构体 - 重点练习:指针与内存的关系、结构体的嵌套使用(课设常用) - 推荐练习:编写小功能(如计算器、成绩转换器) 2. **理解文件操作** - 课设通常需要数据持久化(保存到文件),学习`fopen`、`fread`、`fwrite`、`fclose`等函数。 - 示例:将学生信息写入`student.dat`文件。 3. **掌握动态内存** - 学习`malloc`、`free`实现动态数组或链表(课设常用数据结构)。 --- ### **二、课设选题与规划** 1. **选择经典题目** - 推荐入门题目:学生成绩管理系统、通讯录管理、图书管理系统、简单游戏(如猜数字)。 - 避免过度复杂:初次课设建议控制在300-500行代码内。 2. **功能拆分** - 例如学生管理系统可拆分为: - 输入/输出学生信息 - 按成绩排序 - 文件存储与读取 - 查询/修改/删除功能 3. **画流程图** - 用纸笔或工具(如Draw.io)画出程序逻辑框架,明确各模块关系。 --- ### **三、分模块实现** #### 1. 菜单界面 ```c void show_menu() { printf("1. 添加学生\n"); printf("2. 删除学生\n"); printf("3. 查询成绩\n"); printf("4. 退出系统\n"); } ``` #### 2. 数据结构设计 ```c struct Student { int id; char name[20]; float score; }; ``` #### 3. 核心功能实现(以文件操作为例) ```c void save_to_file(struct Student stu[], int n) { FILE *fp = fopen("data.txt", "w"); for (int i = 0; i < n; i++) { fprintf(fp, "%d %s %.2f\n", stu[i].id, stu[i].name, stu[i].score); } fclose(fp); } ``` --- ### **四、调试与优化** 1. **分模块测试** - 每完成一个功能(如添加学生)立即测试,避免累积错误。 2. **使用调试工具** - 学会用VS Code、Dev-C++的调试功能,或手动添加`printf`输出中间变量。 3. **边界检查** - 测试极端情况:输入非法字符、空文件读取、数据溢出等。 --- ### **五、学习资源推荐** 1. **书籍** - 《C Primer Plus》:适合夯实基础 - 《C和指针》:深入理解指针与内存 2. **实战网站** - 菜鸟教程(C语言部分) - LeetCode简单题(如「两数之和」) 3. **社区** - Stack Overflow(搜索错误信息) - 优快云、知乎(查找课设案例) --- ### **六、注意事项** 1. **代码规范** - 变量命名有意义(如`studentCount`而非`a`) - 添加注释(尤其是复杂逻辑) 2. **避免复制粘贴** - 参考代码可以看,但务必自己手敲理解。 3. **尽早开始** - 课设常见问题:文件读写崩溃、链表指针错误,留足调试时间。 --- 通过以上步骤,你可以逐步完成课设,过程中遇到问题可通过打印变量值、简化代码逻辑定位错误。坚持“小步快跑”,每完成一个功能都会有成就感!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值