C语言求解!!

2025-04-18 15:40:47
推荐回答(4个)
回答1:

学生名字我懒得起,都用“学生名”代替。

学生成绩信息,我放在txt文件中,从文件中读取生成链表,再统计。

txt格式如下:学生名字 空格 学生成绩

#include 
#include 
#include 
typedef struct stus
{
    char name[10];
    int score;
    int num;//统计总节点数,只在头节点中成员保存该值
    struct stus *next;
}STUS;
#define pass 60//及格分
STUS *readFile(FILE *fp);//读取文件,生成链表,返回链表头节点
int findUnpass(STUS *stuHead);//找到不及格,返回不及格人数
int main()
{
    int unPassCnt;
    FILE *fp;
    STUS *stuHead=NULL;
    fp=fopen("c:\\list.txt","rt+");
    if(fp==NULL)
    {
        printf("Cannot open file strike any key exit!");
        return 1;
    }
    stuHead=readFile(fp);
    unPassCnt=findUnpass(stuHead);
    printf("总人数:%d,不及格人数:%d,及格人数:%d\n",stuHead->num,unPassCnt,stuHead->num-unPassCnt);
    return 0;
}
int findUnpass(STUS *stuHead)
{
    int unPassCnt=0;
    printf("不及格的学生有:\n");
    while(stuHead->next!=NULL)
    {
        if(stuHead->next->score        {
            unPassCnt++;
            printf("%s  %d\n",stuHead->next->name,stuHead->next->score);
        }
        stuHead=stuHead->next;
    }
    return unPassCnt;
}
STUS *readFile(FILE *fp)
{
    char name[10];
    int score;
    STUS *stusNew=NULL,*stuHead=NULL,*stuTail=NULL;
    stuHead=(STUS *)malloc(sizeof(STUS));
    stuHead->num=0;
    stuHead->next=NULL;
    while(fscanf(fp,"%s%d",name,&score)!=-1)
    {
        (stuHead->num)++;
        stusNew=(STUS *)malloc(sizeof(STUS));
        strcpy(stusNew->name,name);
        stusNew->score=score;
        stusNew->next=NULL;
        if(stuHead->next==NULL)
            stuHead->next=stusNew;
        else
            stuTail->next=stusNew;
        stuTail=stusNew;
    }
    return stuHead;
}

回答2:

#include 
#define N 200

int main() { 
  
  int arr[N];   
  int i;  
  int s,su=0,so=0;
  do{
    scanf("%d",&s);
  }while(s<0|| s>200);//人数超出或者是负数时,重输

  for(i=0;i    scanf("%d",&arr[i]);//输入数据
  }
  //Bubble(arr,N);
  printf("不合格成绩:\n");
  for(i=0;i    {
      if(arr[i]<60){
        ++su;
        printf("%d ",arr[i]);
      }
    }
      printf("\n合格成绩:\n");
    for(i=0;i    {
      if(arr[i]>=60){
        ++so;
        printf("%d ",arr[i]);
      }
    }
    printf("\n不合格人数:%d, 合格人数%d.\n",su,so);

  }

回答3:

第四题
是因为你在for循环后加了一个
";"即一个空语句,后边输出的内容不在循环体中
%md
m为指定输出字段宽度,如果位数小于m则前补空格,若实际位数大于m则按实际输出。
第五题为死循环吧
main()
{
char
*s={"ABC"};
do{

printf("%d",*s%10);

}while(*++s);
}
这样就行了。
第七题
我的输出的是2。。。
第八题
应该是位运算,不懂就看看谭浩强的书,“c程序设计(第三版)”319页。此0010
0011&0010
0011
其中&是与运算,结果还是0010
0011
即十进制的35。
最后
fun(&a[i]);相当与
fun(a+i);函数调用时,形参a的值为实参的值a+i,这两个a没有什么联系,纯粹迷惑大众的。现在fun函数里的a就是a+i了,a[0]相当于*((a+i)+0),
a[1]相当于是*((a+i)+1),简化一下就是a[i]
=
a[i+1];

回答4: