《高级语言程序设计》大作业
编程题(5题,每题20分)
1、 输入任意的3个整数,判断这3个数是否可以构成三角形,若能,可以构成等腰三角形、等边三角形还是其他三角形。
思路
直接列出每种三角形的特征 符合就直接打印 不符合就输出其他三角形
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if((a+b>c&&a+c>b&&b+c>a)&&(a>b-c&&b>a-c&&c>a-b))
{
if(a==b&&a==c)
printf("等边三角形\n");
else if((a==b&&a!=c)||(a==c&&a!=b)||(b==c&&b!=a))
printf("等腰三角形\n");
else if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a)
printf("直角三角形\n");
else
printf("其他三角形\n");
}
else
printf("不能构成三角形\n");
return 0;
}
2、用函数实现判断素数,在主函数中调用该函数实现输出200~300间的所有素数。要求每行显示5个数。
素数是指除了一以外 只能被 1 和它本身整除的数
那么找到这些数就只需要用这个数去一次除以前面所有的2到它本身的数 如果没有一个数能整除 那么就能知道这个数是质数 如果出现了整除 那么就说明是合数
然后可以对代码做出一些优化
首先一次除以的数不需要到本身 只需要到sqrt(n) 就可以找到所有的能够验证素数的数, 那么就很大程度的减少了枚举的次数
#include<iostream> //普通筛
using namespace std;
int zhishu(int n)
{
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
return 0;
}
return 1;
}
int main()
{
int a[100], cnt=0;
for (int i = 100; i <= 300; i++)
{
if (zhishu(i))
a[cnt++] = i;
}
for (int i = 0; i < cnt; i++)
{
cout << a[i] << ' ';
if ((i+1) % 5 == 0)
cout << endl;
}
return 0;
}
3、键盘输入一个字符串,编程找出字符串中(不包括’\0’)最大的字符及其下标、最小的字符及其下标。
思路
字符之间是可以直接进行比较的,用这个特性就可以直接进行枚举判断, 遍历一遍就可以找到最大的和最小的 以及他们的坐标
#include<stdio.h>
int main()
{
char str[200];
scanf("%s",str);
char min,max;
int minid,maxid;
int i=0;
min=max=str[0];
maxid=minid=0;
while(str[i]!='\0')
{
if (str[i]>max)
{
max=str[i];
}
if (str[i]<min)
{
min=str[i];
minid=i;
}
i++;
}
i=0;
while(str[i]!='\0')
{
if (str[i]==max)
{
printf("最大元素是%c 位置%d\n",max,i);
}
if (str[i]==min)
{
printf("最小元素是%c 位置%d\n",min,i);
}
i++;
}
return 0;
}
4、键盘输入一串字符,以‘#’结束,并将输入的字符写到D盘的a.txt文件中。再打开该文件,只将其中的字母输出到屏幕上。
#define _CRT_SECURE_NO_DEPRECATE//vs需要
#include<stdio.h>
#include<stdlib.h>
void writefile(int ch, FILE *fp);
void readfile(int ch, FILE *fp);
int main()
{
FILE *fp; //首先定义文件指针
char ch = 0;
fp = fopen("D:\\a.txt", "w+");//打开文件,w+表示既可以读取也可以写入
if (fp == 0) //文件打开后需判断是否正确
{
printf("错误\n");
exit(1);
}
writefile(ch, fp);//写
rewind(fp);//rewind函数,把指针移到文件头
readfile(ch, fp);//读
fclose(fp);//关闭
return 0;
}
void writefile(int ch, FILE *fp)
{
printf("Enter a text (end with '#'):\n");
ch = getchar();
while (ch != '#')
{
fputc(ch, fp);
ch = getchar();
}
}
void readfile(int ch, FILE *fp)
{
while ((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
putchar('\n');
}
5、定义一个存放课程信息的结构体数组,数组实际大小由用户指定。每门课程的信息包括课程号、课程名称、学分。输入课程信息,并按学分降序排序,输出排序后的课程信息以及学分最高的课程信息(可能不止一门)。
#include<stdio.h>
#include <cstdlib>
struct student
{
char sno[20];
char name[20];
int score;
}s[5];
void input()
{
int i, j;
for (i = 0; i < 5; i++)
{
printf("输入课程号:");
scanf("%s", &s[i].sno);
printf("输入课程名称:");
scanf("%s", &s[i].name);
printf("输入学分:");
scanf("%d", &s[i].score);
printf("\n");
}
}
int sort(int n)
{
int i, j;
for (i = 0; i < n; i++)//排序
{
for (j = 0; j + i < n - 1; j++)
{
if (s[j].score < s[j + 1].score)
{
struct student t;
t = s[j];
s[j] = s[j + 1];
s[j + 1] = t;
}
}
}
for (i = 0; i < 5; i++) {
printf("课程号\t课程名称\t学分\n");
printf("%s\t%s\t%d\n", s[i].sno, s[i].name, s[i].score);
}
}
void output(int n) {
int i;
for (i = 0; i < n; i++) {
printf("课程号\t 课程名称\t学分\n");
printf("%s\t%s\t%d\n", s[i].sno, s[i].name, s[i].score);
}
}
void outputMax(int n) {
int i;
for (i = 0; i < n; i++) {
printf("课程信息以及学分最高的课程信息:课程号\t 课程名称\t学分\n");
printf("%s\t%s\t%d\n", s[i].sno, s[i].name, s[i].score);
if (s[i].score != s[i+1].score)
break;
}
}
void query(int n)
{
int i;
char sno1[20];
printf("请输入课程号:");
scanf("%s", &sno1);
for (i = 0; i < n; i++)//排序
{
if (sno1 == s[i].sno) {
printf("%s\t%s\t%d\n", s[i].sno, s[i].name, s[i].score);
}
}
}
int main()
{
int n = 5;
printf("菜单界面:\n");
printf("1表示输入5门课程:\n");
printf("2表示输出5门课程:\n");
printf("3表示对5门课程按学分排序:\n");
printf("4表示输出5门课程查询:\n");
printf("5输出最高学分的课程:\n");
printf("6表示结束返回:\n");
printf("请输入编号:\n");
while (true) {
int a;
scanf("%d", &a);
switch (a) {
case 1:
input();
break;
case 2:
output(n);
break;
case 3:
sort(n);
break;
case 4:
query(n);
break;
case 5:
outputMax(n);
case 6:
return 0;
default:
exit;
}
}
}