C语言程序设计,需要包含顺序结构、选择分支结构、循环结构,数组,指针,结构体
#include <stdio.h>
#include <stdlib.h>
struct dice{ //结构体 骰子(实现了6.包含结构体)
int value=0;//筛子值
int faces=0;//筛子面数
};
void set_face(int n,dice d) { //设置骰子面数函数
if (n < 10) //判断 设定值小于十(实现了分支结构)
{
if (n>0) //如果大于0
{
d.faces = n; //骰子面数为设定值
}
else //否则
{
d.faces = 1; //骰子面树为1
}
}
else //大于10
{
d.faces = 10; //骰子面数设置为10
}
}
void roll(dice *d) { //摇骰子函数(实现了4包含一个以上的函数)
int value; //定义一个临时整形值
while (true) //循环 (实现了循环结构)
{
value = rand() % 10; //随机值
if (value <d->faces )//判断值是否小于骰子面数
{
d->value = value+1;//如果小于则为骰子赋值
break;//跳出循环
}
}
}
int main()
{
int result[6];//骰子结果数组(实现了3包含数组)
int* p = result;//创建指针指向result数组(实现了5包含指针)
dice d;//创建骰子
d.faces = 8;//骰子面数赋值
for (int i = 0; i < 6; i++)//摇6次骰子
{
roll(&d);//调用函数摇筛子
*(p+i) = d.value;//通过指针操作将骰子结构赋值于result
}
for (int i = 0; i < 6; i++)//循环遍历result
{
printf("第%d次骰子结果为:%d\n", i+1, p[i]);//打印存储的6次结果
}
scanf_s("按任意键结束");//按任意键结束
}
你这个要求没啥啊。比如定义一个学生成绩结构,简单点,就姓名和成绩两个属性。再定义一个学生数组。定义一个按成绩排序的函数,用指针作为参数,这不都有了么
#include<stdio.h>
#include <stdlib.h>
typedef struct _student
{
int nid; //学号
float score; //成绩
}student;
void fun(student *p,int n)
{
int i,j;
student s;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if((*(p+j)).score < (*(p+j+1)).score)
{
s = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = s;
}
}
}
void main()
{
student stu[10];
int i;
printf("请输入10名学生的学号和成绩:");
for(i=0;i<10;i++)
scanf("%d %f",&stu[i].nid,&stu[i].score);
fun(stu,10);
printf("成绩排名如下:\n");
for(i=0;i<10;i++)
printf("%d %f\n",stu[i].nid,stu[i].score);
}
#include "stdio.h"
#define N 2
struct student{
int id;
char name[20];
int kaoqun;
int biaoxian;
int zuoye;
int biji;
int sum;
}stud[N],t;
int main()
{
int i,j;
for(i=0;i<N;i++){
printf("请输入第%d个学生信息\n",i+1);
scanf("%d %s",&stud[i].id,&stud[i].name);
fflush(stdin);
scanf("%d %d %d %d",&stud[i].kaoqun,&stud[i].biaoxian,&stud[i].zuoye,&stud[i].biji);
stud[i].sum = stud[i].kaoqun*0.3+stud[i].biaoxian*0.3+stud[i].zuoye*0.3+stud[i].biji*0.1;
}
//排序
for (i = 0; i < N - 1; i++){
for (j = 0; j < N - 1 - i; j++){ //按成绩对学生信息进行排序
if (stud[j].sum > stud[j + 1].sum){ //整型数字的比较
t = stud[j];
stud[j] = stud[j + 1];
stud[j + 1] = t;
}
}
}
//打印
printf("学号\t姓名\t考勤\t表现\t作业\t笔记\t总分\t\n");
for (i = 0; i < N; i++){
printf("%d\t", stud[i].id);
printf("%s\t", stud[i].name);
printf("%d\t", stud[i].kaoqun);
printf("%d\t", stud[i].biaoxian);
printf("%d\t", stud[i].zuoye);
printf("%d\t", stud[i].biji);
printf("%d \n", stud[i].sum);
}
return 1;
}
我实在看不下去了,你直接在csdn搜一个c语言案例,或者作业的博客不就有了,这还要花50提问,汗。
1.顺序结构
C语言的顺序结构顾名思义, 就是程序自上而下执行, 没有分支,也没有循环.
#include <stdio.h>
int main(){
int a = 3, b = 2;
int sum = a+b;
printf("a+b=%d\n", sum); //输出a+b的和
return 0;
}
像上述代码, 程序顺序执行求和a+b并输出, 没有循环也没有分支, 所以上述代码就是一个顺序结构.
2.选择(分支)结构
C语言选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。
在C语言中, 选择结构有两种: 1. if-else语句, 2. switch-case语句;
1) if-else 语句
写法:
if(条件1){
//满足条件1执行此代码块
...
}else if(条件2){
//不满足条件1, 满足条件2执行此代码块
...
}else{
//即不满足条件1也不满足条件2 执行此代码块
...
}
举个栗子, 成绩评级.
#include <stdio.h>
int main(){
int score = 78; //模拟输入成绩
if (score >= 90){ //成绩 大于90 A
printf("A");
}else if(score >= 80 && score < 90){ // 80-89 B
printf("B");
}else if(score >= 70 && score < 80){ // 70-79 C
printf("C");
}else if(score >= 60 && score < 70){ // 60-69 D
printf("D");
}else{ //小于60 E
printf("E");
}
return 0;
}
else if 可以有0个或多个, else 只能有0个或1个.
如果我们只需判断学生是否及各, 那么我们就可以这样写:
if (score >= 60){
printf("及格");
}else{
printf("不及格");
}
当然也可以只有if() 没有else , 只有if() 和 else if ()没有else.
2)switch-case 语句
在C语言中, 第二种分支结构就是switch-case, 只是用的地方不太多, 因为if语句可以轻松替代switch语句, 只是结构上没switch那么清晰.
语法:
switch (变量或表达式){
case 常量表达式1: 语句块1; break;
case 常量表达式2: 语句块2; break;
......
case 常量表达式n: 语句块n; break;
default: 语句块n+1; break;
}
还是成绩评级的栗子:
#include <stdio.h>
int main(){
int score = 78; //模拟输入
switch(score / 10){ //case匹配的数据就是score/10的结果
case 10:
case 9: printf("A"); break;
case 8: printf("B"); break;
case 7: printf("C"); break;
case 6: printf("D"); break;
default: printf("E"); break;
}
return 0;
}
score/10 得到的整数就是那个阶段的成绩, 我们会发现case 10: 也就是100分匹配后面没有任何的操作, 最主要的是, 没有break;
在switch语句中, 如果case匹配到了语句, 那么后面的语句都会执行知道出现第一个break, 或者执行完成.
如果我们将上面代码中的break全部去掉.score还是78, 那么输出就会变成 CDE, 也就是匹配到7 然后输出7之后的所有语句,知道碰到break;
default相当于else, 其他所有不匹配的情况, 因为一般是放在最下面, 所以default后面的break可以不写.
重点:switch的条件只能是整型和字符型(其实就是字符的ascii码)或者这些类型的表达式,case匹配的只能是整型或者字符型常量或者这两个类型的常量表达式, 也就是case不能匹配变量.
3.循环结构
循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。
在C语言中有三种循环结构: for循环, while循环, do-while循环.
1) for循环
写法:
for(表达式1; 表达式2; 表达式3){
循环体;
}
语句1:初值表达式,常用于在循环开始前为循环变量赋初值
语句2:循环控制逻辑表达式,控制循环执行和结束的条件
语句3:循环变量修改表达式,常用于修改循环变量,使得结果趋向于循环结束条件.
举个栗子:
循环输出10个"hello world!!!"
#include <stdio.h>
int main(){
int i;
for (i = 1; i <= 10; i++){ //循环10次, i++为 i自增长1
printf("hello world!!!\n");
}
return 0;
}
上诉for循环的执行过程:
1.执行表达式1, i = 1, 只执行一遍.
2. 执行表达式2, 判断 i <=10
3.如果表达式2成立, 执行循环体 { printf("hello world!!!\n"); } 否则执行退出循环, 后续步骤都不执行.
4.执行完成循环体后,执行表达式3, i++, i的值自动增长1. 回到步骤2去判断.
for循环中的三个表达式都可以为空, 但是一定要写两个分号也就是 for( ; ; ) 这样就代表无限循环, 也就是死循环.不过一般不会这样用.
而for循环常用的是对数组的操作,所以初始值一般是0.
int i;
int Stu[10] = {99, 87, 76, 59, 73, 45, 99, 39, 88, 19}; //班级10个学生的成绩
for(i = 0; i < 10; i++){ //循环10次, 0~9
printf("学号为:%d, 成绩为: %d\n", i+1, Stu[i]); //数组下标从0开始
}
其实可以发现, 正常的for循环可以很清晰的明白for循环的循环次数.
所以在你很清晰明白这次循环需要循环多少次的时候推荐使用for循环.
2) while 循环
while循环的语法简单易懂
while(表达式){
语句块
}
执行过程: 执行表达式, 如果成立执行语句块, 否则退出循环.
while循环也可以和for循环互换.
//for -> while
int i = 0;
while (i < 10){
//循环体
i++;
}
//while -> for
for (;l < r;){
}
for->while: 没有for循环那么清晰明了的知道循环次数.
while->for: 没有while循环那么简单易懂了.
所以while循环的一般用法是我们不太清楚循环在什么时候结束, 并且我们也不关心具体的循环次数的时候使用.
举个例子: 二分查找
#include <stdio.h>
int main(){
int a[10] = {12, 32, 34, 55, 76, 89, 99, 123, 345, 1234}; //递增的数组
int l = 0, r = 9, mid;
int res = 345; //查
简易学生成绩管理系统,代码如下:
#include <stdio.h>
#define NN 10
struct Student
{
int nmb;
char name[20];
int score[3];
};
//录入数据
void inputinfo(struct Student a[])
{
int i;
printf("输入%d个学生的学号,姓名,三门课的成绩:\n",NN);
for (i = 0;i< NN;i++)
{
scanf("%d %s %d %d %d",&a[i].nmb,a[i].name,&a[i].score[0],&a[i].score[1],&a[i].score[2]);
}
}
//科目成绩最高的学生信息
void maxinfo(struct Student a[])
{
int i;
int max1,max2,max3;
int index1 = 0,index2 = 0,index3 = 0;
max1 = a[0].score[0];
max2 = a[0].score[1];
max3 = a[0].score[2];
for (i = 1;i<NN;i++)
{
if (a[i].score[0] > max1)
{
max1 = a[i].score[0];
index1 = i;
}
if (a[i].score[1] > max2)
{
max2 = a[i].score[1];
index2 = i;
}
if (a[i].score[2] > max3)
{
max3 = a[i].score[2];
index3 = i;
}
}
printf("科目1成绩最高的学生:%d\t%s\t%d\n",a[index1].nmb,a[index1].name,a[index1].score[0]);
printf("科目2成绩最高的学生:%d\t%s\t%d\n",a[index2].nmb,a[index2].name,a[index2].score[1]);
printf("科目3成绩最高的学生:%d\t%s\t%d\n",a[index3].nmb,a[index3].name,a[index3].score[2]);
}
//平均成绩最高的学生信息
void avginfo(struct Student a[],float* arrav)
{
int i = 0;
float avg = 0.0;
float maxavg = (a[0].score[0] + a[0].score[1]+a[0].score[2])/3.0;
int index =0;
*arrav = maxavg;
for (i = 1;i<NN;i++)
{
avg = (a[i].score[0] + a[i].score[1]+a[i].score[2])/3.0;
*(arrav+i) = avg;
if (avg > maxavg)
{
maxavg = avg;
index = i;
}
}
printf("平均分最高的学生:%d\t%s\t%.2f\n",a[index].nmb,a[index].name,maxavg);
}
//按平均分从高到低排序
void Sort(struct Student a[])
{
int i,j;
float avg1,avg2;
struct Student tmp;
for (i = 0;i< NN-1;i++)
{
for (j = 0;j< NN-1-i;j++)
{
avg1 = (a[j].score[0] + a[j].score[1]+a[j].score[2])/3.0;
avg2 = (a[j+1].score[0] + a[j+1].score[1]+a[j+1].score[2])/3.0;
if(avg1 < avg2)
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
printf("number name math Chinese English average\n");
for (i = 0;i<10;i++)
{
avg1 = (a[i].score[0] + a[i].score[1]+a[i].score[2])/3.0;
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",a[i].nmb,a[i].name,a[i].score[0],a[i].score[1],a[i].score[2],avg1);
}
}
int main()
{
struct Student a[NN];
float avg[NN];
float* p = avg;
int i;
inputinfo(a);
maxinfo(a);
avginfo(a,p);
printf("所有学生的平均成绩为:");
for (i=0;i<NN;i++)
{
printf("%.2f ",*(p+i));
}
printf("\n");
Sort(a);
return 0;
}
运行效果图: